app/policies/concentric_policy.rb in kojac-0.16.0 vs app/policies/concentric_policy.rb in kojac-0.17.0

- old
+ new

@@ -1,7 +1,11 @@ +require 'standard_exceptions' + class ConcentricPolicy + include ::StandardExceptions::Methods + class_attribute :filters attr_reader :user, :record, :ability def initialize(user, record) @@ -30,12 +34,20 @@ end # this could use an alternative field or method in future def user_ring user.ring - end + end + def record_class + record.is_a?(Class) ? record : record.class + end + + def record_instance + record.is_a?(Class) ? nil : record + end + def apply_filters(aResult) if self.class.filters self.class.filters.each do |f| options, handler = f unless options[:all] @@ -52,19 +64,52 @@ aResult.sort! end aResult end + def inner_query_ability(aAbility) + @ability = aAbility + internal_server_error! "aAbility must be a string or a symbol" unless aAbility.is_a?(String) or aAbility.is_a?(Symbol) + aAbility = aAbility.to_s + + case aAbility + when 'write','read','update','show','edit' + inner_query_fields(aAbility).length > 0 + when 'create','destroy','index' + inner_query_resource(aAbility) + else + internal_server_error! 'this ability is unknown' + end + end + def inner_query_fields(aAbility=nil) aAbility = @ability = (aAbility || @ability) raise "Ability must be set or given" unless aAbility cls = record.is_a?(Class) ? record : record.class result = cls.permitted(user_ring,aAbility) result = apply_filters(result) result - end + end + def inner_query_resource(aAbility) + internal_server_error! "aAbility must be a string or a symbol" unless aAbility.is_a?(String) or aAbility.is_a?(Symbol) + return false unless user_ring and rings_abilities = record_class.respond_to?(:rings_abilities) && record_class.rings_abilities.to_nil + unauthorized! "identity not given" if !user + + aAbility = aAbility.to_s + + ring_keys = rings_abilities.keys.sort + ring_keys.each do |i| + next unless i >= user_ring + next unless ring_rec = rings_abilities[i] + #next unless ring_rec.has_key? aAbility.to_sym + perm = ring_rec[aAbility.to_sym] + return true if perm==true or perm==:this or perm.is_a?(Array) && !perm.empty? + end + false + end + def permitted_attributes(aAbility=nil) inner_query_fields(aAbility) end def permitted_fields(aAbility=nil) @@ -79,25 +124,28 @@ cls = record.is_a?(Class) ? record : record.class result.delete_if { |f| !cls.reflections.has_key? f } result end - def inner_query_ability(aAbility) - @ability = aAbility - inner_query_fields.length > 0 + def defaults + {} end + def valid? + true + end + # kojac methods def create? - inner_query_ability(:create) + inner_query_ability(:create) && valid? end def read? inner_query_ability(:read) end def write? - inner_query_ability(:write) + inner_query_ability(:write) && valid? end def destroy? inner_query_ability(:destroy) end