class WarpEngine::AdminApi::Runner
Runs one Operation for a Principal: checks access (.gate), coerces the params to their schema types, calls the handler and maps failures to Error.
Constants
- FALSE_VALUES
-
The strings read as
falsefor a boolean param. - TRUE_VALUES
-
The strings read as
truefor a boolean param.
Public Class Methods
# File lib/warp_engine/admin_api/runner.rb, line 20 def self.call(operation, principal:, params:, base_url: nil, via: :http) new(operation, principal: principal, params: params, base_url: base_url, via: via).call end
Runs operation as principal with params and returns its Result.
- base_url
-
the base URL of the request
- via
-
:httpor:mcp
Writes are published as a warp_engine.admin_api.write ActiveSupport notification. Raises Error: record not found and missing files become 404, invalid records 422, duplicates and non-empty directories 409, WarpEngine::CI::Error 502 and ArgumentError 400.
Source
# File lib/warp_engine/admin_api/runner.rb, line 63 def self.gate(operation, principal) config = AdminApi.config resource = operation.resource raise Error.not_found unless config.enabled? raise Error.not_found unless resource.always? || config.resource_enabled?(resource.name) raise Error.unauthorized if principal.nil? raise Error.new(resource.unavailable[:status], resource.unavailable[:message]) unless resource.available? raise Error.read_only if config.read_only? && !operation.read? scope = operation.required_scope raise Error.forbidden("This needs the #{scope} scope") unless scope == :any || principal.scope?(scope) end
# File lib/warp_engine/admin_api/runner.rb, line 25 def initialize(operation, principal:, params:, base_url:, via:) @operation = operation @principal = principal @raw = params.to_h.deep_stringify_keys @base_url = base_url @via = via end
Prepares a run; see .call.
# File lib/warp_engine/admin_api/runner.rb, line 78 def self.permitted?(operation, principal) gate(operation, principal) true rescue Error false end
Whether .gate lets principal run operation.
Public Instance Methods
Source
# File lib/warp_engine/admin_api/runner.rb, line 34 def call gate! context = Context.new(operation: @operation, principal: @principal, params: coerced_params, base_url: @base_url, via: @via) result = @operation.handler.call(context) instrument(result) unless @operation.read? result rescue Error raise rescue ActiveRecord::RecordNotFound, Errno::ENOENT raise Error.not_found rescue ActiveRecord::RecordInvalid => e raise Error.invalid(e.record) rescue ActiveRecord::InvalidForeignKey raise Error.new(422, "Validation failed", details: { base: [ "refers to a record that does not exist" ] }) rescue ActiveRecord::RecordNotUnique, Errno::EEXIST raise Error.conflict("Already exists") rescue Errno::ENOTEMPTY raise Error.conflict("Directory not empty") rescue WarpEngine::CI::Error => e raise Error.new(502, "CI: #{e.message}") rescue ArgumentError => e raise Error.bad_request(e.message) end
Runs the operation; see .call.