module ErpTechSvcs::Utils::CompassAccessNegotiator

Public Instance Methods

has_capability?(capability_type_iid, klass, instance_id = nil) click to toggle source

pass in (capability_type_iid, class name) or (capability_type_iid, any class instance) Example: can user upload files? user.has_capability?('upload', 'FileAsset') Example: can download this file? user.has_capability?('download', file_asset)

# File lib/erp_tech_svcs/utils/compass_access_negotiator.rb, line 8
def has_capability?(capability_type_iid, klass, instance_id = nil)
  capability_type_iid = capability_type_iid.to_s if capability_type_iid.is_a?(Symbol)
  if klass.is_a?(String) and instance_id.nil?
    scope_type = ScopeType.find_by_internal_identifier('class')
    capability = Capability.joins(:capability_type).
                            where(:capability_resource_type => klass).
                            where(:scope_type_id => scope_type.id).
                            where(:capability_types => {:internal_identifier => capability_type_iid}).first
    return nil if capability.nil? # capability not found so return nil
  elsif klass.is_a?(String)
    scope_type = ScopeType.find_by_internal_identifier('instance')

    capability = Capability.joins(:capability_type).
        where(:capability_resource_type => klass).
        where(:capability_resource_id => instance_id).
        where(:scope_type_id => scope_type.id).
        where(:capability_types => {:internal_identifier => capability_type_iid}).first
    return !klass.constantize.protect_all_instances if capability.nil?
  else
    scope_type = ScopeType.find_by_internal_identifier('instance')
    capability = klass.capabilities.joins(:capability_type).
                        where(:scope_type_id => scope_type.id).
                        where(:capability_types => {:internal_identifier => capability_type_iid}).first
    # if capability not found, we see if all instances are protected
    # if all instance are protected, return false, otherwise true
    return !klass.protect_all_instances if capability.nil?
  end
  all_capabilities.include?(capability)
end
with_capability(capability_type_iid, klass_instance) { || ... } click to toggle source

pass in (capability_type_iid, class name or any class instance, a block of code) Example: do something if user can download this file: user.with_capability('download', file_asset) do

something

end

# File lib/erp_tech_svcs/utils/compass_access_negotiator.rb, line 43
def with_capability(capability_type_iid, klass_instance, &block)
  if self.has_capability?(capability_type_iid, klass_instance)
    yield
  else
    raise ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::UserDoesNotHaveCapability
  end
end