discourse/app/services/user_updater.rb
Nick Borromeo e8474bd725 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.
2014-01-20 18:07:47 -08:00

70 lines
1.6 KiB
Ruby

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.fetch(:website) { user.website })
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
end
if attributes[:new_topic_duration_minutes]
user.new_topic_duration_minutes = attributes[:new_topic_duration_minutes].to_i
end
if guardian.can_grant_title?(user)
user.title = attributes.fetch(:title) { user.title }
end
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
end
user.save
end
private
attr_reader :user, :guardian
def format_url(website)
if website =~ /^http/
website
else
"http://#{website}"
end
end
end