class RailsAiAdmin::Authorization::PunditAdapter
Optional Pundit integration using a separate explicit policy per resource. The policy receives the complete admin Context as its user argument.
Constants
- ACTIONS
- FIELD_METHODS
Public Class Methods
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 12 def initialize require "pundit" unless Gem::Requirement.new(">= 2.5", "< 3").satisfied_by?(Gem.loaded_specs.fetch("pundit").version) raise ConfigurationError, "PunditAdapter requires pundit >= 2.5 and < 3" end rescue LoadError raise ConfigurationError, "Add pundit >= 2.5 and < 3 to the host bundle", cause: nil end
Public Instance Methods
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 32 def allowed?(context:, action:, resource:, record: nil) return false unless ACTIONS.include?(action.to_sym) || resource.operation_declarations.key?(action.to_sym) klass = policy_class(resource) target = record || (action.to_sym == :create ? scope(context: context, resource: resource, relation: resource.model_class.all).new : resource.model_class) return false unless klass && klass.new(context, target).respond_to?("#{action}?") Pundit.authorize(context, target, "#{action}?", policy_class: klass) true rescue Pundit::NotAuthorizedError false rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 165 def assistant?(context:, resource:) klass = policy_class(resource) return false unless klass policy = klass.new(context, resource.model_class) policy.respond_to?(:assistant?) && policy.assistant? == true rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 102 def cancel_operation?(context:, resource:, operation:) klass = policy_class(resource) return false unless klass policy = klass.new(context, resource.model_class) policy.respond_to?(:cancel_operation?) && policy.cancel_operation?(operation.to_sym) == true rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 68 def configured?(resource) klass = policy_class(resource) !!(klass && scope_class(klass)) rescue StandardError => error policy_error!(resource, error) end
Reports whether an explicit policy and its owned/inherited Scope exist. This checks metadata only; it does not attest any authorization decision.
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 84 def deliver_work?(context:, resource:, operation:, work_kind:, record:) klass = policy_class(resource) return false unless klass policy = klass.new(context, record) policy.respond_to?(:deliver_operation_work?) && policy.deliver_operation_work?(operation.to_sym, work_kind.to_s) == true rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 129 def export_records?(context:, resource:) klass = policy_class(resource) return false unless klass policy = klass.new(context, resource.model_class) policy.respond_to?(:export_records?) && policy.export_records? == true rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 45 def fields(context:, resource:, action:, record: nil) method = FIELD_METHODS[action.to_sym] klass = policy_class(resource) return [] unless method && klass policy = klass.new(context, record || resource.model_class) policy.respond_to?(method) ? policy.public_send(method) : [] rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 138 def import_records?(context:, resource:) klass = policy_class(resource) return false unless klass policy = klass.new(context, resource.model_class) policy.respond_to?(:import_records?) && policy.import_records? == true rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 111 def named_scopes(context:, resource:) klass = policy_class(resource) return [] unless klass policy = klass.new(context, resource.model_class) policy.respond_to?(:permitted_named_scopes) ? policy.permitted_named_scopes : [] rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 75 def operation_fields(context:, resource:, operation:, record: nil) klass = policy_class(resource) return [] unless klass policy = klass.new(context, record || resource.model_class) policy.respond_to?(:permitted_operation_fields) ? policy.permitted_operation_fields(operation.to_sym) : [] rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 55 def presentation_fields(context:, resource:, view:, record: nil) klass = policy_class(resource) return [] unless klass policy = klass.new(context, record || resource.model_class) return unless policy.respond_to?(:presentation_fields, true) raise ConfigurationError, "Presentation policy must be public" unless policy.respond_to?(:presentation_fields) policy.presentation_fields(view) rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 93 def read_operation_receipt?(context:, resource:, operation:, record:) klass = policy_class(resource) return false unless klass policy = klass.new(context, record || resource.model_class) policy.respond_to?(:read_operation_receipt?) && policy.read_operation_receipt?(operation.to_sym) == true rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 21 def scope(context:, resource:, relation:) klass = policy_class(resource) scope = klass && scope_class(klass) return relation.none unless scope # Pundit's documented explicit Scope constructor/resolve contract avoids # guessing a model policy, which would merge resource-alias authority. scope.new(context, relation).resolve rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 120 def select_records?(context:, resource:) klass = policy_class(resource) return false unless klass policy = klass.new(context, resource.model_class) policy.respond_to?(:select_records?) && policy.select_records? == true rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 147 def view_audit_log?(context:, resource:) klass = policy_class(resource) return false unless klass policy = klass.new(context, resource.model_class) policy.respond_to?(:view_audit_log?) && policy.view_audit_log? == true rescue StandardError => error policy_error!(resource, error) end
Source
# File lib/rails_ai_admin/authorization/pundit_adapter.rb, line 156 def view_history?(context:, resource:, record:) klass = policy_class(resource) return false unless klass policy = klass.new(context, record) policy.respond_to?(:view_history?) && policy.view_history? == true rescue StandardError => error policy_error!(resource, error) end