# frozen_string_literal: true class User < ApplicationRecord # == Attributes ===================================== alias_attribute :avatar, :email <%- unless options[:skip_mailer] -%> def devise_mailer DeviseMailer end <%- end -%> <%- if options[:encrypt] -%> # Encrypted user attributes encrypts :email blind_index :email <%- end -%> def self.policy_class UserPolicy end # == Constants ===================================== enum role: { superuser: 0, staff: 1, user: 2, visitor: 3 } # enum role: { superuser: 'superuser', staff: 'staff', user: 'user', visitor: 'visitor' } # == Extensions ==================================== # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :secure_validatable, :lockable, :timeoutable, :trackable, email_validation: false # Since we are using valid_email validator for a stricter email validator # https://github.com/micke/valid_email2/issues/121 # == Relationships ================================= <%- if options[:database] == 'sqlserver' -%> has_many :login_activities, as: :user, dependent: :delete_all, inverse_of: :user # devise audit log <%- else -%> has_many :login_activities, -> { order(created_at: :desc) }, as: :user, dependent: :delete_all, inverse_of: :user # devise audit log <%- end -%> # == Validations =================================== # minimum length of 5 to match: a@a.a validates :email, presence: true, 'valid_email_2/email': { disposable: false }, length: { minimum: 5, maximum: 255 }, uniqueness: { case_sensitive: false }, allow_nil: false validates :role, presence: true, inclusion: { in: roles.keys }, allow_nil: false # == Scopes ======================================== # == Callbacks ===================================== # Before any validations ensure a default role is set before_validation do self.role ||= :user end # == Class Methods ================================= def admin? role?(:superuser) end def staff? role?(:staff) end def staff_member? role?(:superuser) || role?(:staff) end def role?(role) self.role == role.to_s end # == Instance Methods ============================== end