69 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module UserRoles
 | 
						|
  extend ActiveSupport::Concern
 | 
						|
 | 
						|
  included do
 | 
						|
    scope :admins, -> { where(admin: true) }
 | 
						|
    scope :moderators, -> { where(moderator: true) }
 | 
						|
    scope :staff, -> { admins.or(moderators) }
 | 
						|
  end
 | 
						|
 | 
						|
  def staff?
 | 
						|
    admin? || moderator?
 | 
						|
  end
 | 
						|
 | 
						|
  def role=(value)
 | 
						|
    case value
 | 
						|
    when 'admin'
 | 
						|
      self.admin     = true
 | 
						|
      self.moderator = false
 | 
						|
    when 'moderator'
 | 
						|
      self.admin     = false
 | 
						|
      self.moderator = true
 | 
						|
    else
 | 
						|
      self.admin     = false
 | 
						|
      self.moderator = false
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def role
 | 
						|
    if admin?
 | 
						|
      'admin'
 | 
						|
    elsif moderator?
 | 
						|
      'moderator'
 | 
						|
    else
 | 
						|
      'user'
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def role?(role)
 | 
						|
    case role
 | 
						|
    when 'user'
 | 
						|
      true
 | 
						|
    when 'moderator'
 | 
						|
      staff?
 | 
						|
    when 'admin'
 | 
						|
      admin?
 | 
						|
    else
 | 
						|
      false
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def promote!
 | 
						|
    if moderator?
 | 
						|
      update!(moderator: false, admin: true)
 | 
						|
    elsif !admin?
 | 
						|
      update!(moderator: true)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def demote!
 | 
						|
    if admin?
 | 
						|
      update!(admin: false, moderator: true)
 | 
						|
    elsif moderator?
 | 
						|
      update!(moderator: false)
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |