Feedbacks already keep track of who created them so it doesn't need to be in the body too
80 lines
1.7 KiB
Ruby
80 lines
1.7 KiB
Ruby
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!
|
|
validate
|
|
|
|
user.level = new_level
|
|
user.inviter_id = promoter.id
|
|
|
|
create_transaction_log_item
|
|
create_user_feedback
|
|
create_dmail
|
|
|
|
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} from #{user.level_string_was} to #{user.level_string}",
|
|
:disable_dmail_notification => true
|
|
)
|
|
end
|
|
|
|
def create_dmail
|
|
if user.level >= user.level_was
|
|
create_promotion_dmail
|
|
else
|
|
create_demotion_dmail
|
|
end
|
|
end
|
|
|
|
def create_promotion_dmail
|
|
Dmail.create_split(
|
|
:to_id => user.id,
|
|
:title => "You have been promoted",
|
|
:body => "You have been promoted to a #{user.level_string} level account."
|
|
)
|
|
end
|
|
|
|
def create_demotion_dmail
|
|
Dmail.create_split(
|
|
:to_id => user.id,
|
|
:title => "You have been demoted",
|
|
:body => "You have been demoted to a #{user.level_string} level account."
|
|
)
|
|
end
|
|
end
|