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
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
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