From 56ae78f96377b3e29d1de2c6fbbda8e17915b3eb Mon Sep 17 00:00:00 2001 From: r888888888 Date: Wed, 5 Mar 2014 17:44:07 -0800 Subject: [PATCH] refactored user promotion code, related to #1257 --- app/controllers/admin/users_controller.rb | 13 ------ app/logical/user_promotion.rb | 52 +++++++++++++++++++++++ app/models/user.rb | 23 +++------- 3 files changed, 58 insertions(+), 30 deletions(-) create mode 100644 app/logical/user_promotion.rb diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index b19f11142..fdb721cd4 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -9,21 +9,8 @@ module Admin def update @user = User.find(params[:id]) - sanitize_params! @user.promote_to!(params[:user][:level]) redirect_to edit_admin_user_path(@user), :notice => "User updated" end - - protected - def sanitize_params! - # admins can do anything - return if CurrentUser.is_admin? - - # can't promote/demote moderators - raise User::PrivilegeError if @user.is_moderator? - - # can't promote to admin - raise User::PrivilegeError if params[:user] && params[:user][:level].to_i >= User::Levels::ADMIN - end end end diff --git a/app/logical/user_promotion.rb b/app/logical/user_promotion.rb new file mode 100644 index 000000000..a37ad1a33 --- /dev/null +++ b/app/logical/user_promotion.rb @@ -0,0 +1,52 @@ +class UserPromotion + attr_reader :user, :promoter, :new_level + + def initialize(user, promoter, new_level) + @user = user + @promoter = promoter + @new_level = new_level + end + + def promote! + user.level = new_level + user.inviter_id = promoter.id + + validate + create_transaction_log_item + create_user_feedback + + user.save + end + +private + + def validate + # admins can do anything + return if promoter.is_admin? + + # can't promote/demote moderators + raise User::PrivilegeError if user.is_moderator? + + # can't promote to admin + raise User::PrivilegeError if new_level.to_i >= User::Levels::ADMIN + end + + def create_transaction_log_item + TransactionLogItem.record_account_upgrade(user) + end + + def create_user_feedback + if user.level > user.level_was + body_prefix = "Promoted" + elsif user.level < user.level_was + body_prefix = "Demoted" + else + body_prefix = "Updated" + end + + user.feedback.create( + :category => "neutral", + :body => "#{body_prefix} by #{promoter.name} from #{user.level_string_was} to #{user.level_string}" + ) + end +end diff --git a/app/models/user.rb b/app/models/user.rb index 1957b04a0..99b181b48 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -243,22 +243,7 @@ class User < ActiveRecord::Base end def promote_to!(new_level) - self.level = new_level - self.inviter_id = CurrentUser.user.id - TransactionLogItem.record_account_upgrade(self) - if level > level_was - body_prefix = "Promoted" - elsif level < level_was - body_prefix = "Demoted" - else - body_prefix = "" - end - - feedback.create( - :category => "neutral", - :body => "#{body_prefix} by #{inviter.name} from #{level_string(level_was)} to #{level_string(level)}" - ) - save + UserPromotion.new(self, CurrentUser.user, new_level).promote! end def promote_to_admin_if_first_user @@ -296,6 +281,10 @@ class User < ActiveRecord::Base end end + def level_string_was + level_string(level_was) + end + def level_string(value = nil) case (value || level) when Levels::BLOCKED @@ -372,7 +361,7 @@ class User < ActiveRecord::Base def create_mod_action if level_changed? - ModAction.create(:description => %{"#{name}":/users/#{id} level changed #{level_string(level_was)} -> #{level_string}}) + ModAction.create(:description => %{"#{name}":/users/#{id} level changed #{level_string_was} -> #{level_string}}) end end