pact_broker 2.74.1 → 2.75.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.
Files changed (136) hide show
  1. checksums.yaml +4 -4
  2. data/.optic/.gitignore +2 -0
  3. data/.optic/api/specification.json +1 -0
  4. data/.optic/ignore +14 -0
  5. data/CHANGELOG.md +19 -0
  6. data/DEVELOPER_SETUP.md +9 -0
  7. data/Dockerfile +1 -0
  8. data/config/database.yml +1 -1
  9. data/db/migrations/20210115_add_webhook_foreign_key_indexes.rb +49 -0
  10. data/db/migrations/20210116_add_context_to_triggered_webhook.rb +11 -0
  11. data/db/migrations/migration_helper.rb +8 -0
  12. data/docker-compose-test.yml +4 -4
  13. data/lib/pact_broker/api.rb +13 -2
  14. data/lib/pact_broker/api/decorators.rb +3 -7
  15. data/lib/pact_broker/api/decorators/configuration.rb +33 -0
  16. data/lib/pact_broker/api/decorators/decorator_context_creator.rb +13 -0
  17. data/lib/pact_broker/api/decorators/pact_collection_decorator.rb +1 -0
  18. data/lib/pact_broker/api/decorators/pacticipant_collection_decorator.rb +2 -3
  19. data/lib/pact_broker/api/decorators/reason_decorator.rb +2 -0
  20. data/lib/pact_broker/api/renderers/html_pact_renderer.rb +2 -2
  21. data/lib/pact_broker/api/resources/all_webhooks.rb +3 -3
  22. data/lib/pact_broker/api/resources/can_i_deploy_badge.rb +1 -1
  23. data/lib/pact_broker/api/resources/dashboard.rb +2 -2
  24. data/lib/pact_broker/api/resources/default_base_resource.rb +37 -12
  25. data/lib/pact_broker/api/resources/error_response_body_generator.rb +41 -0
  26. data/lib/pact_broker/api/resources/group.rb +1 -1
  27. data/lib/pact_broker/api/resources/integrations.rb +1 -1
  28. data/lib/pact_broker/api/resources/label.rb +1 -1
  29. data/lib/pact_broker/api/resources/latest_pact.rb +2 -2
  30. data/lib/pact_broker/api/resources/latest_pacts.rb +1 -1
  31. data/lib/pact_broker/api/resources/latest_verifications_for_consumer_version.rb +2 -2
  32. data/lib/pact_broker/api/resources/matrix.rb +2 -2
  33. data/lib/pact_broker/api/resources/matrix_for_consumer_and_provider.rb +1 -1
  34. data/lib/pact_broker/api/resources/pact.rb +2 -2
  35. data/lib/pact_broker/api/resources/pact_triggered_webhooks.rb +1 -1
  36. data/lib/pact_broker/api/resources/pact_versions.rb +1 -1
  37. data/lib/pact_broker/api/resources/pact_webhooks.rb +3 -3
  38. data/lib/pact_broker/api/resources/pact_webhooks_status.rb +2 -2
  39. data/lib/pact_broker/api/resources/pacticipant.rb +1 -1
  40. data/lib/pact_broker/api/resources/pacticipants.rb +3 -3
  41. data/lib/pact_broker/api/resources/pacticipants_for_label.rb +1 -1
  42. data/lib/pact_broker/api/resources/previous_distinct_pact_version.rb +1 -1
  43. data/lib/pact_broker/api/resources/provider_pacts.rb +1 -7
  44. data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +2 -2
  45. data/lib/pact_broker/api/resources/relationships.rb +1 -1
  46. data/lib/pact_broker/api/resources/tag.rb +1 -1
  47. data/lib/pact_broker/api/resources/tagged_pact_versions.rb +1 -1
  48. data/lib/pact_broker/api/resources/verification.rb +2 -2
  49. data/lib/pact_broker/api/resources/verification_triggered_webhooks.rb +1 -1
  50. data/lib/pact_broker/api/resources/verifications.rb +1 -1
  51. data/lib/pact_broker/api/resources/version.rb +1 -1
  52. data/lib/pact_broker/api/resources/versions.rb +1 -1
  53. data/lib/pact_broker/api/resources/webhook.rb +2 -2
  54. data/lib/pact_broker/api/resources/webhook_execution.rb +4 -4
  55. data/lib/pact_broker/api/resources/webhook_execution_methods.rb +1 -3
  56. data/lib/pact_broker/api/resources/webhooks.rb +3 -3
  57. data/lib/pact_broker/app.rb +8 -3
  58. data/lib/pact_broker/application_context.rb +41 -0
  59. data/lib/pact_broker/doc/controllers/app.rb +3 -2
  60. data/lib/pact_broker/domain/webhook_request.rb +1 -1
  61. data/lib/pact_broker/error.rb +0 -2
  62. data/lib/pact_broker/errors.rb +28 -0
  63. data/lib/pact_broker/errors/error_logger.rb +25 -0
  64. data/lib/pact_broker/services.rb +106 -31
  65. data/lib/pact_broker/test/http_test_data_builder.rb +35 -0
  66. data/lib/pact_broker/test/test_data_builder.rb +3 -2
  67. data/lib/pact_broker/ui/views/index/_getting-started.haml +1 -1
  68. data/lib/pact_broker/ui/views/index/show-with-tags.haml +16 -16
  69. data/lib/pact_broker/ui/views/index/show.haml +6 -6
  70. data/lib/pact_broker/ui/views/layouts/main.haml +2 -2
  71. data/lib/pact_broker/ui/views/matrix/show.haml +32 -33
  72. data/lib/pact_broker/version.rb +1 -1
  73. data/lib/pact_broker/webhooks/execution_configuration.rb +4 -0
  74. data/lib/pact_broker/webhooks/execution_configuration_creator.rb +14 -0
  75. data/lib/pact_broker/webhooks/repository.rb +3 -2
  76. data/lib/pact_broker/webhooks/service.rb +2 -1
  77. data/lib/pact_broker/webhooks/triggered_webhook.rb +1 -0
  78. data/optic.yml +5 -0
  79. data/pact_broker.gemspec +1 -1
  80. data/public/css/bootstrap-grid.css +3719 -0
  81. data/public/css/bootstrap-grid.css.map +1 -0
  82. data/public/css/bootstrap-grid.min.css +7 -0
  83. data/public/css/bootstrap-grid.min.css.map +1 -0
  84. data/public/css/bootstrap-reboot.css +331 -0
  85. data/public/css/bootstrap-reboot.css.map +1 -0
  86. data/public/css/bootstrap-reboot.min.css +8 -0
  87. data/public/css/bootstrap-reboot.min.css.map +1 -0
  88. data/public/css/bootstrap.css +8885 -5604
  89. data/public/css/bootstrap.css.map +1 -1
  90. data/public/css/bootstrap.min.css +4 -3
  91. data/public/css/bootstrap.min.css.map +1 -1
  92. data/public/images/alert.svg +1 -0
  93. data/public/images/arrow-switch.svg +1 -0
  94. data/public/images/check.svg +1 -0
  95. data/public/images/clock.svg +1 -0
  96. data/public/images/copy.svg +1 -0
  97. data/public/images/kebab-horizontal.svg +1 -0
  98. data/public/javascripts/clipboard.js +3 -3
  99. data/public/javascripts/{jquery-3.3.1.js → jquery-3.5.1.js} +1150 -642
  100. data/public/javascripts/jquery-3.5.1.min.js +2 -0
  101. data/public/javascripts/jquery-3.5.1.min.map +1 -0
  102. data/public/javascripts/matrix.js +2 -2
  103. data/public/js/bootstrap.bundle.js +7013 -0
  104. data/public/js/bootstrap.bundle.js.map +1 -0
  105. data/public/js/bootstrap.bundle.min.js +7 -0
  106. data/public/js/bootstrap.bundle.min.js.map +1 -0
  107. data/public/js/bootstrap.js +3862 -1804
  108. data/public/js/bootstrap.js.map +1 -0
  109. data/public/js/bootstrap.min.js +6 -6
  110. data/public/js/bootstrap.min.js.map +1 -0
  111. data/public/stylesheets/index.css +56 -3
  112. data/public/stylesheets/matrix.css +55 -5
  113. data/public/stylesheets/pact.css +14 -0
  114. data/regression/.gitignore +1 -0
  115. data/regression/can_i_deploy_spec.rb +42 -0
  116. data/regression/regression_helper.rb +37 -0
  117. data/regression/script/approval-all.sh +6 -0
  118. data/script/exercise-api-for-optic.sh +3 -0
  119. data/spec/lib/pact_broker/api/resources/can_i_deploy_badge_spec.rb +1 -1
  120. data/spec/lib/pact_broker/api/resources/default_base_resource_spec.rb +65 -5
  121. data/spec/lib/pact_broker/api/resources/error_response_body_generator_spec.rb +69 -0
  122. data/spec/lib/pact_broker/db/log_quietener_spec.rb +1 -1
  123. data/spec/lib/pact_broker/errors/error_logger_spec.rb +62 -0
  124. data/spec/lib/pact_broker/errors_spec.rb +55 -0
  125. data/spec/lib/pact_broker/webhooks/repository_spec.rb +5 -2
  126. data/spec/lib/pact_broker/webhooks/service_spec.rb +2 -1
  127. data/tasks/rspec.rake +6 -0
  128. metadata +54 -17
  129. data/public/css/bootstrap-theme.css +0 -587
  130. data/public/css/bootstrap-theme.css.map +0 -1
  131. data/public/css/bootstrap-theme.min.css +0 -6
  132. data/public/css/bootstrap-theme.min.css.map +0 -1
  133. data/public/fonts/glyphicons-halflings-regular.svg +0 -288
  134. data/public/javascripts/jquery-3.3.1.min.js +0 -2
  135. data/public/javascripts/jquery-3.3.1.min.map +0 -1
  136. data/spec/lib/pact_broker/api/resources/error_handler_spec.rb +0 -211
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9bb163d5ed55a2b3f98f18b63763749a0a9a337538a69b30af9f01295e720154
4
- data.tar.gz: cd8cc58097602d87c09f9af494b49c28666223350f57a2f4f9ccade3f3b1d57c
3
+ metadata.gz: fe978e58a9f4c7e3e190b8fd5b48ce70212bac2dcc4c0ea795565a00db6127e3
4
+ data.tar.gz: 551b0f07b25b75db367cb4a6d16ce114ab64b2541f1a452ab686145d3b5610ec
5
5
  SHA512:
6
- metadata.gz: a32dd3179963aac89bff4ca0197e80f73576188355b92984e51ee010522e34d7017ab6a2cac6eaf5ac865391b221d7aa619efdd8950727cac20c2e6d2b686e79
7
- data.tar.gz: fbd56c79155229b5900294f13b0ce1ce9390cd2260e678a83ef2b358d4ad8112ae6e4f257bc3380e4ed488b67ed838f80214ba16bb8431c002f85878c5989a33
6
+ metadata.gz: 87c8c396ed8dd5aaabd184a7a65a24c7ba641d11a257bfb17d3cf497e4cc9e3e33a2a761143f3c59d511e0d42c3440ea3117f186ee179aff095d917c228dd820
7
+ data.tar.gz: 5d4b9dfc5bab8f3f3671dc10011a11c925bbf2ff2edc8b3a8196c204c6bdace6bc09d8c004e3bbed438a111c202b99b01937163708da591375f8828ef02e81a4
@@ -0,0 +1,2 @@
1
+
2
+ captures/
@@ -0,0 +1 @@
1
+ []
@@ -0,0 +1,14 @@
1
+ # Default Ignore Rules
2
+ # Learn to configure your own at https://useoptic.com/docs
3
+ OPTIONS *
4
+ HEAD *
5
+ GET (.*).htm
6
+ GET (.*).html
7
+ GET (.*).css
8
+ GET (.*).js
9
+ GET (.*).woff
10
+ GET (.*).png
11
+ GET (.*).jpg
12
+ GET (.*).jpeg
13
+ GET (.*).svg
14
+ GET (.*).gif
@@ -1,3 +1,22 @@
1
+ <a name="v2.75.0"></a>
2
+ ### v2.75.0 (2021-01-18)
3
+
4
+ #### Features
5
+
6
+ * upgrade bootstrap (#370) ([a457c337](/../../commit/a457c337))
7
+ * add indexes to webhook_executions and triggered_webhooks tables ([b05e7dbe](/../../commit/b05e7dbe))
8
+
9
+ * **webhook**
10
+ * set read and open timeouts ([8b502c44](/../../commit/8b502c44))
11
+
12
+ #### Bug Fixes
13
+
14
+ * **ui**
15
+ * upgrade to jquery-3.5.1 to address vulnerabilities in jquery-3.3.1 ([de41b231](/../../commit/de41b231))
16
+
17
+ * **deps**
18
+ * upgrade redcarpet for CVE-2020-26298 ([b57aad32](/../../commit/b57aad32))
19
+
1
20
  <a name="v2.74.1"></a>
2
21
  ### v2.74.1 (2021-01-05)
3
22
 
@@ -68,6 +68,13 @@ bundle exec rake
68
68
  # if you don't want to run the whole rake test suite, init the db first
69
69
  /home/init-db.sh
70
70
  ```
71
+
72
+ Running a mysql client in the mysql-tests container:
73
+
74
+ ```
75
+ mysql -hmysql -upact_broker -ppact_broker
76
+ ```
77
+
71
78
  ## Running the tests
72
79
 
73
80
  * To run everything (specs, pact verifications, vulnerability scan...):
@@ -87,5 +94,7 @@ bundle exec rake
87
94
  bundle exec rspec path_to_your_spec.rb
88
95
  ```
89
96
 
97
+ NOTE: the spec tasks requires the `db:prepare:test` task to be executed at least once prior to running.
98
+
90
99
  [chruby]: https://github.com/postmodern/chruby
91
100
  [ruby-install]: https://github.com/postmodern/ruby-install
data/Dockerfile CHANGED
@@ -15,6 +15,7 @@ RUN apk update \
15
15
  "sqlite>=3.28" \
16
16
  "tzdata>=2019" \
17
17
  "mariadb-dev>=10.3" \
18
+ "mysql-client>=10.3.25" \
18
19
  && rm -rf /var/cache/apk/*
19
20
 
20
21
  RUN apk add --no-cache openssl less
@@ -17,7 +17,7 @@ test:
17
17
  username: postgres
18
18
  password: postgres
19
19
  host: localhost
20
- port: "5433"
20
+ port: "5432"
21
21
  docker_compose_postgres:
22
22
  adapter: postgres
23
23
  database: postgres
@@ -0,0 +1,49 @@
1
+ require_relative 'migration_helper'
2
+
3
+ include PactBroker::MigrationHelper
4
+
5
+ Sequel.migration do
6
+ up do
7
+ if !mysql?
8
+ alter_table(:webhook_executions) do
9
+ add_index([:triggered_webhook_id], name: "webhook_executions_triggered_webhook_id_index")
10
+ end
11
+ # MySQL automatically creates indexes for foreign keys then complains if you
12
+ # re-create it with a different name and try to drop it.
13
+
14
+ # https://stackoverflow.com/a/52274628/832671 - "When there is only one index that can be used
15
+ # for the foreign key, it can't be dropped. If you really wan't to drop it, you either have to drop
16
+ # the foreign key constraint or to create another index for it first."
17
+
18
+ alter_table(:triggered_webhooks) do
19
+ add_index([:webhook_id], name: "triggered_webhooks_webhook_id_index")
20
+ add_index([:consumer_id], name: "triggered_webhooks_consumer_id_index")
21
+ add_index([:provider_id], name: "triggered_webhooks_provider_id_index")
22
+ add_index([:verification_id], name: "triggered_webhooks_verification_id_index")
23
+ add_index([:pact_publication_id], name: "triggered_webhooks_pact_publication_id_index")
24
+ end
25
+ end
26
+ end
27
+
28
+ down do
29
+ if !mysql?
30
+ alter_table(:webhook_executions) do
31
+ drop_index([:triggered_webhook_id], name: "webhook_executions_triggered_webhook_id_index")
32
+ end
33
+ # MySQL automatically creates indexes for foreign keys then complains if you
34
+ # re-create it with a different name and try to drop it.
35
+
36
+ # https://stackoverflow.com/a/52274628/832671 - "When there is only one index that can be used
37
+ # for the foreign key, it can't be dropped. If you really wan't to drop it, you either have to drop
38
+ # the foreign key constraint or to create another index for it first."
39
+
40
+ alter_table(:triggered_webhooks) do
41
+ drop_index([:webhook_id], name: "triggered_webhooks_webhook_id_index")
42
+ drop_index([:consumer_id], name: "triggered_webhooks_consumer_id_index")
43
+ drop_index([:provider_id], name: "triggered_webhooks_provider_id_index")
44
+ drop_index([:verification_id], name: "triggered_webhooks_verification_id_index")
45
+ drop_index([:pact_publication_id], name: "triggered_webhooks_pact_publication_id_index")
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,11 @@
1
+ require_relative 'migration_helper'
2
+
3
+ include PactBroker::MigrationHelper
4
+
5
+ Sequel.migration do
6
+ change do
7
+ alter_table(:triggered_webhooks) do
8
+ add_column(:event_context, String)
9
+ end
10
+ end
11
+ end
@@ -30,6 +30,14 @@ module PactBroker
30
30
  Sequel::Model.db.adapter_scheme.to_s
31
31
  end
32
32
 
33
+ def with_type_hash_if_postgres(options)
34
+ if postgres?
35
+ options.merge(type: "hash")
36
+ else
37
+ options
38
+ end
39
+ end
40
+
33
41
  def sqlite_safe string
34
42
  if adapter == 'sqlite'
35
43
  string.gsub(/(?:\b|")order(?:"|\b)/, '`order`')
@@ -6,8 +6,8 @@ services:
6
6
  image: postgres
7
7
  healthcheck:
8
8
  test: psql postgres --command "select 1" -U postgres
9
- ports:
10
- - "5432:5432"
9
+ # ports:
10
+ # - "5432:5432"
11
11
  environment:
12
12
  POSTGRES_USER: postgres
13
13
  POSTGRES_PASSWORD: postgres
@@ -58,8 +58,8 @@ services:
58
58
  MYSQL_DATABASE: pact_broker
59
59
  MYSQL_USER: pact_broker
60
60
  MYSQL_PASSWORD: pact_broker
61
- ports:
62
- - "3306:3306"
61
+ # ports:
62
+ # - "3306:3306"
63
63
 
64
64
  init-mysql:
65
65
  build: .
@@ -1,6 +1,8 @@
1
1
  require 'webmachine/adapters/rack_mapped'
2
2
  require 'webmachine/rack_adapter_monkey_patch'
3
3
  require 'pact_broker/api/resources'
4
+ require 'pact_broker/api/decorators'
5
+ require 'pact_broker/application_context'
4
6
  require 'pact_broker/feature_toggle'
5
7
 
6
8
  module Webmachine
@@ -12,8 +14,7 @@ module Webmachine
12
14
  end
13
15
 
14
16
  module PactBroker
15
-
16
- API ||= begin
17
+ def self.build_api(application_context = PactBroker::ApplicationContext.default_application_context)
17
18
  pact_api = Webmachine::Application.new do |app|
18
19
  app.routes do
19
20
  add(['trace', :*], Webmachine::Trace::TraceResource) unless ENV['RACK_ENV'] == 'production'
@@ -111,10 +112,20 @@ module PactBroker
111
112
  end
112
113
  end
113
114
 
115
+ # naughty, but better than setting each route manually
116
+ pact_api.routes.each do | route |
117
+ route.instance_variable_get(:@bindings)[:application_context] = application_context
118
+ end
119
+
114
120
  pact_api.configure do |config|
115
121
  config.adapter = :RackMapped
116
122
  end
117
123
 
118
124
  pact_api.adapter
119
125
  end
126
+
127
+
128
+ API ||= begin
129
+ build_api
130
+ end
120
131
  end
@@ -1,7 +1,3 @@
1
- require 'pact_broker/api/decorators/pacticipant_decorator'
2
- require 'pact_broker/api/decorators/pacticipant_collection_decorator'
3
- require 'pact_broker/api/decorators/embedded_version_decorator'
4
- require 'pact_broker/api/decorators/pact_collection_decorator'
5
- require 'pact_broker/api/decorators/pact_pacticipant_decorator'
6
- require 'pact_broker/api/decorators/pact_details_decorator'
7
- require 'pact_broker/api/decorators/tag_decorator'
1
+ Dir.glob(File.expand_path(File.join(__FILE__, "..", "decorators", "*.rb"))).sort.each do | path |
2
+ require path
3
+ end
@@ -0,0 +1,33 @@
1
+ require 'pact_broker/string_refinements'
2
+
3
+ module PactBroker
4
+ module Api
5
+ module Decorators
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::Decorators::#{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
@@ -0,0 +1,13 @@
1
+ require 'pact_broker/api/decorators/decorator_context'
2
+
3
+ module PactBroker
4
+ module Api
5
+ module Decorators
6
+ class DecoratorContextCreator
7
+ def self.call(resource, options)
8
+ Decorators::DecoratorContext.new(resource.base_url, resource.resource_url, resource.request.env, options)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -2,6 +2,7 @@ require_relative 'base_decorator'
2
2
  require_relative 'embedded_version_decorator'
3
3
  require_relative 'latest_pact_decorator'
4
4
  require_relative 'representable_pact'
5
+ require 'pact_broker/domain/pact'
5
6
 
6
7
  module PactBroker
7
8
  module Api
@@ -1,13 +1,12 @@
1
1
  require 'roar/json/hal'
2
2
  require 'pact_broker/api/pact_broker_urls'
3
3
  require_relative 'embedded_version_decorator'
4
+ require 'pact_broker/domain/pacticipant'
5
+ require 'pact_broker/api/decorators/pacticipant_decorator'
4
6
 
5
7
  module PactBroker
6
-
7
8
  module Api
8
-
9
9
  module Decorators
10
-
11
10
  class PacticipantCollectionDecorator < BaseDecorator
12
11
 
13
12
  collection :entries, :as => :pacticipants, :class => PactBroker::Domain::Pacticipant, :extend => PactBroker::Api::Decorators::PacticipantDecorator, embedded: true
@@ -1,3 +1,5 @@
1
+ require 'pact_broker/matrix/reason'
2
+
1
3
  module PactBroker
2
4
  module Api
3
5
  module Decorators
@@ -45,7 +45,7 @@ module PactBroker
45
45
  <link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/material-menu.css'>
46
46
  <link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/jquery-confirm.min.css'>
47
47
  <script src='#{base_url}/javascripts/highlight.pack.js'></script>
48
- <script src='#{base_url}/javascripts/jquery-3.3.1.min.js'></script>
48
+ <script src='#{base_url}/javascripts/jquery-3.5.1.min.js'></script>
49
49
  <script src='#{base_url}/js/bootstrap.min.js'></script>
50
50
  <script src='#{base_url}/javascripts/material-menu.js'></script>
51
51
  <script src='#{base_url}/javascripts/pact.js'></script>
@@ -80,7 +80,7 @@ module PactBroker
80
80
  data-provider-name=\"#{provider_name}\"
81
81
  data-consumer-version-number=\"#{consumer_version_number}\"
82
82
  data-pact-url=\"#{pact_url}\"
83
- class='more-options glyphicon glyphicon-option-horizontal'
83
+ class='more-options kebab-horizontal'
84
84
  aria-hidden='true'></span>
85
85
  </li>
86
86
  </ul>
@@ -37,12 +37,12 @@ module PactBroker
37
37
  end
38
38
 
39
39
  def to_json
40
- Decorators::WebhooksDecorator.new(webhooks).to_json(decorator_options(resource_title: "Webhooks"))
40
+ decorator_class(:webhooks_decorator).new(webhooks).to_json(decorator_options(resource_title: "Webhooks"))
41
41
  end
42
42
 
43
43
  def from_json
44
44
  saved_webhook = webhook_service.create(next_uuid, webhook, consumer, provider)
45
- response.body = Decorators::WebhookDecorator.new(saved_webhook).to_json(decorator_options)
45
+ response.body = decorator_class(:webhook_decorator).new(saved_webhook).to_json(decorator_options)
46
46
  end
47
47
 
48
48
  def policy_name
@@ -74,7 +74,7 @@ module PactBroker
74
74
  end
75
75
 
76
76
  def webhook
77
- @webhook ||= Decorators::WebhookDecorator.new(PactBroker::Domain::Webhook.new).from_json(request_body)
77
+ @webhook ||= decorator_class(:webhook_decorator).new(PactBroker::Domain::Webhook.new).from_json(request_body)
78
78
  end
79
79
 
80
80
  def next_uuid
@@ -55,7 +55,7 @@ module PactBroker
55
55
  end
56
56
  rescue StandardError => e
57
57
  # Want to render a badge, even if there's an error
58
- badge_service.error_badge_url("error", ErrorHandler.display_message(e, "reference: #{ErrorHandler.generate_error_reference}"))
58
+ badge_service.error_badge_url("error", ErrorResponseBodyGenerator.display_message(e, "reference: #{PactBroker::Errors.generate_error_reference}"))
59
59
  end
60
60
  end
61
61
 
@@ -18,11 +18,11 @@ module PactBroker
18
18
  end
19
19
 
20
20
  def to_json
21
- PactBroker::Api::Decorators::DashboardDecorator.new(index_items).to_json(user_options: decorator_context)
21
+ decorator_class(:dashboard_decorator).new(index_items).to_json(decorator_options)
22
22
  end
23
23
 
24
24
  def to_text
25
- PactBroker::Api::Decorators::DashboardTextDecorator.new(index_items).to_text(user_options: decorator_context)
25
+ decorator_class(:dashboard_text_decorator).new(index_items).to_text(decorator_options)
26
26
  end
27
27
 
28
28
  def policy_name
@@ -1,13 +1,13 @@
1
+ # frozen_string_literal: true
1
2
  require 'webmachine'
2
- require 'pact_broker/api/resources/error_handler'
3
3
  require 'pact_broker/services'
4
4
  require 'pact_broker/api/decorators'
5
5
  require 'pact_broker/logging'
6
6
  require 'pact_broker/api/pact_broker_urls'
7
- require 'pact_broker/api/decorators/decorator_context'
8
7
  require 'pact_broker/json'
9
8
  require 'pact_broker/pacts/pact_params'
10
9
  require 'pact_broker/api/resources/authentication'
10
+ require 'pact_broker/errors'
11
11
 
12
12
  module PactBroker
13
13
  module Api
@@ -24,6 +24,7 @@ module PactBroker
24
24
 
25
25
  def initialize
26
26
  PactBroker.configuration.before_resource.call(self)
27
+ application_context.before_resource&.call(self)
27
28
  end
28
29
 
29
30
  def options
@@ -35,6 +36,7 @@ module PactBroker
35
36
  end
36
37
 
37
38
  def finish_request
39
+ application_context.after_resource&.call(self)
38
40
  PactBroker.configuration.after_resource.call(self)
39
41
  end
40
42
 
@@ -43,29 +45,39 @@ module PactBroker
43
45
  end
44
46
 
45
47
  def forbidden?
46
- return false if PactBroker.configuration.authorize.nil?
47
- !PactBroker.configuration.authorize.call(self, {})
48
+ if application_context.resource_authorizer
49
+ !application_context.resource_authorizer.call(self)
50
+ elsif PactBroker.configuration.authorize
51
+ !PactBroker.configuration.authorize.call(self, {})
52
+ else
53
+ false
54
+ end
48
55
  end
49
56
 
57
+ # The path_info segments aren't URL decoded
50
58
  def identifier_from_path
51
- request.path_info.each_with_object({}) do | pair, hash|
52
- hash[pair.first] = pair.last === String ? URI.decode(pair.last) : pair.last
59
+ @identifier_from_path ||= request.path_info.each_with_object({}) do | (key, value), hash|
60
+ if value.is_a?(String)
61
+ hash[key] = URI.decode(value)
62
+ elsif value.is_a?(Symbol) || value.is_a?(Numeric)
63
+ hash[key] = value
64
+ end
53
65
  end
54
66
  end
55
67
 
56
68
  alias_method :path_info, :identifier_from_path
57
69
 
58
70
  def base_url
59
- PactBroker.configuration.base_url || request.base_uri.to_s.chomp('/')
71
+ request.env["pactbroker.base_url"] || PactBroker.configuration.base_url || request.base_uri.to_s.chomp('/')
60
72
  end
61
73
 
62
74
  # See comments for base_url in lib/pact_broker/doc/controllers/app.rb
63
75
  def ui_base_url
64
- PactBroker.configuration.base_url || ''
76
+ request.env["pactbroker.base_url"] || PactBroker.configuration.base_url || ''
65
77
  end
66
78
 
67
79
  def charsets_provided
68
- [['utf-8', :encode]]
80
+ [["utf-8", :encode]]
69
81
  end
70
82
 
71
83
  # We only use utf-8 so leave encoding as it is
@@ -78,15 +90,20 @@ module PactBroker
78
90
  end
79
91
 
80
92
  def decorator_context options = {}
81
- Decorators::DecoratorContext.new(base_url, resource_url, request.env, options)
93
+ application_context.decorator_context_creator.call(self, options)
82
94
  end
83
95
 
84
96
  def decorator_options options = {}
85
97
  { user_options: decorator_context(options) }
86
98
  end
87
99
 
88
- def handle_exception e
89
- PactBroker::Api::Resources::ErrorHandler.call(e, request, response)
100
+ def handle_exception(error)
101
+ error_reference = PactBroker::Errors.generate_error_reference
102
+ application_context.error_logger.call(error, error_reference, request)
103
+ if PactBroker::Errors.reportable_error?(error)
104
+ PactBroker::Errors.report(error, error_reference, request)
105
+ end
106
+ response.body = application_context.error_response_body_generator.call(error, error_reference, request)
90
107
  end
91
108
 
92
109
  def params(options = {})
@@ -214,6 +231,14 @@ module PactBroker
214
231
  def database_connector
215
232
  request.env["pactbroker.database_connector"]
216
233
  end
234
+
235
+ def application_context
236
+ request.path_info[:application_context]
237
+ end
238
+
239
+ def decorator_class(name)
240
+ application_context.decorator_configuration.class_for(name)
241
+ end
217
242
  end
218
243
  end
219
244
  end