Class: Sequel::Plugins::Privacy::AssociationPrivacyDSL

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/sequel/plugins/privacy.rb

Overview

DSL class for defining association-level privacy policies

Instance Method Summary collapse

Constructor Details

#initialize(model_class, assoc_name, policy_resolver) ⇒ AssociationPrivacyDSL

Returns a new instance of AssociationPrivacyDSL.



63
64
65
66
67
68
# File 'lib/sequel/plugins/privacy.rb', line 63

def initialize(model_class, assoc_name, policy_resolver)
  @model_class = model_class
  @assoc_name = assoc_name
  @policy_resolver = policy_resolver
  @pending_policies = T.let({}, T::Hash[Symbol, T::Array[T.untyped]])
end

Instance Method Details

#can(action, *policies) ⇒ Object



72
73
74
75
76
77
78
79
80
81
# File 'lib/sequel/plugins/privacy.rb', line 72

def can(action, *policies)
  unless %i[add remove remove_all].include?(action)
    Kernel.raise ArgumentError,
                 "Association action must be :add, :remove, or :remove_all, got #{action.inspect}"
  end

  resolved = @policy_resolver.(policies)
  @pending_policies[action] ||= []
  T.must(@pending_policies[action]).concat(resolved)
end

#finalize_association!Object



85
86
87
88
89
90
# File 'lib/sequel/plugins/privacy.rb', line 85

def finalize_association!
  @pending_policies.each do |action, policies|
    @model_class.register_association_policies(@assoc_name, action, policies, defer_setup: true)
  end
  @model_class.setup_association_privacy(@assoc_name)
end