otwarchive-symphonyarchive/app/models/user_manager.rb

135 lines
3 KiB
Ruby
Raw Normal View History

2026-03-11 22:22:11 +00:00
# Allows admins to manage user status via the admin users interface
class UserManager
attr_reader :admin,
:user,
:admin_note,
:admin_action,
:suspension_length,
:errors,
:successes
PERMITTED_ACTIONS = %w[note warn suspend unsuspend ban unban spamban].freeze
def initialize(admin, user, params)
@admin = admin
@user = user
@admin_note = params[:admin_note]
@admin_action = params[:admin_action]
@suspension_length = params[:suspend_days]
@errors = []
@successes = []
end
def save
validate_user_and_admin &&
validate_orphan_account &&
validate_admin_note &&
validate_suspension &&
save_admin_action
end
def success_message
successes.join(" ")
end
def error_message
errors.join(" ")
end
private
def validate_user_and_admin
if user && admin
true
else
errors << "Must have a valid user and admin account to proceed."
false
end
end
def validate_orphan_account
if user == User.orphan_account
errors << "orphan_account cannot be warned, suspended, or banned."
false
else
true
end
end
def validate_admin_note
return true if admin_note.present? || admin_action.blank?
if admin_action == "spamban"
@admin_note = "Banned for spam"
elsif admin_action.present?
errors << "You must include notes in order to perform this action."
false
end
end
def validate_suspension
if admin_action == "suspend" && suspension_length.blank?
errors << "Please enter the number of days for which the user should be suspended."
false
else
true
end
end
def save_admin_action
return true if admin_action.blank?
send("#{admin_action}_user") if PERMITTED_ACTIONS.include?(admin_action)
end
def note_user
log_action(ArchiveConfig.ACTION_NOTE)
successes << "Note was recorded."
end
def warn_user
log_action(ArchiveConfig.ACTION_WARN)
successes << "Warning was recorded."
end
def suspend_user
user.suspended = true
user.suspended_until = suspension_length.to_i.days.from_now
user.save!
log_action(ArchiveConfig.ACTION_SUSPEND, enddate: user.suspended_until)
successes << "User has been temporarily suspended."
end
def unsuspend_user
user.suspended = false
user.suspended_until = nil
user.save!
log_action(ArchiveConfig.ACTION_UNSUSPEND)
successes << "Suspension has been lifted."
end
def ban_user
user.banned = true
user.save!
log_action(ArchiveConfig.ACTION_BAN)
successes << "User has been permanently suspended."
end
alias spamban_user ban_user
def unban_user
user.banned = false
user.save!
log_action(ArchiveConfig.ACTION_UNSUSPEND)
successes << "Suspension has been lifted."
end
def log_action(message, options = {})
options.merge!(
action: message,
note: admin_note,
admin_id: admin.id
)
user.create_log_item(options)
end
end