class PactBroker::Api::Resources::DefaultBaseResource

Attributes

user[RW]

Public Class Methods

new() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 28
def initialize
  PactBroker.configuration.before_resource.call(self)
  application_context.before_resource&.call(self)
end

Public Instance Methods

api_contract_class(name) click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 257
def api_contract_class(name)
  application_context.api_contract_configuration.class_for(name)
end
application_context() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 249
def application_context
  request.path_info[:application_context]
end
base_url() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 73
def base_url
  # Have to use something for the base URL here - we can't use an empty string as we can in the UI.
  # Can't work out if cache poisoning is a vulnerability for APIs or not.
  # Using the request base URI as a fallback if the base_url is not configured may be a vulnerability,
  # but the documentation recommends that the
  # base_url should be set in the configuration to mitigate this.
  request.env["pactbroker.base_url"] || request.base_uri.to_s.chomp("/")
end
charsets_provided() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 87
def charsets_provided
  [["utf-8", :encode]]
end
consumer() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 220
def consumer
  @consumer ||= identifier_from_path[:consumer_name] && find_pacticipant(identifier_from_path[:consumer_name], "consumer")
end
consumer_name() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 154
def consumer_name
  identifier_from_path[:consumer_name]
end
consumer_specified?() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 166
def consumer_specified?
  identifier_from_path.key?(:consumer_name)
end
consumer_version_number() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 158
def consumer_version_number
  identifier_from_path[:consumer_version_number]
end
contract_validation_errors?(contract, params) click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 207
def contract_validation_errors? contract, params
  if (invalid = !contract.validate(params))
    set_json_validation_error_messages contract.errors.messages
  end
  invalid
end
database_connector() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 245
def database_connector
  request.env["pactbroker.database_connector"]
end
decorator_class(name) click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 253
def decorator_class(name)
  application_context.decorator_configuration.class_for(name)
end
decorator_context(options = {}) click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 100
def decorator_context options = {}
  application_context.decorator_context_creator.call(self, options)
end
decorator_options(options = {}) click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 104
def decorator_options options = {}
  { user_options: decorator_context(options) }
end
encode(body) click to toggle source

We only use utf-8 so leave encoding as it is

# File lib/pact_broker/api/resources/default_base_resource.rb, line 92
def encode(body)
  body
end
find_pacticipant(name, role) click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 214
def find_pacticipant name, role
  pacticipant_service.find_pacticipant_by_name(name).tap do | pacticipant |
    set_json_error_message("No #{role} with name '#{name}' found") if pacticipant.nil?
  end
end
finish_request() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 41
def finish_request
  application_context.after_resource&.call(self)
  PactBroker.configuration.after_resource.call(self)
end
forbidden?() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 50
def forbidden?
  if application_context.resource_authorizer
    !application_context.resource_authorizer.call(self)
  elsif PactBroker.configuration.authorize
    !PactBroker.configuration.authorize.call(self, {})
  else
    false
  end
end
handle_exception(error) click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 108
def handle_exception(error)
  error_reference = PactBroker::Errors.generate_error_reference
  application_context.error_logger.call(error, error_reference, request.env)
  if PactBroker::Errors.reportable_error?(error)
    PactBroker::Errors.report(error, error_reference, request.env)
  end
  response.body = application_context.error_response_body_generator.call(error, error_reference, request.env)
end
identifier_from_path() click to toggle source

The path_info segments aren't URL decoded

# File lib/pact_broker/api/resources/default_base_resource.rb, line 61
def identifier_from_path
  @identifier_from_path ||= request.path_info.each_with_object({}) do | (key, value), hash|
    if value.is_a?(String)
      hash[key] = URI.decode(value)
    elsif value.is_a?(Symbol) || value.is_a?(Numeric)
      hash[key] = value
    end
  end
end
Also aliased as: path_info
integration() click to toggle source

Not necessarily an existing integration

# File lib/pact_broker/api/resources/default_base_resource.rb, line 237
def integration
  if consumer_specified? && provider_specified?
    OpenStruct.new(consumer: consumer, provider: provider)
  else
    nil
  end
end
invalid_json?() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 186
def invalid_json?
  begin
    params
    false
  rescue StandardError => e
    logger.info "Error parsing JSON #{e} - #{request_body}"
    set_json_error_message "Error parsing JSON - #{e.message}"
    response.headers["Content-Type"] = "application/hal+json;charset=utf-8"
    true
  end
end
is_authorized?(authorization_header) click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 46
def is_authorized?(authorization_header)
  authenticated?(self, authorization_header)
end
known_methods() click to toggle source
Calls superclass method
# File lib/pact_broker/api/resources/default_base_resource.rb, line 37
def known_methods
  super + ["PATCH"]
end
malformed_request_for_json_with_schema?(schema_to_use = schema, params_to_validate = params) click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 274
def malformed_request_for_json_with_schema?(schema_to_use = schema, params_to_validate = params)
  invalid_json? || validation_errors_for_schema?(schema_to_use, params_to_validate)
end
options() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 33
def options
  { "Access-Control-Allow-Methods" => allowed_methods.join(", ")}
end
pact() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 232
def pact
  @pact ||= pact_service.find_pact(pact_params)
end
pact_params() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 136
def pact_params
  @pact_params ||= PactBroker::Pacts::PactParams.from_request request, identifier_from_path
end
pacticipant() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 228
def pacticipant
  @pacticipant ||= identifier_from_path[:pacticipant_name] && find_pacticipant(identifier_from_path[:pacticipant_name], "pacticipant")
end
pacticipant_name() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 178
def pacticipant_name
  identifier_from_path[:pacticipant_name]
end
pacticipant_specified?() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 182
def pacticipant_specified?
  identifier_from_path.key?(:pacticipant_name)
end
pacticipant_version_number() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 162
def pacticipant_version_number
  identifier_from_path[:pacticipant_version_number]
end
params(options = {}) click to toggle source

rubocop: disable Metrics/CyclomaticComplexity

# File lib/pact_broker/api/resources/default_base_resource.rb, line 118
def params(options = {})
  return options[:default] if options.key?(:default) && request_body.empty?

  symbolize_names = !options.key?(:symbolize_names) || options[:symbolize_names]
  if symbolize_names
    @params_with_symbol_keys ||= JSON.parse(request_body, { symbolize_names: true }.merge(PACT_PARSING_OPTIONS)) #Not load! Otherwise it will try to load Ruby classes.
  else
    @params_with_string_keys ||= JSON.parse(request_body, { symbolize_names: false }.merge(PACT_PARSING_OPTIONS)) #Not load! Otherwise it will try to load Ruby classes.
  end
rescue JSON::JSONError => e
  raise InvalidJsonError.new("Error parsing JSON - #{e.message}")
end
params_with_string_keys() click to toggle source

rubocop: enable Metrics/CyclomaticComplexity

# File lib/pact_broker/api/resources/default_base_resource.rb, line 132
def params_with_string_keys
  params(symbolize_names: false)
end
path_info()
provider() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 224
def provider
  @provider ||= identifier_from_path[:provider_name] && find_pacticipant(identifier_from_path[:provider_name], "provider")
end
provider_name() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 174
def provider_name
  identifier_from_path[:provider_name]
end
provider_specified?() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 170
def provider_specified?
  identifier_from_path.key?(:provider_name)
end
request_body() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 150
def request_body
  @request_body ||= request.body.to_s
end
resource_url() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 96
def resource_url
  request.uri.to_s.gsub(/\?.*/, "").chomp("/")
end
schema() click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 261
def schema
  nil
end
set_json_error_message(message) click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 140
def set_json_error_message message
  response.headers["Content-Type"] = "application/hal+json;charset=utf-8"
  response.body = { error: message }.to_json
end
set_json_validation_error_messages(errors) click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 145
def set_json_validation_error_messages errors
  response.headers["Content-Type"] = "application/hal+json;charset=utf-8"
  response.body = { errors: errors }.to_json
end
ui_base_url() click to toggle source

See comments for base_url in lib/pact_broker/doc/controllers/app.rb

# File lib/pact_broker/api/resources/default_base_resource.rb, line 83
def ui_base_url
  request.env["pactbroker.base_url"] || ""
end
validation_errors?(model) click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 198
def validation_errors? model
  if (errors = model.validate).any?
    set_json_validation_error_messages errors
    true
  else
    false
  end
end
validation_errors_for_schema?(schema_to_use = schema, params_to_validate = params) click to toggle source
# File lib/pact_broker/api/resources/default_base_resource.rb, line 265
def validation_errors_for_schema?(schema_to_use = schema, params_to_validate = params)
  if (errors = schema_to_use.call(params_to_validate)).any?
    set_json_validation_error_messages(errors)
    true
  else
    false
  end
end