18F/identity-dashboard

View on GitHub
app/services/make_admin.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# MakeAdmin designed to be invoked from a rake task
# as such, uses puts() instead of logger
# rubocop:disable Rails/Output
class MakeAdmin
  USAGE_WARNING = <<-WARN.strip.freeze
    WARNING: Running this task without USER argument is a noop
    Usage: rake users:make_admin USER=first.last@email.com,First,Last
  WARN

  attr_reader :email, :first_name, :last_name

  def initialize(user_info)
    @email, @first_name, @last_name = user_info&.split(',') || []
  end

  def call
    raise(USAGE_WARNING) if user_info_invalid?
    return puts("INFO: User \"#{email}\" already has admin privileges.") if admin.admin?
    make_admin
    puts "SUCCESS: Promoted \"#{email}\" to admin."
  end

  private

  def user_info_invalid?
    [
      email,
      first_name,
      last_name,
    ].map(&:blank?).include?(true)
  end

  def admin
    @admin ||= begin
      new_user_warning = "INFO: User \"#{email}\" not found; creating a new User."
      schrodingers_admin = User.find_or_initialize_by(email: email)
      puts new_user_warning unless schrodingers_admin.persisted?
      schrodingers_admin
    end
  end

  def make_admin
    admin.first_name = first_name
    admin.last_name  = last_name
    admin.admin      = true
    admin.save!
  end
end
# rubocop:enable Rails/Output