class PactBroker::Api::Resources::PublishContracts

Public Instance Methods

allowed_methods() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 17
def allowed_methods
  ["POST", "OPTIONS"]
end
content_types_provided() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 13
def content_types_provided
  [["application/hal+json"]]
end
malformed_request?() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 21
def malformed_request?
  super || (request.post? && content_type_json? && validation_errors_for_schema?)
end
policy_name() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 39
def policy_name
  :'contracts::contracts'
end
policy_record() click to toggle source

for pactflow

# File lib/pact_broker/api/resources/publish_contracts.rb, line 44
def policy_record
  @policy_record ||= pacticipant_service.find_pacticipant_by_name(parsed_contracts.pacticipant_name)
end
policy_record_context() click to toggle source

for pactflow

# File lib/pact_broker/api/resources/publish_contracts.rb, line 49
def policy_record_context
  { pacticipant: policy_record }
end
process_post() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 25
def process_post
  if content_type_json?
    if conflict_notices.any?
      set_conflict_response
      409
    else
      publish_contracts
      true
    end
  else
    415
  end
end

Private Instance Methods

base64_decode(content) click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 107
def base64_decode(content)
  Base64.strict_decode64(content) rescue nil
end
conflict_notices() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 103
def conflict_notices
  @conflict_notices ||= contract_service.conflict_notices(parsed_contracts, base_url: base_url)
end
decode_and_parse_content(contract) click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 75
def decode_and_parse_content(contract)
  contract["decodedContent"] = base64_decode(contract["content"])
  if contract["decodedContent"]
    if contract["contentType"]&.include?("json")
      contract["decodedParsedContent"] = parse_json(contract["decodedContent"])
    elsif contract["contentType"]&.include?("yml")
      contract["decodedParsedContent"] = parse_yaml(contract["decodedContent"])
    end
  end
end
params() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 59
def params
  p = super(default: {}, symbolize_names: false)
  if p["contracts"].is_a?(Array)
    p["contracts"].each do | contract |
      if contract.is_a?(Hash)
        decode_and_parse_content(contract)
      end
    end
  end
  p
end
parse_json(content) click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 116
def parse_json(content)
  PactBroker::Pacts::Parse.call(content) rescue nil
end
parse_yaml(content) click to toggle source

TODO put this somewhere shareable

# File lib/pact_broker/api/resources/publish_contracts.rb, line 112
def parse_yaml(content)
  YAML.safe_load(content, permitted_classes: [Time, Date, DateTime]) rescue nil
end
parsed_contracts() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 55
def parsed_contracts
  @parsed_contracts ||= decorator_class(:publish_contracts_decorator).new(PactBroker::Contracts::ContractsToPublish.new).from_hash(params, { user_options: { sha_generator: PactBroker.configuration.sha_generator } } )
end
publish_contracts() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 86
def publish_contracts
  handle_webhook_events(consumer_version_branch: parsed_contracts.branch, build_url: parsed_contracts.build_url) do
    results = contract_service.publish(parsed_contracts, base_url: base_url)
    response.body = decorator_class(:publish_contracts_results_decorator).new(results).to_json(**decorator_options)
  end
end
schema() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 71
def schema
  api_contract_class(:publish_contracts_schema)
end
set_conflict_response() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 93
def set_conflict_response
  response.body = {
    notices: conflict_notices.collect(&:to_h),
    errors: {
      contracts: conflict_notices.select(&:error?).collect(&:text)
    }
  }.to_json
  response.headers["Content-Type"] = "application/json;charset=utf-8"
end