pact_broker 2.86.0 → 2.87.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/release_gem.yml +1 -1
- data/CHANGELOG.md +35 -0
- data/db/migrations/20210929_increase_event_context_column_size.rb +14 -0
- data/docker-compose-test.yml +2 -0
- data/lib/pact/doc/interaction_view_model.rb +2 -2
- data/lib/pact/doc/markdown/consumer_contract_renderer.rb +1 -1
- data/lib/pact_broker/api/contracts/configuration.rb +33 -0
- data/lib/pact_broker/api/contracts/publish_contracts_schema.rb +35 -16
- data/lib/pact_broker/api/decorators/matrix_decorator.rb +3 -1
- data/lib/pact_broker/api/decorators/verification_decorator.rb +5 -3
- data/lib/pact_broker/api/pact_broker_urls.rb +26 -6
- data/lib/pact_broker/api/resources/default_base_resource.rb +4 -0
- data/lib/pact_broker/api/resources/environment.rb +1 -1
- data/lib/pact_broker/api/resources/environments.rb +1 -1
- data/lib/pact_broker/api/resources/index.rb +7 -1
- data/lib/pact_broker/api/resources/publish_contracts.rb +1 -1
- data/lib/pact_broker/api/resources/verification.rb +5 -2
- data/lib/pact_broker/api/resources/webhook_execution_methods.rb +23 -17
- data/lib/pact_broker/api.rb +1 -0
- data/lib/pact_broker/application_context.rb +5 -0
- data/lib/pact_broker/db/delete_overwritten_data.rb +41 -23
- data/lib/pact_broker/deployments/deployed_version.rb +1 -0
- data/lib/pact_broker/deployments/deployed_version_service.rb +1 -0
- data/lib/pact_broker/deployments/environment_service.rb +4 -1
- data/lib/pact_broker/deployments/released_version_service.rb +1 -0
- data/lib/pact_broker/doc/controllers/app.rb +1 -0
- data/lib/pact_broker/doc/views/can-i-deploy.markdown +2 -1
- data/lib/pact_broker/doc/views/index/publish-contracts.markdown +38 -9
- data/lib/pact_broker/domain/index_item.rb +9 -0
- data/lib/pact_broker/domain/verification.rb +3 -0
- data/lib/pact_broker/index/service.rb +2 -2
- data/lib/pact_broker/locale/en.yml +3 -1
- data/lib/pact_broker/matrix/parse_can_i_deploy_query.rb +5 -3
- data/lib/pact_broker/pacticipants/repository.rb +1 -1
- data/lib/pact_broker/pacts/metadata.rb +7 -1
- data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +3 -2
- data/lib/pact_broker/pacts/service.rb +5 -5
- data/lib/pact_broker/string_refinements.rb +1 -1
- data/lib/pact_broker/test/http_test_data_builder.rb +2 -0
- data/lib/pact_broker/ui/helpers/url_helper.rb +12 -0
- data/lib/pact_broker/ui/view_models/index_item.rb +15 -1
- data/lib/pact_broker/ui/view_models/index_item_branch_head.rb +39 -0
- data/lib/pact_broker/ui/view_models/index_item_provider_branch_head.rb +39 -0
- data/lib/pact_broker/ui/views/dashboard/show.haml +14 -7
- data/lib/pact_broker/verifications/service.rb +3 -3
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/versions/branch_head.rb +0 -2
- data/lib/pact_broker/versions/branch_version.rb +1 -0
- data/lib/pact_broker/versions/repository.rb +0 -1
- data/lib/pact_broker/webhooks/pact_and_verification_parameters.rb +17 -3
- data/lib/pact_broker/webhooks/trigger_service.rb +1 -1
- data/lib/pact_broker/webhooks/webhook.rb +5 -0
- data/public/stylesheets/index.css +5 -0
- data/script/data/auto-create-things-for-tags.rb +1 -0
- data/script/data/contract-published-requiring-verification.rb +0 -1
- data/spec/fixtures/invalid-publish-contract-body.json +38 -0
- data/spec/integration/webhooks/contract_publication_spec.rb +68 -0
- data/spec/integration/webhooks/contract_requiring_verification_published_spec.rb +67 -0
- data/spec/integration/webhooks/pact_publication_spec.rb +1 -1
- data/spec/lib/pact/doc/markdown/consumer_contract_renderer_spec.rb +2 -2
- data/spec/lib/pact_broker/api/contracts/publish_contracts_schema_spec.rb +13 -0
- data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +1 -1
- data/spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb +7 -6
- data/spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb +1 -1
- data/spec/lib/pact_broker/api/pact_broker_urls_spec.rb +18 -0
- data/spec/lib/pact_broker/api/resources/triggered_webhook_logs_spec.rb +6 -5
- data/spec/lib/pact_broker/matrix/parse_can_i_deploy_query_spec.rb +13 -0
- data/spec/lib/pact_broker/pacts/repository_find_for_verification_spec.rb +4 -5
- data/spec/lib/pact_broker/ui/view_models/index_item_spec.rb +1 -1
- data/spec/lib/pact_broker/verifications/service_spec.rb +6 -6
- data/spec/lib/pact_broker/webhooks/render_spec.rb +3 -2
- data/tasks/db.rake +4 -1
- metadata +13 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f376a0bea2db36abf0b4b601badefb182b836bad4c43be53063388ad65ecc1c0
|
|
4
|
+
data.tar.gz: 5ab7478d03702755dea935bde89173461b6221c4723c719267a9a6e8360d6e9c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7bb19660447b2f13d2f815b6ce13b3aa27dac289ba023d4463de204fd6605c1f2d787f8e08d36c5868947ba4fa44fb277cf04a77a9e90ad1a9c5e0642d5ec269
|
|
7
|
+
data.tar.gz: 1a68a6c2393f42469045b4fffd1fa548b4833e66401733e75a43382103c8481f38c54d5ed4241e3f4232596b5a23dab6af6a518bad5398d8777b23137c8d9fc9
|
|
@@ -35,7 +35,7 @@ jobs:
|
|
|
35
35
|
needs: release
|
|
36
36
|
strategy:
|
|
37
37
|
matrix:
|
|
38
|
-
repository: [pact-foundation/pact-broker-docker, DiUS/pact_broker-docker
|
|
38
|
+
repository: [pact-foundation/pact-broker-docker, DiUS/pact_broker-docker]
|
|
39
39
|
runs-on: ubuntu-latest
|
|
40
40
|
steps:
|
|
41
41
|
- name: Notify ${{ matrix.repository }} of gem release
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,38 @@
|
|
|
1
|
+
<a name="v2.87.0"></a>
|
|
2
|
+
### v2.87.0 (2021-10-05)
|
|
3
|
+
|
|
4
|
+
#### Features
|
|
5
|
+
|
|
6
|
+
* **matrix**
|
|
7
|
+
* preselect the consumer version when clicking through to matrix page from integration dashboard ([b550b470](/../../commit/b550b470))
|
|
8
|
+
|
|
9
|
+
* **dashboard**
|
|
10
|
+
* show tooltip explaining auto created branches ([cdaf7f6e](/../../commit/cdaf7f6e))
|
|
11
|
+
|
|
12
|
+
* **can-i-deploy**
|
|
13
|
+
* support ignoring specific version numbers ([2ac5a946](/../../commit/2ac5a946))
|
|
14
|
+
* make verification results URL reference the appropriate consumer version as the pb:pact-version ([145bb37b](/../../commit/145bb37b))
|
|
15
|
+
|
|
16
|
+
* add pb:can-i-deploy-pacticipant-version-to-environment relation ([67328194](/../../commit/67328194))
|
|
17
|
+
|
|
18
|
+
* **webhooks**
|
|
19
|
+
* support ${pactbroker.providerVersionDescriptions} template parameter ([54a073eb](/../../commit/54a073eb))
|
|
20
|
+
* support ${pactbroker.buildUrl} template parameter ([9b79b33f](/../../commit/9b79b33f))
|
|
21
|
+
* support $pactbroker.consumerVersionBranch template parameter ([b97ba84c](/../../commit/b97ba84c))
|
|
22
|
+
|
|
23
|
+
#### Bug Fixes
|
|
24
|
+
|
|
25
|
+
* **mysql**
|
|
26
|
+
* increase size of event_context column ([c1596419](/../../commit/c1596419))
|
|
27
|
+
|
|
28
|
+
* correctly merge dry validation and custom validation error messages when publishing contracts ([688b1e3f](/../../commit/688b1e3f))
|
|
29
|
+
|
|
30
|
+
* **pacts for verification**
|
|
31
|
+
* correct logic for returning pact for main branch when no consumer version selectors are specified ([8847e442](/../../commit/8847e442))
|
|
32
|
+
|
|
33
|
+
* **db clean**
|
|
34
|
+
* optimise calls to identify overwritten data to delete ([aaef9e6d](/../../commit/aaef9e6d))
|
|
35
|
+
|
|
1
36
|
<a name="v2.86.0"></a>
|
|
2
37
|
### v2.86.0 (2021-09-17)
|
|
3
38
|
|
data/docker-compose-test.yml
CHANGED
|
@@ -49,6 +49,7 @@ services:
|
|
|
49
49
|
- ./.rubocop:/home/.rubocop
|
|
50
50
|
- ./.gitignore:/home/.gitignore
|
|
51
51
|
- ./public:/home/public
|
|
52
|
+
- ./docs:/home/docs
|
|
52
53
|
|
|
53
54
|
mysql:
|
|
54
55
|
image: mysql:5.7.28
|
|
@@ -97,4 +98,5 @@ services:
|
|
|
97
98
|
- ./.rubocop:/home/.rubocop
|
|
98
99
|
- ./.gitignore:/home/.gitignore
|
|
99
100
|
- ./public:/home/public
|
|
101
|
+
- ./docs:/home/docs
|
|
100
102
|
|
|
@@ -57,7 +57,7 @@ module Pact
|
|
|
57
57
|
def formatted_provider_states mark_bold: false
|
|
58
58
|
bold_marker = mark_bold ? MARKDOWN_BOLD_CHARACTERS : ""
|
|
59
59
|
|
|
60
|
-
(@interaction.provider_states || []).map do |ps|
|
|
60
|
+
(@interaction.provider_states || []).map do |ps|
|
|
61
61
|
"#{bold_marker}" \
|
|
62
62
|
"#{markdown_escape(apply_capitals(ps.name.strip, false))}" \
|
|
63
63
|
"#{bold_marker}"
|
|
@@ -129,7 +129,7 @@ module Pact
|
|
|
129
129
|
|
|
130
130
|
def markdown_escape string
|
|
131
131
|
return nil unless string
|
|
132
|
-
string.gsub("*",
|
|
132
|
+
string.gsub("*","\\*").gsub("_","\\_")
|
|
133
133
|
end
|
|
134
134
|
end
|
|
135
135
|
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require "pact_broker/string_refinements"
|
|
2
|
+
|
|
3
|
+
module PactBroker
|
|
4
|
+
module Api
|
|
5
|
+
module Contracts
|
|
6
|
+
class Configuration
|
|
7
|
+
using PactBroker::StringRefinements
|
|
8
|
+
|
|
9
|
+
def initialize(overrides = {})
|
|
10
|
+
@overrides = overrides
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def class_for(name)
|
|
14
|
+
if overrides[name].is_a?(String)
|
|
15
|
+
Object.const_get(overrides[name])
|
|
16
|
+
elsif overrides[name].is_a?(Class)
|
|
17
|
+
overrides[name]
|
|
18
|
+
else
|
|
19
|
+
Object.const_get("PactBroker::Api::Contracts::#{name.to_s.camelcase(true)}")
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.default_configuration
|
|
24
|
+
Configuration.new
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
attr_reader :overrides
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -34,14 +34,14 @@ module PactBroker
|
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def self.call(params)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
)
|
|
44
|
-
|
|
37
|
+
dry_results = SCHEMA.call(params&.symbolize_keys).messages(full: true)
|
|
38
|
+
dry_results.then do | results |
|
|
39
|
+
add_cross_field_validation_errors(params&.symbolize_keys, results)
|
|
40
|
+
end.then do | results |
|
|
41
|
+
select_first_message(results)
|
|
42
|
+
end.then do | results |
|
|
43
|
+
flatten_indexed_messages(results)
|
|
44
|
+
end
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
def self.add_cross_field_validation_errors(params, errors)
|
|
@@ -61,43 +61,62 @@ module PactBroker
|
|
|
61
61
|
|
|
62
62
|
def self.validate_consumer_name(params, contract, i, errors)
|
|
63
63
|
if params[:pacticipantName] && contract[:consumerName] && (contract[:consumerName] != params[:pacticipantName])
|
|
64
|
-
add_contract_error(validation_message("consumer_name_in_contract_mismatch_pacticipant_name", { consumer_name_in_contract: contract[:consumerName], pacticipant_name: params[:pacticipantName] } ), i, errors)
|
|
64
|
+
add_contract_error(:consumerName, validation_message("consumer_name_in_contract_mismatch_pacticipant_name", { consumer_name_in_contract: contract[:consumerName], pacticipant_name: params[:pacticipantName] } ), i, errors)
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
def self.validate_consumer_name_in_content(params, contract, i, errors)
|
|
69
69
|
consumer_name_in_content = contract.dig(:decodedParsedContent, :consumer, :name)
|
|
70
70
|
if consumer_name_in_content && consumer_name_in_content != params[:pacticipantName]
|
|
71
|
-
add_contract_error(validation_message("consumer_name_in_content_mismatch_pacticipant_name", { consumer_name_in_content: consumer_name_in_content, pacticipant_name: params[:pacticipantName] } ), i, errors)
|
|
71
|
+
add_contract_error(:consumerName, validation_message("consumer_name_in_content_mismatch_pacticipant_name", { consumer_name_in_content: consumer_name_in_content, pacticipant_name: params[:pacticipantName] } ), i, errors)
|
|
72
72
|
end
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
def self.validate_provider_name_in_content(contract, i, errors)
|
|
76
76
|
provider_name_in_content = contract.dig(:decodedParsedContent, :provider, :name)
|
|
77
77
|
if provider_name_in_content && provider_name_in_content != contract[:providerName]
|
|
78
|
-
add_contract_error(validation_message("provider_name_in_content_mismatch", { provider_name_in_content: provider_name_in_content, provider_name: contract[:providerName] } ), i, errors)
|
|
78
|
+
add_contract_error(:providerName, validation_message("provider_name_in_content_mismatch", { provider_name_in_content: provider_name_in_content, provider_name: contract[:providerName] } ), i, errors)
|
|
79
79
|
end
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
def self.validate_encoding(contract, i, errors)
|
|
83
83
|
if contract[:decodedContent].nil?
|
|
84
|
-
add_contract_error(message("errors.base64?", scope: nil), i, errors)
|
|
84
|
+
add_contract_error(:content, message("errors.base64?", scope: nil), i, errors)
|
|
85
85
|
end
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
def self.validate_content_matches_content_type(contract, i, errors)
|
|
89
89
|
if contract[:decodedParsedContent].nil? && contract[:contentType]
|
|
90
|
-
add_contract_error(validation_message("invalid_content_for_content_type", { content_type: contract[:contentType]}), i, errors)
|
|
90
|
+
add_contract_error(:content, validation_message("invalid_content_for_content_type", { content_type: contract[:contentType]}), i, errors)
|
|
91
91
|
end
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
|
|
95
|
-
def self.add_contract_error(message, i, errors)
|
|
95
|
+
def self.add_contract_error(field, message, i, errors)
|
|
96
96
|
errors[:contracts] ||= {}
|
|
97
|
-
errors[:contracts][i] ||=
|
|
98
|
-
errors[:contracts][i]
|
|
97
|
+
errors[:contracts][i] ||= {}
|
|
98
|
+
errors[:contracts][i][field] ||= []
|
|
99
|
+
errors[:contracts][i][field] << message
|
|
99
100
|
errors
|
|
100
101
|
end
|
|
102
|
+
|
|
103
|
+
# Need to fix this whole dry-validation eff up
|
|
104
|
+
def self.select_first_message(results)
|
|
105
|
+
case results
|
|
106
|
+
when Hash then results.each_with_object({}) { |(key, value), new_hash| new_hash[key] = select_first_message(value) }
|
|
107
|
+
when Array then select_first_message_from_array(results)
|
|
108
|
+
else
|
|
109
|
+
results
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def self.select_first_message_from_array(results)
|
|
114
|
+
if results.all?{ |value| value.is_a?(String) }
|
|
115
|
+
results[0...1]
|
|
116
|
+
else
|
|
117
|
+
results.collect { |value| select_first_message(value) }
|
|
118
|
+
end
|
|
119
|
+
end
|
|
101
120
|
end
|
|
102
121
|
end
|
|
103
122
|
end
|
|
@@ -162,9 +162,11 @@ module PactBroker
|
|
|
162
162
|
|
|
163
163
|
def verification_hash(line, base_url)
|
|
164
164
|
if !line.success.nil?
|
|
165
|
-
url_params = {
|
|
165
|
+
url_params = {
|
|
166
|
+
consumer_name: line.consumer_name,
|
|
166
167
|
provider_name: line.provider_name,
|
|
167
168
|
pact_version_sha: line.pact_version_sha,
|
|
169
|
+
consumer_version_number: line.consumer_version_number,
|
|
168
170
|
verification_number: line.verification_number
|
|
169
171
|
}
|
|
170
172
|
{
|
|
@@ -21,18 +21,20 @@ module PactBroker
|
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
link :self do | options |
|
|
24
|
+
pact = options[:pact] || represented.latest_pact_publication
|
|
24
25
|
{
|
|
25
26
|
title: "Verification result",
|
|
26
|
-
name: "Verification result #{represented.number} for #{
|
|
27
|
+
name: "Verification result #{represented.number} for #{pact.name}",
|
|
27
28
|
href: verification_url(represented, options.fetch(:base_url), )
|
|
28
29
|
}
|
|
29
30
|
end
|
|
30
31
|
|
|
31
32
|
link "pb:pact-version" do | options |
|
|
33
|
+
pact = options[:pact] || represented.latest_pact_publication
|
|
32
34
|
{
|
|
33
35
|
title: "Pact",
|
|
34
|
-
name:
|
|
35
|
-
href:
|
|
36
|
+
name: pact.name,
|
|
37
|
+
href: pact_version_with_consumer_version_metadata_url(pact, options.fetch(:base_url))
|
|
36
38
|
}
|
|
37
39
|
end
|
|
38
40
|
|
|
@@ -64,6 +64,10 @@ module PactBroker
|
|
|
64
64
|
"#{pactigration_base_url(base_url, pact)}/pact-version/#{pact.pact_version_sha}"
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
+
def pact_version_with_consumer_version_metadata_url pact, base_url = ""
|
|
68
|
+
"#{pactigration_base_url(base_url, pact)}/pact-version/#{pact.pact_version_sha}/metadata/#{encode_metadata(build_metadata_for_consumer_version_number(pact.consumer_version_number))}"
|
|
69
|
+
end
|
|
70
|
+
|
|
67
71
|
def pact_version_url_with_metadata pact, metadata, base_url = ""
|
|
68
72
|
if metadata && metadata.any?
|
|
69
73
|
"#{pact_version_url(pact, base_url)}/metadata/#{encode_metadata(metadata)}"
|
|
@@ -166,12 +170,28 @@ module PactBroker
|
|
|
166
170
|
end
|
|
167
171
|
|
|
168
172
|
def verification_url_from_params params, base_url = ""
|
|
169
|
-
[
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
173
|
+
if params[:consumer_version_number]
|
|
174
|
+
metadata = encode_metadata(build_metadata_for_consumer_version_number(params[:consumer_version_number]))
|
|
175
|
+
|
|
176
|
+
[
|
|
177
|
+
base_url,
|
|
178
|
+
"pacts",
|
|
179
|
+
"provider", url_encode(params.fetch(:provider_name)),
|
|
180
|
+
"consumer", url_encode(params.fetch(:consumer_name)),
|
|
181
|
+
"pact-version", params.fetch(:pact_version_sha),
|
|
182
|
+
"metadata", metadata,
|
|
183
|
+
"verification-results", params.fetch(:verification_number)
|
|
184
|
+
].join("/")
|
|
185
|
+
else
|
|
186
|
+
[
|
|
187
|
+
base_url,
|
|
188
|
+
"pacts",
|
|
189
|
+
"provider", url_encode(params.fetch(:provider_name)),
|
|
190
|
+
"consumer", url_encode(params.fetch(:consumer_name)),
|
|
191
|
+
"pact-version", params.fetch(:pact_version_sha),
|
|
192
|
+
"verification-results", params.fetch(:verification_number)
|
|
193
|
+
].join("/")
|
|
194
|
+
end
|
|
175
195
|
end
|
|
176
196
|
|
|
177
197
|
def latest_verifications_for_consumer_version_url version, base_url
|
|
@@ -136,7 +136,13 @@ module PactBroker
|
|
|
136
136
|
"pb:can-i-deploy-pacticipant-version-to-tag" =>
|
|
137
137
|
{
|
|
138
138
|
href: base_url + "/can-i-deploy?pacticipant={pacticipant}&version={version}&to={tag}",
|
|
139
|
-
title: "Determine if an application can be safely deployed to an environment identified by the given tag",
|
|
139
|
+
title: "Determine if an application version can be safely deployed to an environment identified by the given tag",
|
|
140
|
+
templated: true
|
|
141
|
+
},
|
|
142
|
+
"pb:can-i-deploy-pacticipant-version-to-environment" =>
|
|
143
|
+
{
|
|
144
|
+
href: base_url + "/can-i-deploy?pacticipant={pacticipant}&version={version}&environment={environment}",
|
|
145
|
+
title: "Determine if an application version can be safely deployed to an environment",
|
|
140
146
|
templated: true
|
|
141
147
|
},
|
|
142
148
|
"pb:provider-pacts-for-verification" => {
|
|
@@ -31,7 +31,7 @@ module PactBroker
|
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def process_post
|
|
34
|
-
handle_webhook_events do
|
|
34
|
+
handle_webhook_events(consumer_version_branch: parsed_contracts.branch, build_url: parsed_contracts.build_url) do
|
|
35
35
|
results = contract_service.publish(parsed_contracts, base_url: base_url)
|
|
36
36
|
response.body = decorator_class(:publish_contracts_results_decorator).new(results).to_json(decorator_options)
|
|
37
37
|
end
|
|
@@ -4,11 +4,14 @@ require "pact_broker/domain/verification"
|
|
|
4
4
|
require "pact_broker/api/contracts/verification_contract"
|
|
5
5
|
require "pact_broker/api/decorators/verification_decorator"
|
|
6
6
|
require "pact_broker/api/decorators/extended_verification_decorator"
|
|
7
|
+
require "pact_broker/api/resources/metadata_resource_methods"
|
|
7
8
|
|
|
8
9
|
module PactBroker
|
|
9
10
|
module Api
|
|
10
11
|
module Resources
|
|
11
12
|
class Verification < BaseResource
|
|
13
|
+
include MetadataResourceMethods
|
|
14
|
+
|
|
12
15
|
def content_types_provided
|
|
13
16
|
[
|
|
14
17
|
["application/hal+json", :to_json],
|
|
@@ -35,11 +38,11 @@ module PactBroker
|
|
|
35
38
|
end
|
|
36
39
|
|
|
37
40
|
def to_json
|
|
38
|
-
decorator_for(verification).to_json(decorator_options)
|
|
41
|
+
decorator_for(verification).to_json(decorator_options(pact: pact))
|
|
39
42
|
end
|
|
40
43
|
|
|
41
44
|
def to_extended_json
|
|
42
|
-
extended_decorator_for(verification).to_json(decorator_options)
|
|
45
|
+
extended_decorator_for(verification).to_json(decorator_options(pact: pact))
|
|
43
46
|
end
|
|
44
47
|
|
|
45
48
|
def delete_resource
|
|
@@ -5,29 +5,15 @@ module PactBroker
|
|
|
5
5
|
module Api
|
|
6
6
|
module Resources
|
|
7
7
|
module WebhookExecutionMethods
|
|
8
|
-
def
|
|
9
|
-
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def webhook_options
|
|
13
|
-
{
|
|
14
|
-
database_connector: database_connector,
|
|
15
|
-
webhook_execution_configuration: webhook_execution_configuration
|
|
16
|
-
}
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def webhook_event_listener
|
|
20
|
-
@webhook_event_listener ||= PactBroker::Webhooks::EventListener.new(webhook_options)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def handle_webhook_events
|
|
8
|
+
def handle_webhook_events(event_context = {})
|
|
9
|
+
@webhook_event_listener = PactBroker::Webhooks::EventListener.new(webhook_options(event_context))
|
|
24
10
|
PactBroker::Events.subscribe(webhook_event_listener) do
|
|
25
11
|
yield
|
|
26
12
|
end
|
|
27
13
|
end
|
|
28
14
|
|
|
29
15
|
def schedule_triggered_webhooks
|
|
30
|
-
webhook_event_listener
|
|
16
|
+
webhook_event_listener&.schedule_triggered_webhooks
|
|
31
17
|
end
|
|
32
18
|
|
|
33
19
|
def finish_request
|
|
@@ -36,6 +22,26 @@ module PactBroker
|
|
|
36
22
|
end
|
|
37
23
|
super
|
|
38
24
|
end
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def webhook_options(event_context = {})
|
|
28
|
+
{
|
|
29
|
+
database_connector: database_connector,
|
|
30
|
+
webhook_execution_configuration: webhook_execution_configuration.with_webhook_context(event_context)
|
|
31
|
+
}
|
|
32
|
+
end
|
|
33
|
+
private :webhook_options
|
|
34
|
+
|
|
35
|
+
def webhook_execution_configuration
|
|
36
|
+
application_context.webhook_execution_configuration_creator.call(self)
|
|
37
|
+
end
|
|
38
|
+
private :webhook_execution_configuration
|
|
39
|
+
|
|
40
|
+
def webhook_event_listener
|
|
41
|
+
@webhook_event_listener
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private :webhook_event_listener
|
|
39
45
|
end
|
|
40
46
|
end
|
|
41
47
|
end
|
data/lib/pact_broker/api.rb
CHANGED
|
@@ -49,6 +49,7 @@ module PactBroker
|
|
|
49
49
|
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "version", :consumer_version_number, "verification-results", "latest"], Api::Resources::LatestVerificationForPact, {resource_name: "latest_verification_results_for_pact_publication"}
|
|
50
50
|
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "pact-version", :pact_version_sha, "verification-results", "latest"], Api::Resources::LatestVerificationForPact, {resource_name: "latest_verification_results_for_pact_version"}
|
|
51
51
|
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "pact-version", :pact_version_sha, "verification-results", :verification_number], Api::Resources::Verification, {resource_name: "verification_result"}
|
|
52
|
+
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "pact-version", :pact_version_sha, "metadata", :metadata, "verification-results", :verification_number], Api::Resources::Verification, {resource_name: "verification_result"}
|
|
52
53
|
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "pact-version", :pact_version_sha, "verification-results", :verification_number, "triggered-webhooks"], Api::Resources::VerificationTriggeredWebhooks, {resource_name: "verification_result_triggered_webhooks"}
|
|
53
54
|
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "latest", "verification-results","latest"], Api::Resources::LatestVerificationForLatestPact, {resource_name: "latest_verification_results_for_latest_pact_publication"}
|
|
54
55
|
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "latest", :tag, "verification-results","latest"], Api::Resources::LatestVerificationForLatestPact, {resource_name: "latest_verification_results_for_latest_tagged_pact_publication"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require "pact_broker/api/decorators/configuration"
|
|
2
|
+
require "pact_broker/api/contracts/configuration"
|
|
2
3
|
require "pact_broker/api/decorators/decorator_context_creator"
|
|
3
4
|
require "pact_broker/webhooks/execution_configuration_creator"
|
|
4
5
|
require "pact_broker/errors/error_logger"
|
|
@@ -7,6 +8,7 @@ require "pact_broker/api/resources/error_response_body_generator"
|
|
|
7
8
|
module PactBroker
|
|
8
9
|
class ApplicationContext
|
|
9
10
|
attr_reader :decorator_configuration,
|
|
11
|
+
:api_contract_configuration,
|
|
10
12
|
:decorator_context_creator,
|
|
11
13
|
:webhook_execution_configuration_creator,
|
|
12
14
|
:resource_authorizer,
|
|
@@ -18,6 +20,7 @@ module PactBroker
|
|
|
18
20
|
def initialize(params = {})
|
|
19
21
|
params_with_defaults = {
|
|
20
22
|
decorator_configuration: PactBroker::Api::Decorators::Configuration.default_configuration,
|
|
23
|
+
api_contract_configuration: PactBroker::Api::Contracts::Configuration.default_configuration,
|
|
21
24
|
decorator_context_creator: PactBroker::Api::Decorators::DecoratorContextCreator,
|
|
22
25
|
webhook_execution_configuration_creator: PactBroker::Webhooks::ExecutionConfigurationCreator,
|
|
23
26
|
error_logger: PactBroker::Errors::ErrorLogger,
|
|
@@ -25,6 +28,7 @@ module PactBroker
|
|
|
25
28
|
}.merge(params)
|
|
26
29
|
|
|
27
30
|
@decorator_configuration = params_with_defaults[:decorator_configuration]
|
|
31
|
+
@api_contract_configuration = params_with_defaults[:api_contract_configuration]
|
|
28
32
|
@decorator_context_creator = params_with_defaults[:decorator_context_creator]
|
|
29
33
|
@webhook_execution_configuration_creator = params_with_defaults[:webhook_execution_configuration_creator]
|
|
30
34
|
@resource_authorizer = params_with_defaults[:resource_authorizer]
|
|
@@ -32,6 +36,7 @@ module PactBroker
|
|
|
32
36
|
@after_resource = params_with_defaults[:after_resource]
|
|
33
37
|
@error_logger = params_with_defaults[:error_logger]
|
|
34
38
|
@error_response_body_generator = params_with_defaults[:error_response_body_generator]
|
|
39
|
+
|
|
35
40
|
end
|
|
36
41
|
|
|
37
42
|
def self.default_application_context(overrides = {})
|
|
@@ -51,13 +51,17 @@ module PactBroker
|
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
def delete_webhook_data
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
54
|
+
ltw_join = {
|
|
55
|
+
Sequel[:triggered_webhooks][:id] => Sequel[:ltw][:id]
|
|
56
|
+
}
|
|
57
|
+
resolved_ids_to_delete = db[:triggered_webhooks]
|
|
58
|
+
.select(Sequel[:triggered_webhooks][:id])
|
|
59
|
+
.left_join(:latest_triggered_webhooks, ltw_join, { table_alias: :ltw })
|
|
60
|
+
.where(Sequel[:ltw][:id] => nil)
|
|
61
|
+
.where(Sequel.lit("triggered_webhooks.created_at < ?", cut_off_date))
|
|
62
|
+
.order(Sequel[:triggered_webhooks][:id])
|
|
63
|
+
.limit(limit)
|
|
64
|
+
.collect{ |row| row[:id] }
|
|
61
65
|
|
|
62
66
|
PactBroker::Webhooks::TriggeredWebhook.where(id: resolved_ids_to_delete).delete unless dry_run?
|
|
63
67
|
{ triggered_webhooks: resolved_ids_to_delete.count }
|
|
@@ -65,36 +69,50 @@ module PactBroker
|
|
|
65
69
|
|
|
66
70
|
def delete_orphan_pact_versions
|
|
67
71
|
referenced_pact_version_ids = db[:pact_publications].select(:pact_version_id).union(db[:verifications].select(:pact_version_id))
|
|
68
|
-
|
|
72
|
+
rpv_join = {
|
|
73
|
+
Sequel[:pact_versions][:id] => Sequel[:rpv][:pact_version_id]
|
|
74
|
+
}
|
|
75
|
+
pact_version_ids_to_delete = db[:pact_versions]
|
|
76
|
+
.select(Sequel[:pact_versions][:id])
|
|
77
|
+
.left_join(referenced_pact_version_ids, rpv_join, { table_alias: :rpv })
|
|
78
|
+
.where(Sequel[:rpv][:pact_version_id] => nil)
|
|
79
|
+
.order(Sequel[:pact_versions][:id])
|
|
80
|
+
.limit(limit)
|
|
81
|
+
.collect{ |row| row[:id] }
|
|
69
82
|
db[:pact_versions].where(id: pact_version_ids_to_delete).delete unless dry_run?
|
|
70
83
|
{ pact_versions: pact_version_ids_to_delete.count }
|
|
71
84
|
end
|
|
72
85
|
|
|
73
86
|
def delete_overwritten_pact_publications
|
|
74
|
-
|
|
87
|
+
lp_join = {
|
|
88
|
+
Sequel[:pact_publications][:id] => Sequel[:lp][:pact_publication_id]
|
|
89
|
+
}
|
|
75
90
|
|
|
76
91
|
resolved_ids_to_delete = db[:pact_publications]
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
92
|
+
.select(Sequel[:pact_publications][:id])
|
|
93
|
+
.left_join(:latest_pact_publication_ids_for_consumer_versions, lp_join, { table_alias: :lp })
|
|
94
|
+
.where(Sequel[:lp][:pact_publication_id] => nil)
|
|
95
|
+
.where(Sequel.lit("pact_publications.created_at < ?", cut_off_date))
|
|
96
|
+
.order(:id)
|
|
97
|
+
.limit(limit)
|
|
98
|
+
.collect{ |row| row[:id] }
|
|
83
99
|
|
|
84
100
|
PactBroker::Pacts::PactPublication.where(id: resolved_ids_to_delete).delete unless dry_run?
|
|
85
|
-
|
|
86
101
|
{ pact_publications: resolved_ids_to_delete.count }
|
|
87
102
|
end
|
|
88
103
|
|
|
89
104
|
def delete_overwritten_verifications
|
|
90
|
-
|
|
105
|
+
lv_join = {
|
|
106
|
+
Sequel[:verifications][:id] => Sequel[:lv][:verification_id]
|
|
107
|
+
}
|
|
91
108
|
resolved_ids_to_delete = db[:verifications]
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
109
|
+
.select(Sequel[:verifications][:id])
|
|
110
|
+
.left_join(:latest_verification_id_for_pact_version_and_provider_version, lv_join, { table_alias: :lv})
|
|
111
|
+
.where(Sequel[:lv][:verification_id] => nil)
|
|
112
|
+
.where(Sequel.lit("verifications.created_at < ?", cut_off_date))
|
|
113
|
+
.order(Sequel[:verifications][:id])
|
|
114
|
+
.limit(limit)
|
|
115
|
+
.collect{ |row| row[:id] }
|
|
98
116
|
|
|
99
117
|
PactBroker::Domain::Verification.where(id: resolved_ids_to_delete).delete unless dry_run?
|
|
100
118
|
{ verification_results: resolved_ids_to_delete.count }
|
|
@@ -117,6 +117,7 @@ end
|
|
|
117
117
|
# undeployed_at | timestamp without time zone |
|
|
118
118
|
# target | text |
|
|
119
119
|
# target_for_index | text | NOT NULL DEFAULT ''::text
|
|
120
|
+
# auto_created | boolean | DEFAULT false
|
|
120
121
|
# Indexes:
|
|
121
122
|
# deployed_versions_pkey | PRIMARY KEY btree (id)
|
|
122
123
|
# deployed_versions_uuid_index | UNIQUE btree (uuid)
|