pact_broker 2.34.0 → 2.35.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +2 -0
  3. data/.github/FUNDING.yml +4 -0
  4. data/.travis.yml +1 -1
  5. data/CHANGELOG.md +34 -0
  6. data/DEVELOPER_DOCUMENTATION.md +24 -1
  7. data/DEVELOPER_SETUP.md +40 -20
  8. data/Dockerfile +22 -0
  9. data/db/migrations/000028_create_all_pact_publications.rb +0 -1
  10. data/db/migrations/20180311_optimise_head_matrix.rb +0 -1
  11. data/lib/pact/doc/doc_file.rb +0 -1
  12. data/lib/pact_broker/api/contracts/webhook_contract.rb +1 -1
  13. data/lib/pact_broker/api/decorators/decorator_context.rb +5 -5
  14. data/lib/pact_broker/api/decorators/pact_decorator.rb +0 -1
  15. data/lib/pact_broker/api/decorators/pact_pacticipant_decorator.rb +0 -1
  16. data/lib/pact_broker/api/decorators/tag_decorator.rb +0 -1
  17. data/lib/pact_broker/api/decorators/webhook_decorator.rb +0 -1
  18. data/lib/pact_broker/api/decorators/webhook_execution_result_decorator.rb +8 -5
  19. data/lib/pact_broker/api/decorators/webhook_request_template_decorator.rb +1 -4
  20. data/lib/pact_broker/api/decorators/webhooks_decorator.rb +1 -2
  21. data/lib/pact_broker/api/resources/base_resource.rb +0 -1
  22. data/lib/pact_broker/api/resources/error_handler.rb +14 -7
  23. data/lib/pact_broker/api/resources/pact.rb +4 -9
  24. data/lib/pact_broker/api/resources/pact_webhooks.rb +0 -1
  25. data/lib/pact_broker/api/resources/verifications.rb +4 -8
  26. data/lib/pact_broker/api/resources/webhook.rb +4 -8
  27. data/lib/pact_broker/api/resources/webhook_execution.rb +36 -17
  28. data/lib/pact_broker/api/resources/webhook_execution_methods.rb +13 -0
  29. data/lib/pact_broker/api/resources/webhook_resource_methods.rb +8 -15
  30. data/lib/pact_broker/api/resources/webhooks.rb +3 -12
  31. data/lib/pact_broker/api.rb +1 -1
  32. data/lib/pact_broker/app.rb +2 -0
  33. data/lib/pact_broker/domain/webhook.rb +29 -18
  34. data/lib/pact_broker/hash_refinements.rb +13 -0
  35. data/lib/pact_broker/locale/en.yml +16 -0
  36. data/lib/pact_broker/logging.rb +1 -1
  37. data/lib/pact_broker/pacts/diff.rb +0 -1
  38. data/lib/pact_broker/pacts/pact_version.rb +13 -7
  39. data/lib/pact_broker/pacts/repository.rb +4 -6
  40. data/lib/pact_broker/pacts/service.rb +3 -4
  41. data/lib/pact_broker/repositories/helpers.rb +1 -1
  42. data/lib/pact_broker/string_refinements.rb +13 -0
  43. data/lib/pact_broker/tags/repository.rb +0 -1
  44. data/lib/pact_broker/ui/views/index/_css_and_js.haml +1 -0
  45. data/lib/pact_broker/ui/views/index/show-with-tags.haml +8 -2
  46. data/lib/pact_broker/ui/views/matrix/show.haml +12 -2
  47. data/lib/pact_broker/verifications/repository.rb +0 -1
  48. data/lib/pact_broker/verifications/service.rb +7 -5
  49. data/lib/pact_broker/version.rb +1 -1
  50. data/lib/pact_broker/versions/parse_semantic_version.rb +0 -1
  51. data/lib/pact_broker/webhooks/execution.rb +0 -1
  52. data/lib/pact_broker/webhooks/execution_configuration.rb +45 -0
  53. data/lib/pact_broker/webhooks/job.rb +5 -8
  54. data/lib/pact_broker/webhooks/pact_and_verification_parameters.rb +39 -12
  55. data/lib/pact_broker/webhooks/redact_logs.rb +21 -4
  56. data/lib/pact_broker/webhooks/render.rb +11 -2
  57. data/lib/pact_broker/webhooks/repository.rb +11 -5
  58. data/lib/pact_broker/webhooks/service.rb +21 -27
  59. data/lib/pact_broker/webhooks/triggered_webhook.rb +0 -1
  60. data/lib/pact_broker/webhooks/webhook_request_logger.rb +13 -0
  61. data/lib/pact_broker/webhooks/webhook_request_template.rb +32 -18
  62. data/lib/rack/pact_broker/add_vary_header.rb +39 -0
  63. data/lib/rack/pact_broker/convert_file_extension_to_accept_header.rb +2 -0
  64. data/lib/webmachine/rack_adapter_monkey_patch.rb +0 -1
  65. data/public/javascripts/clipboard.js +73 -0
  66. data/public/javascripts/matrix.js +0 -2
  67. data/public/stylesheets/index.css +19 -0
  68. data/script/prod/clean-up.sql +11 -0
  69. data/script/query.rb +0 -1
  70. data/script/seed-matrix.rb +0 -1
  71. data/script/seed.rb +0 -1
  72. data/spec/features/delete_version_spec.rb +0 -1
  73. data/spec/features/execute_unsaved_webhook_spec.rb +56 -0
  74. data/spec/features/execute_webhook_spec.rb +2 -5
  75. data/spec/features/get_version_spec.rb +0 -1
  76. data/spec/lib/pact_broker/api/contracts/put_pact_params_contract_spec.rb +0 -1
  77. data/spec/lib/pact_broker/api/contracts/verification_contract_spec.rb +0 -1
  78. data/spec/lib/pact_broker/api/decorators/relationships_csv_decorator_spec.rb +0 -2
  79. data/spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb +0 -1
  80. data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +26 -9
  81. data/spec/lib/pact_broker/api/decorators/webhook_request_template_decorator_spec.rb +3 -1
  82. data/spec/lib/pact_broker/api/decorators/webhooks_decorator_spec.rb +3 -2
  83. data/spec/lib/pact_broker/api/resources/badge_spec.rb +0 -2
  84. data/spec/lib/pact_broker/api/resources/dashboard_spec.rb +0 -1
  85. data/spec/lib/pact_broker/api/resources/error_handler_spec.rb +3 -0
  86. data/spec/lib/pact_broker/api/resources/group_spec.rb +0 -1
  87. data/spec/lib/pact_broker/api/resources/pact_spec.rb +0 -2
  88. data/spec/lib/pact_broker/api/resources/pacticipant_spec.rb +0 -1
  89. data/spec/lib/pact_broker/api/resources/tag_spec.rb +0 -2
  90. data/spec/lib/pact_broker/api/resources/verifications_spec.rb +9 -7
  91. data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +13 -15
  92. data/spec/lib/pact_broker/api/resources/webhooks_spec.rb +0 -1
  93. data/spec/lib/pact_broker/certificates/service_spec.rb +11 -5
  94. data/spec/lib/pact_broker/domain/group_spec.rb +0 -1
  95. data/spec/lib/pact_broker/domain/webhook_spec.rb +11 -4
  96. data/spec/lib/pact_broker/feature_toggle_spec.rb +0 -1
  97. data/spec/lib/pact_broker/groups/service_spec.rb +0 -1
  98. data/spec/lib/pact_broker/hash_refinements_spec.rb +15 -0
  99. data/spec/lib/pact_broker/matrix/repository_spec.rb +0 -2
  100. data/spec/lib/pact_broker/pacticipants/find_potential_duplicate_pacticipant_names_spec.rb +0 -1
  101. data/spec/lib/pact_broker/pacts/pact_version_spec.rb +16 -0
  102. data/spec/lib/pact_broker/pacts/repository_spec.rb +11 -0
  103. data/spec/lib/pact_broker/pacts/service_spec.rb +12 -5
  104. data/spec/lib/pact_broker/relationships/groupify_spec.rb +0 -2
  105. data/spec/lib/pact_broker/tags/repository_spec.rb +0 -1
  106. data/spec/lib/pact_broker/verifications/service_spec.rb +10 -3
  107. data/spec/lib/pact_broker/versions/repository_spec.rb +0 -1
  108. data/spec/lib/pact_broker/webhooks/execution_configuration_spec.rb +18 -0
  109. data/spec/lib/pact_broker/webhooks/job_spec.rb +21 -24
  110. data/spec/lib/pact_broker/webhooks/redact_logs_spec.rb +16 -5
  111. data/spec/lib/pact_broker/webhooks/repository_spec.rb +16 -1
  112. data/spec/lib/pact_broker/webhooks/service_spec.rb +23 -64
  113. data/spec/lib/pact_broker/webhooks/webhook_request_template_spec.rb +108 -24
  114. data/spec/migrations/23_pact_versions_spec.rb +3 -1
  115. data/spec/spec_helper.rb +4 -2
  116. data/spec/support/database_cleaner.rb +0 -1
  117. metadata +19 -5
  118. data/spec/support/jobs.rb +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fe2b3ac695d8a843322fa534dfeab9fe17956c99
4
- data.tar.gz: 7f0fccfb8bc7b2713feb0effa685e2773ad2a90b
3
+ metadata.gz: 16a87ec2e8bd7d3047768e040433544194b306fa
4
+ data.tar.gz: 7dda1535ad3341c18acd174f2459cae29be8e287
5
5
  SHA512:
6
- metadata.gz: 1c339fb970aa844ebfb4efb48055a7807641076cbcad153f93a7f03df9631a86e6d36a3ad36f804d0e72f63f621805cad0fb872a609ed25399b59107f38ecaa4
7
- data.tar.gz: 2b55bccea03acdd7304abf226109abb0a21a86b0aa43f18f4c92743b4b2e6bc5ab24e5f81cc9c10b761b86eba55038a47a94392d194cde790d841dd75df26751
6
+ metadata.gz: cf0fa7165f17a13b045d068d78cbe0aebe5cf860055d271a00dc369d56eff478c3946c8a22451f323eb762bee75069c6359c208c6178dfd82c0561a5c03444bd
7
+ data.tar.gz: 27f0ffd8fceaa7f907fe3e256c4e0f63947ffc4343cb01982e4d1eb5fe2d63b4c0097d602653026cc8deec4349b49e6c7bea9776fa45fc7e67bf80388df94f0b
data/.dockerignore ADDED
@@ -0,0 +1,2 @@
1
+ **/.git
2
+ tmp
@@ -0,0 +1,4 @@
1
+ # These are supported funding model platforms
2
+
3
+ open_collective: pact-foundation
4
+ custom: ['https://pactflow.io']
data/.travis.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.4.1
4
- - 2.3.4
4
+ - 2.5
5
5
  services:
6
6
  - postgresql
7
7
  - mysql
data/CHANGELOG.md CHANGED
@@ -1,3 +1,37 @@
1
+ <a name="v2.35.0"></a>
2
+ ### v2.35.0 (2019-08-08)
3
+
4
+
5
+ #### Features
6
+
7
+ * **webhooks**
8
+ * do not redact a password with a parameter in it ([47c602ef](/../../commit/47c602ef))
9
+ * update parameter text ([7fa518cb](/../../commit/7fa518cb))
10
+ * do not redact header if it contains a parameter ([5787e0d1](/../../commit/5787e0d1))
11
+ * support template parameters in header values, username and password ([a800ac2e](/../../commit/a800ac2e))
12
+ * simplify request logger format ([c52ade2f](/../../commit/c52ade2f))
13
+ * add the logs and success flag to the execution result ([96769a88](/../../commit/96769a88))
14
+ * allow testing of an unsaved webhook ([a436e42d](/../../commit/a436e42d))
15
+ * gracefully handle scenario where triggered webhook has been deleted while webhook was being executed ([052055d4](/../../commit/052055d4))
16
+ * use consumer/provider names in webhook title ([2b5d2498](/../../commit/2b5d2498))
17
+
18
+ * add copy to clipboard for version numbers (#283) ([c10a6f28](/../../commit/c10a6f28))
19
+ * update redact logs ([51aa13c0](/../../commit/51aa13c0))
20
+ * use hardcoded error message when error class has a nil message ([03a3b63c](/../../commit/03a3b63c))
21
+ * ensure clean up script handles pact versions for left over verifications ([116f8eaa](/../../commit/116f8eaa))
22
+ * added clean up sql script ([388b441e](/../../commit/388b441e))
23
+ * add Vary header to avoid browser returning the wrong cached content type for a resource ([6d30baa2](/../../commit/6d30baa2))
24
+ * change logging level from error to info for JSON parsing errors ([cc144062](/../../commit/cc144062))
25
+
26
+
27
+ #### Bug Fixes
28
+
29
+ * inefficient SQL loading latest verification for pact version ([301d9a58](/../../commit/301d9a58))
30
+
31
+ * **publish pacts**
32
+ * handle race condition when creating pact version ([de0d3b7f](/../../commit/de0d3b7f))
33
+
34
+
1
35
  <a name="v2.34.0"></a>
2
36
  ### v2.34.0 (2019-06-14)
3
37
 
@@ -8,7 +8,9 @@
8
8
  * HTTP Resources - [lib/pact_broker/api/resources](lib/pact_broker/api/resources) These handle the HTTP requests.
9
9
  * Decorators - [lib/pact_broker/api/decorators](lib/pact_broker/api/decorators) These render the response bodies.
10
10
  * Contracts - [lib/pact_broker/api/contracts](lib/pact_broker/api/contracts) These validate incoming API requests.
11
- * Domain - Domain classes were intially created in [lib/pact_broker/domain](lib/pact_broker/domain) but are now put in their own modules. The ones left here just haven't been migrated yet.
11
+ * Domain - Domain classes were intially created in [lib/pact_broker/domain](lib/pact_broker/domain) but are now put in their own modules. The ones left here just haven't been migrated yet. The module name is the plural of the domain class name. eg `lib/pact_broker/widgets/widget.rb`.
12
+ * Services and Repositories - in the module with the name of their domain concept. eg `lib/pact_broker/widgets/service.rb` and `lib/pact_broker/widgets/repository.rb`
13
+ * Standalone "function as class" classes go into the module they relate to. This pattern is used when there is some significant stateless logic that we want to
12
14
  * Database migrations - [db/migrations](db/migrations)
13
15
 
14
16
  * Tests - `spec`
@@ -95,3 +97,24 @@ Domain classes are found in `lib/pact_broker/domain`. Many of these classes are
95
97
 
96
98
  * The supported database types are Postgres (recommended), MySQL (sigh) and Sqlite (just for testing, not recommended for production). Check the travis.yml file for the supported database versions.
97
99
  * Any migration that uses the "order" column has to be defined using the Sequel DSL rather than pure SQL, because the word "order" is a key word, and it has to be escaped correctly and differently on each database (Postgres, MySQL, Sqlite).
100
+
101
+ ## Adding a resource
102
+
103
+ * In `spec/features` add a new high level spec that executes the endpoint you're going to write. Don't worry if you're not sure exactly what it's going to look like yet - you can come back and change it as you go. Have a look at the other specs in the directory for the type of assertions that should be made. Basic rule of thumb is to check the http status code, and do a light touch of assertions on the body.
104
+ * Create a new directory for the classes that relate to your new resource. eg For a "Foo" resource, create `lib/pact_broker/foos`
105
+ * Create a new migration in `db/migrations` that creates the underlying database table.
106
+ * Create a new database model for the resource that extends from Sequel::Model. eg `lib/pact_broker/foos/foo.rb`
107
+ * Create a decorator in `spec/lib/pact_broker/api/decorators/` that will map to and from the representation that will be used in the HTTP request and response.
108
+ * Write a spec for the decorator.
109
+ * You may need to create a contract to validate the request. This is kind of broken while I upgrade to the latest dry-validation library. See Beth for more details.
110
+ * Add the HTTP resource in `lib/pact_broker/api/resources/`. It should extend from `BaseResource`.
111
+ * Write a spec for the resource, stubbing out the behaviour you expect from your service.
112
+ * Add the route to `lib/pact_broker/api.rb`
113
+ * Create a service that has the methods that you need for the resource. eg. `lib/pact_broker/foos/service.rb`
114
+ * Add the new service to `lib/pact_broker/services.rb`
115
+ * Write a spec for the service, stubbing out the behaviour you expect from your repository.
116
+ * Create a repository eg. `lib/pact_broker/foos/repository.rb`.
117
+ * Add the new repository to `lib/pact_broker/repositories.rb`.
118
+ * Write a spec for the repository.
119
+ * Go back and make the original feature spec pass.
120
+ * Profit.
data/DEVELOPER_SETUP.md CHANGED
@@ -1,35 +1,55 @@
1
1
  # Developer setup
2
2
 
3
+ ## Preparation
4
+
5
+ ### With virtual battery
6
+
7
+ * Build an initial local image with Docker
8
+ ```sh
9
+ docker build --rm -t pact_broker:dev .
10
+ ```
11
+
12
+ * Spin up a container with mounted volume and open an interactive shell session
13
+ ```sh
14
+ docker run --rm -v $(PWD):/app -w /app -it pact_broker:dev bash
15
+ ```
16
+
17
+ ### With native install
18
+
3
19
  * You will need to install Ruby 2.5, and preferably a ruby version manager. I recommend using [chruby][chruby] and [ruby-install][ruby-install].
4
20
  * Install bundler (the Ruby gem dependency manager) `gem install bundler`
5
21
  * Check out the pact_broker repository and cd into it.
6
22
  * Run `bundle install`. If you have not got mysql or postgres installed locally, comment out the `mysql2` and `pg` development dependency lines in `pact_broker.gemspec`, as these are only really required on Travis.
7
- * Run `bundle exec rake pact_broker:dev:setup`. This will create an example application that you can run locally, that uses the local source code.
8
- * To run the example:
9
23
 
10
- cd dev
11
- bundle install
12
- bundle exec rackup
24
+ ## Running a local application
13
25
 
26
+ * Run `bundle exec rake pact_broker:dev:setup`. This will create an example application that you can run locally, that uses the local source code.
27
+ * To run the example:
28
+ ```sh
29
+ cd dev
30
+ bundle install
31
+ bundle exec rackup
32
+ ```
14
33
  * The application will be available on `http://localhost:9292`
15
34
 
16
35
  ## Running the tests
17
36
 
18
- To run everything (specs, pact verifications, vulnerability scan...):
19
-
20
- `bundle exec rake`
21
-
22
- To run a smaller subset of the tests:
23
-
24
- `bundle exec rake spec`
25
-
26
- To run the "quick tests" (skip the lengthy migration specs)
27
-
28
- `bundle exec rake spec:quick`
29
-
30
- To run a single spec:
31
-
32
- `bundle exec rspec path_to_your_spec.rb`
37
+ * To run everything (specs, pact verifications, vulnerability scan...):
38
+ ```sh
39
+ bundle exec rake
40
+ ```
41
+ * To run a smaller subset of the tests:
42
+ ```sh
43
+ bundle exec rake spec
44
+ ```
45
+ * To run the "quick tests" (skip the lengthy migration specs)
46
+ ```sh
47
+ bundle exec rake spec:quick
48
+ ```
49
+ * To run a single spec:
50
+ ```sh
51
+ bundle exec rspec path_to_your_spec.rb
52
+ ```
33
53
 
34
54
  [chruby]: https://github.com/postmodern/chruby
35
55
  [ruby-install]: https://github.com/postmodern/ruby-install
data/Dockerfile ADDED
@@ -0,0 +1,22 @@
1
+ FROM ruby:2.5.3-alpine
2
+
3
+ RUN apk update \
4
+ && apk --no-cache add \
5
+ "build-base>=0.5" \
6
+ "bash>=4.4" \
7
+ "ca-certificates>=20190108" \
8
+ "git>=2.20" \
9
+ "postgresql-dev>=11.3" \
10
+ "sqlite-dev>=3.28" \
11
+ "sqlite>=3.28" \
12
+ "tzdata>=2019" \
13
+ && rm -rf /var/cache/apk/*
14
+
15
+ WORKDIR /app
16
+
17
+ COPY . ./
18
+
19
+ RUN gem install bundler -v '~>2.0.0' \
20
+ && bundle install --jobs 3 --retry 3
21
+
22
+ CMD []
@@ -33,7 +33,6 @@ Sequel.migration do
33
33
  and app.revision_number = lr.latest_revision_number"
34
34
  )
35
35
 
36
-
37
36
  # updated in 20180519_recreate_views.rb
38
37
  # This view tells us the latest consumer version with a pact for a consumer/provider pair
39
38
  create_or_replace_view(:latest_pact_consumer_version_orders,
@@ -46,7 +46,6 @@ Sequel.migration do
46
46
  }, { table_alias: :s })
47
47
  )
48
48
 
49
-
50
49
  create_or_replace_view(:head_matrix, HEAD_MATRIX_V1)
51
50
  end
52
51
  end
@@ -25,7 +25,6 @@ module Pact
25
25
 
26
26
  attr_reader :dir, :consumer_contract, :consumer_contract_renderer, :file_extension
27
27
 
28
-
29
28
  def path
30
29
  File.join(dir, name)
31
30
  end
@@ -142,7 +142,7 @@ module PactBroker
142
142
  end
143
143
 
144
144
  def parse_uri(uri_string, placeholder = 'placeholder')
145
- URI(uri_string.gsub(PactBroker::Webhooks::Render::TEMPLATE_PARAMETER_REGEXP, placeholder))
145
+ URI(PactBroker::Webhooks::Render.render_with_placeholder(uri_string, placeholder))
146
146
  end
147
147
  end
148
148
 
@@ -11,17 +11,17 @@ module PactBroker
11
11
  self[:base_url] = base_url
12
12
  @resource_url = resource_url
13
13
  self[:resource_url] = resource_url
14
- @resource_title = options[:resource_title]
15
- self[:resource_title] = resource_title
14
+ if options[:resource_title]
15
+ @resource_title = options[:resource_title]
16
+ self[:resource_title] = resource_title
17
+ end
16
18
  merge!(options)
17
19
  end
18
20
 
19
21
  def to_s
20
22
  "DecoratorContext #{super}"
21
23
  end
22
-
23
24
  end
24
-
25
25
  end
26
26
  end
27
- end
27
+ end
@@ -53,7 +53,6 @@ module PactBroker
53
53
  }
54
54
  end
55
55
 
56
-
57
56
  link :'pb:latest-pact-version' do | options |
58
57
  {
59
58
  title: "Latest version of this pact",
@@ -2,7 +2,6 @@ require 'pact_broker/api/pact_broker_urls'
2
2
  require_relative 'embedded_version_decorator'
3
3
  require_relative 'base_decorator'
4
4
 
5
-
6
5
  module PactBroker
7
6
 
8
7
  module Api
@@ -14,7 +14,6 @@ module PactBroker
14
14
 
15
15
  include Timestamps
16
16
 
17
-
18
17
  link :self do | options |
19
18
  {
20
19
  title: 'Tag',
@@ -48,7 +48,6 @@ module PactBroker
48
48
  }
49
49
  end
50
50
 
51
-
52
51
  link :'pb:consumer' do | options |
53
52
  if represented.consumer
54
53
  {
@@ -35,7 +35,6 @@ module PactBroker
35
35
  end
36
36
  end
37
37
 
38
-
39
38
  class HTTPResponseDecorator < BaseDecorator
40
39
  property :status, :getter => lambda { |_| code.to_i }
41
40
  property :headers, exec_context: :decorator
@@ -61,17 +60,21 @@ module PactBroker
61
60
  property :request, :extend => HTTPRequestDecorator
62
61
  property :response, :extend => HTTPResponseDecorator, if: lambda { |context| context[:options][:user_options][:show_response] }
63
62
  property :response_hidden_message, as: :message, exec_context: :decorator, if: lambda { |context| !context[:options][:user_options][:show_response] }
63
+ property :logs
64
+ property :success?, as: :success
64
65
 
65
66
  link :webhook do | options |
66
- {
67
- href: webhook_url(options.fetch(:webhook).uuid, options.fetch(:base_url))
68
- }
67
+ if options.fetch(:webhook).uuid
68
+ {
69
+ href: webhook_url(options.fetch(:webhook).uuid, options.fetch(:base_url))
70
+ }
71
+ end
69
72
  end
70
73
 
71
74
  link :'try-again' do | options |
72
75
  {
73
76
  title: 'Execute the webhook again',
74
- href: webhook_execution_url(options.fetch(:webhook), options.fetch(:base_url))
77
+ href: options.fetch(:resource_url)
75
78
  }
76
79
  end
77
80
 
@@ -7,15 +7,12 @@ module PactBroker
7
7
 
8
8
  property :method
9
9
  property :url
10
- property :headers, getter: lambda { | _ | headers.empty? ? nil : self.redacted_headers }
10
+ property :headers, getter: lambda { | _ | self.redacted_headers.empty? ? nil : self.redacted_headers }
11
11
  property :body
12
12
  property :username
13
13
  property :password, getter: lambda { | _ | display_password }
14
14
 
15
15
 
16
- def redacted_headers
17
- represented.headers
18
- end
19
16
  end
20
17
  end
21
18
  end
@@ -6,7 +6,6 @@ module PactBroker
6
6
  module Decorators
7
7
  class WebhooksDecorator < BaseDecorator
8
8
 
9
-
10
9
  link :self do | context |
11
10
  {
12
11
  title: context[:resource_title],
@@ -24,7 +23,7 @@ module PactBroker
24
23
  links :'pb:webhooks' do | context |
25
24
  represented.entries.collect do | webhook |
26
25
  {
27
- title: "Webhook",
26
+ title: webhook.scope_description,
28
27
  name: webhook.display_description,
29
28
  href: webhook_url(webhook.uuid, context[:base_url])
30
29
  }
@@ -23,7 +23,6 @@ module PactBroker
23
23
  include PactBroker::Api::Resources::Authentication
24
24
  include PactBroker::Logging
25
25
 
26
-
27
26
  attr_accessor :user
28
27
 
29
28
  def initialize
@@ -9,20 +9,27 @@ module PactBroker
9
9
  include PactBroker::Logging
10
10
 
11
11
  def self.call e, request, response
12
- error_reference = SecureRandom.urlsafe_base64.gsub(/[^a-z]/i, '')[0,10]
13
- logger.error "#{e.message} - error reference #{error_reference}"
14
- logger.error e.backtrace
12
+ error_reference = generate_error_reference
13
+ if reportable?(e)
14
+ log_error(e, "Error reference #{error_reference}")
15
+ report(e, error_reference, request)
16
+ else
17
+ logger.info "Error reference #{error_reference} - #{e.class} #{e.message}\n#{e.backtrace.join("\n")}"
18
+ end
15
19
  response.body = response_body_hash(e, error_reference).to_json
16
- report(e, error_reference, request) if reportable?(e)
17
20
  end
18
21
 
19
- def self.reportable? e
20
- !e.is_a?(PactBroker::Error)
22
+ def self.generate_error_reference
23
+ SecureRandom.urlsafe_base64.gsub(/[^a-z]/i, '')[0,10]
24
+ end
25
+
26
+ def self.reportable?(e)
27
+ !e.is_a?(PactBroker::Error) && !e.is_a?(JSON::GeneratorError)
21
28
  end
22
29
 
23
30
  def self.display_message(e, error_reference)
24
31
  if PactBroker.configuration.show_backtrace_in_error_response?
25
- e.message
32
+ e.message || obfuscated_error_message(error_reference)
26
33
  else
27
34
  reportable?(e) ? obfuscated_error_message(error_reference) : e.message
28
35
  end
@@ -5,6 +5,8 @@ require 'pact_broker/api/decorators/pact_decorator'
5
5
  require 'pact_broker/json'
6
6
  require 'pact_broker/pacts/pact_params'
7
7
  require 'pact_broker/api/contracts/put_pact_params_contract'
8
+ require 'pact_broker/webhooks/execution_configuration'
9
+ require 'pact_broker/api/resources/webhook_execution_methods'
8
10
 
9
11
  module Webmachine
10
12
  class Request
@@ -15,13 +17,11 @@ module Webmachine
15
17
  end
16
18
 
17
19
  module PactBroker
18
-
19
20
  module Api
20
21
  module Resources
21
-
22
22
  class Pact < BaseResource
23
-
24
23
  include PacticipantResourceMethods
24
+ include WebhookExecutionMethods
25
25
 
26
26
  def content_types_provided
27
27
  [["application/hal+json", :to_json],
@@ -122,12 +122,7 @@ module PactBroker
122
122
  def webhook_options
123
123
  {
124
124
  database_connector: database_connector,
125
- logging_options: {
126
- show_response: PactBroker.configuration.show_webhook_response?
127
- },
128
- webhook_context: {
129
- base_url: base_url
130
- }
125
+ webhook_execution_configuration: webhook_execution_configuration
131
126
  }
132
127
  end
133
128
  end
@@ -76,7 +76,6 @@ module PactBroker
76
76
  @next_uuid ||= webhook_service.next_uuid
77
77
  end
78
78
 
79
-
80
79
  end
81
80
  end
82
81
  end
@@ -3,12 +3,13 @@ require 'pact_broker/configuration'
3
3
  require 'pact_broker/domain/verification'
4
4
  require 'pact_broker/api/contracts/verification_contract'
5
5
  require 'pact_broker/api/decorators/verification_decorator'
6
+ require 'pact_broker/api/resources/webhook_execution_methods'
6
7
 
7
8
  module PactBroker
8
9
  module Api
9
10
  module Resources
10
-
11
11
  class Verifications < BaseResource
12
+ include WebhookExecutionMethods
12
13
 
13
14
  def content_types_accepted
14
15
  [["application/json", :from_json]]
@@ -70,7 +71,6 @@ module PactBroker
70
71
  request.post?
71
72
  end
72
73
 
73
-
74
74
  def metadata
75
75
  PactBrokerUrls.parse_webhook_metadata(identifier_from_path[:metadata])
76
76
  end
@@ -78,12 +78,8 @@ module PactBroker
78
78
  def webhook_options
79
79
  {
80
80
  database_connector: database_connector,
81
- logging_options: {
82
- show_response: PactBroker.configuration.show_webhook_response?
83
- },
84
- webhook_context: metadata.merge(
85
- base_url: base_url
86
- )
81
+ webhook_execution_configuration: webhook_execution_configuration
82
+ .with_webhook_context(metadata)
87
83
  }
88
84
  end
89
85
  end
@@ -1,13 +1,15 @@
1
1
  require 'pact_broker/api/resources/base_resource'
2
2
  require 'pact_broker/services'
3
3
  require 'pact_broker/api/decorators/webhook_decorator'
4
+ require 'pact_broker/api/resources/webhook_resource_methods'
4
5
 
5
6
  module PactBroker
6
7
  module Api
7
8
  module Resources
8
-
9
9
  class Webhook < BaseResource
10
10
 
11
+ include WebhookResourceMethods
12
+
11
13
  def content_types_accepted
12
14
  [["application/json", :from_json]]
13
15
  end
@@ -26,7 +28,7 @@ module PactBroker
26
28
 
27
29
  def malformed_request?
28
30
  if request.put?
29
- return invalid_json? || validation_errors?(webhook)
31
+ return invalid_json? || webhook_validation_errors?(new_webhook)
30
32
  end
31
33
  false
32
34
  end
@@ -51,12 +53,6 @@ module PactBroker
51
53
 
52
54
  private
53
55
 
54
- def validation_errors? webhook
55
- errors = webhook_service.errors(new_webhook)
56
- set_json_validation_error_messages(errors.messages) if !errors.empty?
57
- !errors.empty?
58
- end
59
-
60
56
  def webhook
61
57
  @webhook ||= webhook_service.find_by_uuid uuid
62
58
  end
@@ -1,21 +1,34 @@
1
1
  require 'pact_broker/api/resources/base_resource'
2
2
  require 'pact_broker/services'
3
3
  require 'pact_broker/api/decorators/webhook_execution_result_decorator'
4
+ require 'pact_broker/api/resources/webhook_resource_methods'
4
5
  require 'pact_broker/constants'
6
+ require 'pact_broker/webhooks/execution_configuration'
7
+ require 'pact_broker/api/resources/webhook_execution_methods'
5
8
 
6
9
  module PactBroker
7
10
  module Api
8
11
  module Resources
9
12
  class WebhookExecution < BaseResource
13
+ include WebhookResourceMethods
14
+ include WebhookExecutionMethods
15
+
16
+ def content_types_accepted
17
+ [["application/json"]]
18
+ end
19
+
20
+ def content_types_provided
21
+ [["application/hal+json"]]
22
+ end
10
23
 
11
24
  def allowed_methods
12
25
  ["POST", "OPTIONS"]
13
26
  end
14
27
 
15
28
  def process_post
16
- webhook_execution_result = webhook_service.test_execution(webhook, webhook_options)
29
+ webhook_execution_result = webhook_service.test_execution(webhook, webhook_execution_configuration)
17
30
  response.headers['Content-Type'] = 'application/hal+json;charset=utf-8'
18
- response.body = post_response_body webhook_execution_result
31
+ response.body = post_response_body(webhook_execution_result)
19
32
  true
20
33
  end
21
34
 
@@ -23,6 +36,14 @@ module PactBroker
23
36
  webhook
24
37
  end
25
38
 
39
+ def malformed_request?
40
+ if uuid
41
+ false
42
+ else
43
+ webhook_validation_errors?(webhook)
44
+ end
45
+ end
46
+
26
47
  private
27
48
 
28
49
  def post_response_body webhook_execution_result
@@ -30,7 +51,13 @@ module PactBroker
30
51
  end
31
52
 
32
53
  def webhook
33
- @webhook ||= webhook_service.find_by_uuid uuid
54
+ @webhook ||= begin
55
+ if uuid
56
+ webhook_service.find_by_uuid uuid
57
+ else
58
+ build_unsaved_webhook
59
+ end
60
+ end
34
61
  end
35
62
 
36
63
  def uuid
@@ -38,22 +65,14 @@ module PactBroker
38
65
  end
39
66
 
40
67
  def user_options
41
- {
42
- base_url: base_url,
68
+ decorator_context(
43
69
  webhook: webhook,
44
70
  show_response: PactBroker.configuration.show_webhook_response?
45
- }
46
- end
47
-
48
- def webhook_options
49
- {
50
- logging_options: {
51
- show_response: PactBroker.configuration.show_webhook_response?
52
- },
53
- webhook_context: {
54
- base_url: base_url
55
- }
56
- }
71
+ )
72
+ end
73
+
74
+ def build_unsaved_webhook
75
+ Decorators::WebhookDecorator.new(PactBroker::Domain::Webhook.new).from_json(request_body)
57
76
  end
58
77
  end
59
78
  end
@@ -0,0 +1,13 @@
1
+ module PactBroker
2
+ module Api
3
+ module Resources
4
+ module WebhookExecutionMethods
5
+ def webhook_execution_configuration
6
+ PactBroker::Webhooks::ExecutionConfiguration.new
7
+ .with_show_response(PactBroker.configuration.show_webhook_response?)
8
+ .with_webhook_context(base_url: base_url)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end