cortex-cms/cortex

View on GitHub
app/models/cortex/user.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'digest/md5'

module Cortex
  class User < Cortex::ApplicationRecord
    include HasGravatar
    include HasFirstnameLastname

    # Include default devise modules. Others available are:
    # :confirmable, :lockable, :timeoutable and :omniauthable
    devise :database_authenticatable, :rememberable, :trackable, :validatable, :recoverable
    rolify role_join_table_name: :roles_users # rolify doesn't obey lexical order for join table names

    has_and_belongs_to_many :tenants
    belongs_to :active_tenant, class_name: 'Tenant', optional: true
    has_many :content_items

    validates_presence_of :email, :firstname, :lastname

    before_destroy :prevent_consumed_deletion

    def active_tenant
      super || tenants.order(:name).first
    end

    def referenced?
      [ContentItem].find do |resource|
        true if resource.where(user: self).count > 0
      end
    end

    def anonymous?
      self.id == nil
    end

    def has_permission?(resource, permission)
      return true if self.is_superadmin?

      resource_class = resource.class
      allowed_perms = allowed_permissions(resource_class, permission)

      if resource_class == Cortex::ContentType
        allowed_perms.select { |perm| perm.resource_id == resource.id }.any?
      else
        allowed_perms.any?
      end
    end

    def gravatar
      "//www.gravatar.com/avatar/#{Digest::MD5.hexdigest email}"
    end

    def tenants_with_children
      tenants.flat_map(&:self_and_descendants)
    end

    private

    def allowed_permissions(resource_class, permission)
      permissions.select { |perm| perm.resource_type == resource_class.to_s && perm.name == permission }
    end

    def prevent_consumed_deletion
      raise Cortex::Exceptions::ResourceConsumed if referenced?
    end

    class << self
      def authenticate(username, password)
        user = User.find_by_email(username)
        user && user.valid_password?(password) ? user : nil
      end

      def anonymous
        User.new
      end
    end
  end
end