55 lines
852 B
Ruby
55 lines
852 B
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
|
||
|
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
|