pact_broker 2.100.0 → 2.101.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/Gemfile +1 -0
- data/docs/api/PACTICIPANTS.md +290 -0
- data/docs/api/WEBHOOKS.md +40 -40
- data/lib/db.rb +1 -1
- data/lib/pact_broker/api/decorators/triggered_webhook_decorator.rb +1 -2
- data/lib/pact_broker/api/resources/all_webhooks.rb +1 -4
- data/lib/pact_broker/api/resources/base_resource.rb +51 -5
- data/lib/pact_broker/api/resources/branch_version.rb +10 -1
- data/lib/pact_broker/api/resources/clean.rb +11 -9
- data/lib/pact_broker/api/resources/currently_deployed_versions_for_environment.rb +0 -4
- data/lib/pact_broker/api/resources/currently_supported_versions_for_environment.rb +0 -4
- data/lib/pact_broker/api/resources/deployed_version.rb +12 -14
- data/lib/pact_broker/api/resources/deployed_versions_for_version_and_environment.rb +4 -0
- data/lib/pact_broker/api/resources/environment.rb +5 -5
- data/lib/pact_broker/api/resources/environments.rb +1 -5
- data/lib/pact_broker/api/resources/label.rb +4 -0
- data/lib/pact_broker/api/resources/pact.rb +10 -5
- data/lib/pact_broker/api/resources/pact_webhooks.rb +1 -4
- data/lib/pact_broker/api/resources/pacticipant.rb +11 -5
- data/lib/pact_broker/api/resources/pacticipant_webhooks.rb +1 -4
- data/lib/pact_broker/api/resources/pacticipants.rb +1 -4
- data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +19 -11
- data/lib/pact_broker/api/resources/publish_contracts.rb +11 -15
- data/lib/pact_broker/api/resources/released_version.rb +12 -6
- data/lib/pact_broker/api/resources/released_versions_for_version_and_environment.rb +10 -6
- data/lib/pact_broker/api/resources/tag.rb +7 -3
- data/lib/pact_broker/api/resources/verifications.rb +7 -9
- data/lib/pact_broker/api/resources/version.rb +8 -8
- data/lib/pact_broker/api/resources/webhook.rb +5 -4
- data/lib/pact_broker/api/resources/webhook_execution.rb +4 -6
- data/lib/pact_broker/doc/views/index/pacticipant-branch-version.markdown +13 -2
- data/lib/pact_broker/doc/views/provider-pacts-for-verification.markdown +1 -1
- data/lib/pact_broker/domain/pacticipant.rb +1 -0
- data/lib/pact_broker/locale/en.yml +1 -0
- data/lib/pact_broker/pacticipants/repository.rb +5 -4
- data/lib/pact_broker/pacts/generate_sha.rb +1 -0
- data/lib/pact_broker/pacts/verifiable_pact_messages.rb +1 -1
- data/lib/pact_broker/test/test_data_builder.rb +20 -0
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/versions/branch_service.rb +7 -0
- data/lib/pact_broker/versions/branch_version_repository.rb +17 -0
- data/lib/rack/pact_broker/cascade.rb +87 -0
- data/lib/webmachine/describe_routes.rb +43 -9
- metadata +5 -4
- data/lib/pact_broker/api/resources/default_base_resource.rb +0 -0
@@ -15,6 +15,7 @@ module PactBroker
|
|
15
15
|
module Api
|
16
16
|
module Resources
|
17
17
|
class InvalidJsonError < PactBroker::Error ; end
|
18
|
+
class NonUTF8CharacterFound < PactBroker::Error ; end
|
18
19
|
|
19
20
|
class BaseResource < Webmachine::Resource
|
20
21
|
include PactBroker::Services
|
@@ -39,6 +40,10 @@ module PactBroker
|
|
39
40
|
super + ["PATCH"]
|
40
41
|
end
|
41
42
|
|
43
|
+
def malformed_request?
|
44
|
+
content_type_is_json_but_invalid_json_provided?
|
45
|
+
end
|
46
|
+
|
42
47
|
def finish_request
|
43
48
|
application_context.after_resource&.call(self)
|
44
49
|
PactBroker.configuration.after_resource.call(self)
|
@@ -125,17 +130,32 @@ module PactBroker
|
|
125
130
|
else
|
126
131
|
@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.
|
127
132
|
end
|
128
|
-
rescue
|
129
|
-
|
133
|
+
rescue StandardError => e
|
134
|
+
fragment = fragment_before_invalid_utf_8_char
|
135
|
+
|
136
|
+
if fragment
|
137
|
+
raise NonUTF8CharacterFound.new(message("errors.non_utf_8_char_in_request_body", char_number: fragment.length + 1, fragment: fragment))
|
138
|
+
else
|
139
|
+
raise InvalidJsonError.new(e.message)
|
140
|
+
end
|
130
141
|
end
|
131
142
|
# rubocop: enable Metrics/CyclomaticComplexity
|
132
143
|
|
144
|
+
def fragment_before_invalid_utf_8_char
|
145
|
+
request_body.each_char.with_index do | char, index |
|
146
|
+
if !char.valid_encoding?
|
147
|
+
return index < 100 ? request_body[0...index] : request_body[index-100...index]
|
148
|
+
end
|
149
|
+
end
|
150
|
+
nil
|
151
|
+
end
|
152
|
+
|
133
153
|
def params_with_string_keys
|
134
154
|
params(symbolize_names: false)
|
135
155
|
end
|
136
156
|
|
137
157
|
def pact_params
|
138
|
-
@pact_params ||= PactBroker::Pacts::PactParams.from_request
|
158
|
+
@pact_params ||= PactBroker::Pacts::PactParams.from_request(request, identifier_from_path)
|
139
159
|
end
|
140
160
|
|
141
161
|
def set_json_error_message message
|
@@ -192,9 +212,15 @@ module PactBroker
|
|
192
212
|
begin
|
193
213
|
params
|
194
214
|
false
|
215
|
+
rescue NonUTF8CharacterFound => e
|
216
|
+
logger.info(e.message) # Don't use the default SemanticLogger error logging method because it will try and print out the cause which will contain non UTF-8 chars in the message
|
217
|
+
set_json_error_message(e.message)
|
218
|
+
response.headers["Content-Type"] = "application/hal+json;charset=utf-8"
|
219
|
+
true
|
195
220
|
rescue StandardError => e
|
196
|
-
|
197
|
-
|
221
|
+
message = "#{e.cause ? e.cause.class.name : e.class.name} - #{e.message}"
|
222
|
+
logger.info(message)
|
223
|
+
set_json_error_message(message)
|
198
224
|
response.headers["Content-Type"] = "application/hal+json;charset=utf-8"
|
199
225
|
true
|
200
226
|
end
|
@@ -279,6 +305,26 @@ module PactBroker
|
|
279
305
|
def malformed_request_for_json_with_schema?(schema_to_use = schema, params_to_validate = params)
|
280
306
|
invalid_json? || validation_errors_for_schema?(schema_to_use, params_to_validate)
|
281
307
|
end
|
308
|
+
|
309
|
+
def content_type_is_json_but_invalid_json_provided?
|
310
|
+
content_type_json? && any_request_body? && invalid_json?
|
311
|
+
end
|
312
|
+
|
313
|
+
def content_type_json?
|
314
|
+
request.content_type&.include?("json")
|
315
|
+
end
|
316
|
+
|
317
|
+
# Not a Webmachine method. This is used by security policy code to identify whether
|
318
|
+
# a PUT to a non existing resource can create a new object.
|
319
|
+
def put_can_create?
|
320
|
+
false
|
321
|
+
end
|
322
|
+
|
323
|
+
# Not a Webmachine method. This is used by security policy code to identify whether
|
324
|
+
# a PATCH to a non existing resource can create a new object.
|
325
|
+
def patch_can_create?
|
326
|
+
false
|
327
|
+
end
|
282
328
|
end
|
283
329
|
end
|
284
330
|
end
|
@@ -14,7 +14,11 @@ module PactBroker
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def allowed_methods
|
17
|
-
["GET", "PUT", "OPTIONS"]
|
17
|
+
["GET", "PUT", "DELETE", "OPTIONS"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def put_can_create?
|
21
|
+
true
|
18
22
|
end
|
19
23
|
|
20
24
|
def resource_exists?
|
@@ -25,6 +29,11 @@ module PactBroker
|
|
25
29
|
decorator_class(:branch_version_decorator).new(branch_version).to_json(decorator_options)
|
26
30
|
end
|
27
31
|
|
32
|
+
def delete_resource
|
33
|
+
branch_service.delete_branch_version(branch_version)
|
34
|
+
true
|
35
|
+
end
|
36
|
+
|
28
37
|
def from_json
|
29
38
|
already_existed = !!branch_version
|
30
39
|
@branch_version = branch_service.find_or_create_branch_version(identifier_from_path)
|
@@ -2,14 +2,12 @@ require "pact_broker/api/resources/base_resource"
|
|
2
2
|
require "pact_broker/db/clean"
|
3
3
|
require "pact_broker/matrix/unresolved_selector"
|
4
4
|
|
5
|
+
# Not exposed yet as we'd need to support administrator auth first
|
6
|
+
|
5
7
|
module PactBroker
|
6
8
|
module Api
|
7
9
|
module Resources
|
8
10
|
class Clean < BaseResource
|
9
|
-
def content_types_accepted
|
10
|
-
[["application/json"]]
|
11
|
-
end
|
12
|
-
|
13
11
|
def content_types_provided
|
14
12
|
[["application/hal+json"]]
|
15
13
|
end
|
@@ -19,12 +17,16 @@ module PactBroker
|
|
19
17
|
end
|
20
18
|
|
21
19
|
def process_post
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
if content_type_json?
|
21
|
+
keep_selectors = (params[:keep] || []).collect do | hash |
|
22
|
+
PactBroker::Matrix::UnresolvedSelector.new(hash)
|
23
|
+
end
|
25
24
|
|
26
|
-
|
27
|
-
|
25
|
+
result = PactBroker::DB::Clean.call(Sequel::Model.db, { keep: keep_selectors })
|
26
|
+
response.body = result.to_json
|
27
|
+
else
|
28
|
+
415
|
29
|
+
end
|
28
30
|
end
|
29
31
|
|
30
32
|
def policy_name
|
@@ -8,10 +8,6 @@ module PactBroker
|
|
8
8
|
class CurrentlyDeployedVersionsForEnvironment < BaseResource
|
9
9
|
using PactBroker::StringRefinements
|
10
10
|
|
11
|
-
def content_types_accepted
|
12
|
-
[["application/json", :from_json]]
|
13
|
-
end
|
14
|
-
|
15
11
|
def content_types_provided
|
16
12
|
[["application/hal+json", :to_json]]
|
17
13
|
end
|
@@ -8,10 +8,6 @@ module PactBroker
|
|
8
8
|
class CurrentlySupportedVersionsForEnvironment < BaseResource
|
9
9
|
using PactBroker::StringRefinements
|
10
10
|
|
11
|
-
def content_types_accepted
|
12
|
-
[["application/json", :from_json]]
|
13
|
-
end
|
14
|
-
|
15
11
|
def content_types_provided
|
16
12
|
[["application/hal+json", :to_json]]
|
17
13
|
end
|
@@ -8,11 +8,6 @@ module PactBroker
|
|
8
8
|
class DeployedVersion < BaseResource
|
9
9
|
include PactBroker::Messages
|
10
10
|
|
11
|
-
def initialize
|
12
|
-
super
|
13
|
-
@currently_deployed_param = params(default: {})[:currentlyDeployed]
|
14
|
-
end
|
15
|
-
|
16
11
|
def content_types_provided
|
17
12
|
[
|
18
13
|
["application/hal+json", :to_json]
|
@@ -29,16 +24,12 @@ module PactBroker
|
|
29
24
|
["GET", "PATCH", "OPTIONS"]
|
30
25
|
end
|
31
26
|
|
32
|
-
def
|
33
|
-
|
27
|
+
def patch_can_create?
|
28
|
+
false
|
34
29
|
end
|
35
30
|
|
36
|
-
def
|
37
|
-
|
38
|
-
return invalid_json?
|
39
|
-
else
|
40
|
-
false
|
41
|
-
end
|
31
|
+
def resource_exists?
|
32
|
+
!!deployed_version
|
42
33
|
end
|
43
34
|
|
44
35
|
def to_json
|
@@ -73,7 +64,14 @@ module PactBroker
|
|
73
64
|
|
74
65
|
private
|
75
66
|
|
76
|
-
|
67
|
+
# can't use ||= with a potentially nil value
|
68
|
+
def currently_deployed_param
|
69
|
+
if defined?(@currently_deployed_param)
|
70
|
+
@currently_deployed_param
|
71
|
+
else
|
72
|
+
@currently_deployed_param = params(default: {})[:currentlyDeployed]
|
73
|
+
end
|
74
|
+
end
|
77
75
|
|
78
76
|
def process_currently_deployed_param
|
79
77
|
if currently_deployed_param == false
|
@@ -17,16 +17,16 @@ module PactBroker
|
|
17
17
|
["GET", "PUT", "DELETE", "OPTIONS"]
|
18
18
|
end
|
19
19
|
|
20
|
+
def put_can_create?
|
21
|
+
false
|
22
|
+
end
|
23
|
+
|
20
24
|
def resource_exists?
|
21
25
|
!!environment
|
22
26
|
end
|
23
27
|
|
24
28
|
def malformed_request?
|
25
|
-
|
26
|
-
invalid_json? || validation_errors_for_schema?(schema, params.merge(uuid: uuid))
|
27
|
-
else
|
28
|
-
false
|
29
|
-
end
|
29
|
+
super || (request.put? && environment && validation_errors_for_schema?(schema, params.merge(uuid: uuid)))
|
30
30
|
end
|
31
31
|
|
32
32
|
def from_json
|
@@ -27,11 +27,7 @@ module PactBroker
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def malformed_request?
|
30
|
-
|
31
|
-
invalid_json? || validation_errors_for_schema?(schema, params.merge(uuid: uuid))
|
32
|
-
else
|
33
|
-
false
|
34
|
-
end
|
30
|
+
super || (request.post? && validation_errors_for_schema?(schema, params.merge(uuid: uuid)))
|
35
31
|
end
|
36
32
|
|
37
33
|
def create_path
|
@@ -36,18 +36,23 @@ module PactBroker
|
|
36
36
|
["GET", "PUT", "DELETE", "PATCH", "OPTIONS"]
|
37
37
|
end
|
38
38
|
|
39
|
+
def put_can_create?
|
40
|
+
true
|
41
|
+
end
|
42
|
+
|
43
|
+
def patch_can_create?
|
44
|
+
true
|
45
|
+
end
|
46
|
+
|
39
47
|
def is_conflict?
|
40
48
|
merge_conflict = request.patch? && resource_exists? && Pacts::Merger.conflict?(pact.json_content, pact_params.json_content)
|
41
49
|
|
42
50
|
potential_duplicate_pacticipants?(pact_params.pacticipant_names) || merge_conflict || disallowed_modification?
|
43
51
|
end
|
44
52
|
|
53
|
+
|
45
54
|
def malformed_request?
|
46
|
-
|
47
|
-
invalid_json? || contract_validation_errors?(Contracts::PutPactParamsContract.new(pact_params), pact_params)
|
48
|
-
else
|
49
|
-
false
|
50
|
-
end
|
55
|
+
super || ((request.patch? || request.really_put?) && contract_validation_errors?(Contracts::PutPactParamsContract.new(pact_params), pact_params))
|
51
56
|
end
|
52
57
|
|
53
58
|
def resource_exists?
|
@@ -21,18 +21,23 @@ module PactBroker
|
|
21
21
|
["GET", "PUT", "PATCH", "DELETE", "OPTIONS"]
|
22
22
|
end
|
23
23
|
|
24
|
+
def put_can_create?
|
25
|
+
false
|
26
|
+
end
|
27
|
+
|
28
|
+
def patch_can_create?
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
24
32
|
def known_methods
|
25
33
|
super + ["PATCH"]
|
26
34
|
end
|
27
35
|
|
28
36
|
def malformed_request?
|
29
|
-
|
30
|
-
invalid_json? || validation_errors_for_schema?
|
31
|
-
else
|
32
|
-
false
|
33
|
-
end
|
37
|
+
super || ((request.patch? || request.really_put?) && validation_errors_for_schema?)
|
34
38
|
end
|
35
39
|
|
40
|
+
# PUT or PATCH with content-type application/json
|
36
41
|
def from_json
|
37
42
|
if pacticipant
|
38
43
|
@pacticipant = update_existing_pacticipant
|
@@ -47,6 +52,7 @@ module PactBroker
|
|
47
52
|
response.body = to_json
|
48
53
|
end
|
49
54
|
|
55
|
+
# PUT or PATCH with content-type application/merge-patch+json
|
50
56
|
def from_merge_patch_json
|
51
57
|
if request.patch?
|
52
58
|
from_json
|
@@ -11,28 +11,27 @@ module PactBroker
|
|
11
11
|
class ProviderPactsForVerification < ProviderPacts
|
12
12
|
using PactBroker::HashRefinements
|
13
13
|
|
14
|
+
def content_types_provided
|
15
|
+
[["application/hal+json", :to_json]]
|
16
|
+
end
|
17
|
+
|
14
18
|
def allowed_methods
|
15
19
|
["GET", "POST", "OPTIONS"]
|
16
20
|
end
|
17
21
|
|
18
|
-
def
|
19
|
-
|
22
|
+
def malformed_request?
|
23
|
+
super || ((request.get? || (request.post? && content_type_json?)) && schema_validation_errors?)
|
20
24
|
end
|
21
25
|
|
22
|
-
def
|
23
|
-
if
|
24
|
-
|
26
|
+
def process_post
|
27
|
+
if content_type_json?
|
28
|
+
response.body = to_json
|
25
29
|
true
|
26
30
|
else
|
27
|
-
|
31
|
+
415
|
28
32
|
end
|
29
33
|
end
|
30
34
|
|
31
|
-
def process_post
|
32
|
-
response.body = to_json
|
33
|
-
true
|
34
|
-
end
|
35
|
-
|
36
35
|
def read_methods
|
37
36
|
super + %w{POST}
|
38
37
|
end
|
@@ -96,6 +95,15 @@ module PactBroker
|
|
96
95
|
def nested_query
|
97
96
|
@nested_query ||= Rack::Utils.parse_nested_query(request.uri.query)
|
98
97
|
end
|
98
|
+
|
99
|
+
def schema_validation_errors?
|
100
|
+
if (errors = query_schema.call(query)).any?
|
101
|
+
set_json_validation_error_messages(errors)
|
102
|
+
true
|
103
|
+
else
|
104
|
+
false
|
105
|
+
end
|
106
|
+
end
|
99
107
|
end
|
100
108
|
end
|
101
109
|
end
|
@@ -11,11 +11,7 @@ module PactBroker
|
|
11
11
|
include WebhookExecutionMethods
|
12
12
|
|
13
13
|
def content_types_provided
|
14
|
-
[["application/hal+json"
|
15
|
-
end
|
16
|
-
|
17
|
-
def content_types_accepted
|
18
|
-
[["application/json"]]
|
14
|
+
[["application/hal+json"]]
|
19
15
|
end
|
20
16
|
|
21
17
|
def allowed_methods
|
@@ -23,20 +19,20 @@ module PactBroker
|
|
23
19
|
end
|
24
20
|
|
25
21
|
def malformed_request?
|
26
|
-
|
27
|
-
invalid_json? || validation_errors_for_schema?
|
28
|
-
else
|
29
|
-
false
|
30
|
-
end
|
22
|
+
super || (request.post? && content_type_json? && validation_errors_for_schema?)
|
31
23
|
end
|
32
24
|
|
33
25
|
def process_post
|
34
|
-
if
|
35
|
-
|
36
|
-
|
26
|
+
if content_type_json?
|
27
|
+
if conflict_notices.any?
|
28
|
+
set_conflict_response
|
29
|
+
409
|
30
|
+
else
|
31
|
+
publish_contracts
|
32
|
+
true
|
33
|
+
end
|
37
34
|
else
|
38
|
-
|
39
|
-
true
|
35
|
+
415
|
40
36
|
end
|
41
37
|
end
|
42
38
|
|
@@ -8,11 +8,6 @@ module PactBroker
|
|
8
8
|
class ReleasedVersion < BaseResource
|
9
9
|
include PactBroker::Messages
|
10
10
|
|
11
|
-
def initialize
|
12
|
-
super
|
13
|
-
@currently_supported_param = params(default: {})[:currentlySupported]
|
14
|
-
end
|
15
|
-
|
16
11
|
def content_types_provided
|
17
12
|
[["application/hal+json", :to_json]]
|
18
13
|
end
|
@@ -27,6 +22,10 @@ module PactBroker
|
|
27
22
|
["GET", "PATCH", "OPTIONS"]
|
28
23
|
end
|
29
24
|
|
25
|
+
def patch_can_create?
|
26
|
+
false
|
27
|
+
end
|
28
|
+
|
30
29
|
def resource_exists?
|
31
30
|
!!released_version
|
32
31
|
end
|
@@ -63,7 +62,14 @@ module PactBroker
|
|
63
62
|
|
64
63
|
private
|
65
64
|
|
66
|
-
|
65
|
+
# can't use ||= with a potentially nil value
|
66
|
+
def currently_supported_param
|
67
|
+
if defined?(@currently_deployed_param)
|
68
|
+
@currently_supported_param
|
69
|
+
else
|
70
|
+
@currently_supported_param = params(default: {})[:currentlySupported]
|
71
|
+
end
|
72
|
+
end
|
67
73
|
|
68
74
|
def process_currently_supported_param
|
69
75
|
if currently_supported_param == false
|
@@ -5,11 +5,6 @@ module PactBroker
|
|
5
5
|
module Api
|
6
6
|
module Resources
|
7
7
|
class ReleasedVersionsForVersionAndEnvironment < BaseResource
|
8
|
-
def initialize
|
9
|
-
super
|
10
|
-
@existing_released_version = version && environment && released_version_service.find_released_version_for_version_and_environment(version, environment)
|
11
|
-
end
|
12
|
-
|
13
8
|
def content_types_accepted
|
14
9
|
[["application/json", :from_json]]
|
15
10
|
end
|
@@ -35,6 +30,7 @@ module PactBroker
|
|
35
30
|
end
|
36
31
|
|
37
32
|
def from_json
|
33
|
+
existing_released_version # make sure we have this before we update the database
|
38
34
|
@released_version = released_version_service.create_or_update(next_released_version_uuid, version, environment)
|
39
35
|
response.body = decorator_class(:released_version_decorator).new(released_version).to_json(decorator_options)
|
40
36
|
true
|
@@ -61,7 +57,15 @@ module PactBroker
|
|
61
57
|
|
62
58
|
private
|
63
59
|
|
64
|
-
attr_reader :released_version
|
60
|
+
attr_reader :released_version
|
61
|
+
|
62
|
+
def existing_released_version
|
63
|
+
if defined?(@existing_released_version)
|
64
|
+
@existing_released_version
|
65
|
+
else
|
66
|
+
@existing_released_version = version && environment && released_version_service.find_released_version_for_version_and_environment(version, environment)
|
67
|
+
end
|
68
|
+
end
|
65
69
|
|
66
70
|
def version
|
67
71
|
@version ||= version_service.find_by_pacticipant_name_and_number(identifier_from_path)
|
@@ -17,9 +17,13 @@ module PactBroker
|
|
17
17
|
["GET","PUT","DELETE", "OPTIONS"]
|
18
18
|
end
|
19
19
|
|
20
|
+
def put_can_create?
|
21
|
+
true
|
22
|
+
end
|
23
|
+
|
20
24
|
def from_json
|
21
25
|
unless tag
|
22
|
-
@tag = tag_service.create
|
26
|
+
@tag = tag_service.create(identifier_from_path)
|
23
27
|
# Make it return a 201 by setting the Location header
|
24
28
|
response.headers["Location"] = tag_url(base_url, tag)
|
25
29
|
end
|
@@ -36,11 +40,11 @@ module PactBroker
|
|
36
40
|
end
|
37
41
|
|
38
42
|
def tag
|
39
|
-
@tag ||= tag_service.find
|
43
|
+
@tag ||= tag_service.find(identifier_from_path)
|
40
44
|
end
|
41
45
|
|
42
46
|
def delete_resource
|
43
|
-
tag_service.delete
|
47
|
+
tag_service.delete(identifier_from_path)
|
44
48
|
true
|
45
49
|
end
|
46
50
|
|
@@ -34,15 +34,7 @@ module PactBroker
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def malformed_request?
|
37
|
-
|
38
|
-
return true if invalid_json?
|
39
|
-
errors = verification_service.errors(params)
|
40
|
-
if !errors.empty?
|
41
|
-
set_json_validation_error_messages(errors.messages)
|
42
|
-
return true
|
43
|
-
end
|
44
|
-
end
|
45
|
-
false
|
37
|
+
super || (request.post? && any_validation_errors?)
|
46
38
|
end
|
47
39
|
|
48
40
|
def create_path
|
@@ -91,6 +83,12 @@ module PactBroker
|
|
91
83
|
def verification_params
|
92
84
|
params(symbolize_names: false).merge("wip" => wip?, "pending" => pending?)
|
93
85
|
end
|
86
|
+
|
87
|
+
def any_validation_errors?
|
88
|
+
errors = verification_service.errors(params)
|
89
|
+
set_json_validation_error_messages(errors.messages) if !errors.empty?
|
90
|
+
!errors.empty?
|
91
|
+
end
|
94
92
|
end
|
95
93
|
end
|
96
94
|
end
|
@@ -21,16 +21,16 @@ module PactBroker
|
|
21
21
|
["GET", "PUT", "PATCH", "DELETE", "OPTIONS"]
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
25
|
-
|
24
|
+
def put_can_create?
|
25
|
+
true
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
def patch_can_create?
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
32
|
+
def resource_exists?
|
33
|
+
!!version
|
34
34
|
end
|
35
35
|
|
36
36
|
def from_json
|