class PactBroker::Api::Resources::PublishContracts

Public Instance Methods

allowed_methods() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 21
def allowed_methods
  ["POST", "OPTIONS"]
end
content_types_accepted() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 17
def content_types_accepted
  [["application/json"]]
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", :to_json]]
end
malformed_request?() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 25
def malformed_request?
  if request.post?
    invalid_json? || validation_errors_for_schema?
  else
    false
  end
end
policy_name() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 43
def policy_name
  :'contracts::contracts'
end
policy_record() click to toggle source

for Pactflow

# File lib/pact_broker/api/resources/publish_contracts.rb, line 48
def policy_record
  @policy_record ||= pacticipant_service.find_pacticipant_by_name(parsed_contracts.pacticipant_name)
end
process_post() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 33
def process_post
  if conflict_notices.any?
    set_conflict_response
    409
  else
    publish_contracts
    true
  end
end

Private Instance Methods

base64_decode(content) click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 106
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 102
def conflict_notices
  @conflict_notices ||= contract_service.conflict_notices(parsed_contracts)
end
decode_and_parse_content(contract) click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 74
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
Calls superclass method
# File lib/pact_broker/api/resources/publish_contracts.rb, line 58
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 115
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 111
def parse_yaml(content)
  YAML.safe_load(content, [Time, Date, DateTime]) rescue nil
end
parsed_contracts() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 54
def parsed_contracts
  @parsed_contracts ||= decorator_class(:publish_contracts_decorator).new(PactBroker::Contracts::ContractsToPublish.new).from_hash(params)
end
publish_contracts() click to toggle source
# File lib/pact_broker/api/resources/publish_contracts.rb, line 85
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 70
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 92
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