# 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