class ClerkRails::Engine

Constants

API

Public Class Methods

clerk(association_name, permissions: []) click to toggle source
# File lib/clerk_rails/engine.rb, line 57
def self.clerk(association_name, permissions: [])
  plural_role = association_name.to_s.pluralize.to_sym
  singular_role = association_name.to_s.singularize.to_sym

  roles_association = :"clerk_roles_#{association_name}"

  remote_class = self.name

  unless self.respond_to? :clerk_roles
    self.class_eval do 
      include ClerkRails::Clerked
    end
  end

  has_many roles_association, 
    ->{ where(scope_class: remote_class, name: singular_role) }, 
    class_name: "Clerk::Role", 
    foreign_key: :scope_id

  plural_role = association_name.to_s.pluralize.to_sym
  singular_role = association_name.to_s.singularize.to_sym

  account_accessor = self.name.underscore.pluralize.to_sym

  # Add clerk permissions to `self` the associated class
  self.clerk_permissions_map[singular_role] = permissions

  # Add magic methods to Clerk::Acount
  Clerk::Account.class_eval do
    define_method account_accessor do
      self.class::RolesWrapper.new(self, account_accessor)
    end

    define_method :"is_#{singular_role}?" do |*args|
      has_role?(singular_role, *args)
    end

    permissions.each do |permission|
      define_method :"can_#{permission}?" do |*args|
        has_permission?(permission, *args)
      end
    end                        
  end
  
  [
    association_name.to_sym,
    through: roles_association, 
    source: :account
  ]
end