class AppBase::ModelConcern::ModelConcernHelper

Public Class Methods

new(model) click to toggle source
# File lib/appbase/model_concern.rb, line 111
def initialize(model)
  @model = model
end

Private Class Methods

[](model) click to toggle source
# File lib/appbase/model_concern.rb, line 117
def [](model)
  raise "Invalid model" if model.class != Class
  helpers[model] ||= ModelConcernHelper.new(model)
end
helpers() click to toggle source
# File lib/appbase/model_concern.rb, line 123
def helpers
  @helpers ||= {}
end

Public Instance Methods

crud_allow(crud, criteria=:mine, &block) click to toggle source
# File lib/appbase/model_concern.rb, line 80
def crud_allow(crud, criteria=:mine, &block)
  validate_crud crud
  
  if criteria == :mine
    allow_mine crud
  else
    key = crud == :query ? :within : :if
    if criteria.instance_of? Hash
      allow_criteria_with_method_alias(crud, criteria[key])
    else
      show_usage(crud) if criteria != key || !block_given?
      allow_criteria_with_block(crud, block)
    end
  end
  AppBase::Registry.register_crud @model, crud
end
symbol_array_manipulate(op, source, options) click to toggle source
# File lib/appbase/model_concern.rb, line 97
def symbol_array_manipulate(op, source, options)
  raise InvalidUsage if op != :only && op != :except
  if options.has_key? op
    operands = options[op]
    operands = [operands] if operands.instance_of?(String) || operands.instance_of?(Symbol)
    raise InvalidUsage unless operands.instance_of?(Array)
    operands = operands.map {|c|c.to_sym}
    source.send({ only: '&', except: "-" }[op], operands)
  else
    source
  end
end

Private Instance Methods

allow_criteria_with_block(crud, block) click to toggle source
# File lib/appbase/model_concern.rb, line 57
def allow_criteria_with_block(crud, block)
  show_usage(crud) if crud == :query && block.parameters.count != 1
  show_usage(crud) if crud != :query && block.parameters.count != 2
  model_inject crud == :query ? :accessible_by : "allow_#{crud}", &block
end
allow_criteria_with_method_alias(crud, method_name) click to toggle source
# File lib/appbase/model_concern.rb, line 63
def allow_criteria_with_method_alias(crud, method_name)
  show_usage(crud) if method_name.nil? || !method_name.instance_of?(Symbol)
  model_inject do |user_identity_attr|
    crud == :query ? %-
      def self.accessible_by(user)
        #{@model.name}.#{method_name} user
      end
    - : %-
      def self.allow_#{crud}?(user, obj)
        #{@model.name}.#{method_name} user, obj
      end
    -
  end
end
allow_mine(crud) click to toggle source
# File lib/appbase/model_concern.rb, line 43
def allow_mine(crud)
  model_inject do |user_identity_attr|
    crud == :query ? %-
      def self.accessible_by(user)
        #{@model.name}.where(:#{user_identity_attr} => user.id)
      end
    - : %-
      def self.allow_#{crud}?(user, obj)
        user.id == obj.#{user_identity_attr}
      end
    -
  end
end
model_inject(method_name=nil, &block) click to toggle source
# File lib/appbase/model_concern.rb, line 20
def model_inject(method_name=nil, &block)
  AppBase::Engine.after_initialized do
    user_identity_attr = "#{AppBase::Engine::UserIdentity.underscore}_id"
    if method_name.nil?
      method_body = block.call(user_identity_attr)
      @model.class_eval method_body
    else
      @model.define_singleton_method method_name.to_sym, &block
    end
  end
end
show_usage(crud) click to toggle source
# File lib/appbase/model_concern.rb, line 32
def show_usage(crud)
  raise %-
    allow_#{crud} usage:
      allow_#{crud} :mine
      allow_#{crud} :#{ crud == :query ? 'within' : 'if' } => :a_singleton_method
      allow_#{crud} :#{ crud == :query ? 'within' : 'if' } do |current_user_identity#{ crud == :query ? '' : ', model_instance' }|
        # #{ crud == :query ? 'return fitlered query, e.g. Note.where(:user_id => current_user_identity.id)' : 'return true if allowed' }
      end
  -
end
validate_crud(crud) click to toggle source
# File lib/appbase/model_concern.rb, line 14
def validate_crud(crud)
  if [:create, :update, :delete, :query].index(crud).nil?
    raise "Unsupported crud operation: #{crud}, available options: create, update, delete, query"
  end
end