Change user update to use #fetch for defaults

This changes the use of the || operator when setting the default of the
user attribute if the key does not exist to #fetch. This will make sure
that if false is passed in as the value it will still fail and use the
default setting.

This also adds constants to define and array and a hash of symbols which
is iterated over to set the users attributes.
This commit is contained in:
Nick Borromeo 2014-01-20 14:58:02 -08:00
parent 60a3641cc5
commit e8474bd725
1 changed files with 30 additions and 27 deletions

View File

@ -1,27 +1,33 @@
class UserUpdater
CATEGORY_IDS = {
watched_category_ids: :watching,
tracked_category_ids: :tracking,
muted_category_ids: :muted
}
USER_ATTR = [
:email_digests,
:email_always,
:email_direct,
:email_private_messages,
:external_links_in_new_tab,
:enable_quoting,
:dynamic_favicon,
:watch_new_topics
]
def initialize(actor, user)
@user = user
@guardian = Guardian.new(actor)
end
def update(attributes = {})
user.website = format_url(attributes[:website]) || user.website
user.website = format_url(attributes.fetch(:website) { user.website })
user.bio_raw = attributes[:bio_raw] || user.bio_raw
user.name = attributes[:name] || user.name
user.digest_after_days = attributes[:digest_after_days] || user.digest_after_days
if ids = attributes[:watched_category_ids]
CategoryUser.batch_set(user, :watching, ids)
end
if ids = attributes[:tracked_category_ids]
CategoryUser.batch_set(user, :tracking, ids)
end
if ids = attributes[:muted_category_ids]
CategoryUser.batch_set(user, :muted, ids)
end
user.bio_raw = attributes.fetch(:bio_raw) { user.bio_raw }
user.name = attributes.fetch(:name) { user.name }
user.digest_after_days = attributes.fetch(:digest_after_days) { user.digest_after_days }
if attributes[:auto_track_topics_after_msecs]
user.auto_track_topics_after_msecs = attributes[:auto_track_topics_after_msecs].to_i
@ -32,19 +38,16 @@ class UserUpdater
end
if guardian.can_grant_title?(user)
user.title = attributes[:title] || user.title
user.title = attributes.fetch(:title) { user.title }
end
[
:email_digests,
:email_always,
:email_direct,
:email_private_messages,
:external_links_in_new_tab,
:enable_quoting,
:dynamic_favicon,
:watch_new_topics
].each do |attribute|
CATEGORY_IDS.each do |attribute, level|
if ids = attributes[attribute]
CategoryUser.batch_set(user, level, ids)
end
end
USER_ATTR.each do |attribute|
if attributes[attribute].present?
user.send("#{attribute.to_s}=", attributes[attribute] == 'true')
end