pact_broker 2.12.0 → 2.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -5
  3. data/README.md +13 -8
  4. data/bethtest.rb +21 -94
  5. data/db/migrations/20171112_add_test_results.rb +7 -0
  6. data/db/migrations/20171117_create_webhook_events.rb +14 -0
  7. data/db/migrations/20171118_create_webhook_events.rb +18 -0
  8. data/db/migrations/20180108_create_certificates_table.rb +14 -0
  9. data/db/migrations/20180109_migrate_trigger_type.rb +9 -0
  10. data/db/pact_broker_database.sqlite3 +0 -0
  11. data/db/test/backwards_compatibility/gemfiles/1.18.0.gemfile.lock +5 -5
  12. data/db/test/backwards_compatibility/gemfiles/2.0.0.gemfile.lock +5 -5
  13. data/db/test/backwards_compatibility/gemfiles/2.1.0.gemfile.lock +5 -5
  14. data/db/test/backwards_compatibility/gemfiles/2.2.0.gemfile.lock +12 -14
  15. data/db/test/backwards_compatibility/gemfiles/2.3.0.gemfile.lock +12 -14
  16. data/db/test/backwards_compatibility/gemfiles/2.4.2.gemfile.lock +12 -14
  17. data/db/test/backwards_compatibility/gemfiles/2.5.1.gemfile.lock +12 -14
  18. data/db/test/backwards_compatibility/gemfiles/2.6.0.gemfile.lock +12 -14
  19. data/db/test/backwards_compatibility/gemfiles/head.gemfile.lock +16 -15
  20. data/db/test/change_migration_strategy/before/Gemfile +1 -0
  21. data/example/README.md +65 -0
  22. data/example/config.ru +1 -0
  23. data/example/example_data.sql +17 -0
  24. data/lib/pact_broker/api.rb +1 -1
  25. data/lib/pact_broker/api/contracts/webhook_contract.rb +9 -1
  26. data/lib/pact_broker/api/decorators/verification_decorator.rb +1 -0
  27. data/lib/pact_broker/api/decorators/webhook_decorator.rb +35 -5
  28. data/lib/pact_broker/api/resources/matrix_badge.rb +21 -0
  29. data/lib/pact_broker/certificates/certificate.rb +8 -0
  30. data/lib/pact_broker/certificates/service.rb +41 -0
  31. data/lib/pact_broker/doc/controllers/app.rb +12 -2
  32. data/lib/pact_broker/doc/views/webhooks.markdown +37 -2
  33. data/lib/pact_broker/domain/verification.rb +2 -0
  34. data/lib/pact_broker/domain/webhook.rb +2 -1
  35. data/lib/pact_broker/domain/webhook_request.rb +22 -4
  36. data/lib/pact_broker/error.rb +5 -0
  37. data/lib/pact_broker/matrix/parse_query.rb +7 -10
  38. data/lib/pact_broker/matrix/repository.rb +5 -32
  39. data/lib/pact_broker/matrix/service.rb +21 -3
  40. data/lib/pact_broker/pacts/repository.rb +9 -2
  41. data/lib/pact_broker/pacts/service.rb +2 -2
  42. data/lib/pact_broker/services.rb +5 -0
  43. data/lib/pact_broker/ui/app.rb +15 -0
  44. data/lib/pact_broker/ui/controllers/matrix.rb +58 -3
  45. data/lib/pact_broker/ui/views/matrix/show.haml +65 -10
  46. data/lib/pact_broker/verifications/service.rb +6 -1
  47. data/lib/pact_broker/version.rb +1 -1
  48. data/lib/pact_broker/webhooks/job.rb +1 -1
  49. data/lib/pact_broker/webhooks/repository.rb +17 -0
  50. data/lib/pact_broker/webhooks/service.rb +8 -7
  51. data/lib/pact_broker/webhooks/triggered_webhook.rb +1 -1
  52. data/lib/pact_broker/webhooks/webhook.rb +3 -0
  53. data/lib/pact_broker/webhooks/webhook_event.rb +24 -0
  54. data/pact_broker.gemspec +2 -1
  55. data/public/javascripts/matrix.js +60 -0
  56. data/public/stylesheets/matrix.css +12 -0
  57. data/script/db-spec.sh +1 -0
  58. data/script/foo-bar-verification.json +57 -0
  59. data/script/insert-self-signed-certificate-from-url.rb +32 -0
  60. data/script/publish-verification.sh +5 -0
  61. data/script/seed-matrix.rb +6 -5
  62. data/script/seed.rb +67 -59
  63. data/spec/features/create_webhook_spec.rb +4 -1
  64. data/spec/features/get_matrix_badge_spec.rb +40 -0
  65. data/spec/features/publish_verification_spec.rb +28 -4
  66. data/spec/fixtures/certificate-invalid.pem +29 -0
  67. data/spec/fixtures/certificate.pem +53 -0
  68. data/spec/fixtures/certificates/cacert.pem +21 -0
  69. data/spec/fixtures/certificates/cert.pem +20 -0
  70. data/spec/fixtures/certificates/key.pem +27 -0
  71. data/spec/fixtures/certificates/self-signed.badssl.com.pem +21 -0
  72. data/spec/fixtures/verification.json +4 -1
  73. data/spec/fixtures/webhook_valid.json +3 -0
  74. data/spec/integration/webhooks/certificate_spec.rb +80 -0
  75. data/spec/lib/pact_broker/api/contracts/webhook_contract_spec.rb +20 -0
  76. data/spec/lib/pact_broker/api/decorators/pact_webhooks_status_decorator_spec.rb +2 -2
  77. data/spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb +5 -0
  78. data/spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb +1 -0
  79. data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +29 -19
  80. data/spec/lib/pact_broker/api/resources/badge_spec.rb +61 -0
  81. data/spec/lib/pact_broker/api/resources/matrix_badge_spec.rb +11 -0
  82. data/spec/lib/pact_broker/api/resources/pact_webhooks_spec.rb +8 -9
  83. data/spec/lib/pact_broker/certificates/service_spec.rb +60 -0
  84. data/spec/lib/pact_broker/domain/verification_spec.rb +13 -0
  85. data/spec/lib/pact_broker/domain/webhook_request_spec.rb +0 -4
  86. data/spec/lib/pact_broker/matrix/service_spec.rb +40 -8
  87. data/spec/lib/pact_broker/pacts/repository_spec.rb +18 -1
  88. data/spec/lib/pact_broker/webhooks/job_spec.rb +1 -1
  89. data/spec/lib/pact_broker/webhooks/repository_spec.rb +53 -13
  90. data/spec/lib/pact_broker/webhooks/service_spec.rb +9 -6
  91. data/spec/migrations/change_migration_strategy_spec.rb +13 -14
  92. data/spec/spec_helper.rb +4 -0
  93. data/spec/support/ssl_webhook_server.rb +37 -0
  94. data/spec/support/test_data_builder.rb +12 -4
  95. data/tasks/database.rb +9 -7
  96. data/tasks/database/table_dependency_calculator.rb +44 -0
  97. metadata +57 -6
  98. data/lib/pact_broker/doc/views/pact-webhooks.markdown +0 -50
  99. data/lib/pact_broker/doc/views/webhooks-create.markdown +0 -38
  100. data/lib/pact_broker/doc/views/webhooks-webhooks.markdown +0 -15
@@ -0,0 +1,5 @@
1
+ module PactBroker
2
+
3
+ class Error < StandardError; end
4
+
5
+ end
@@ -7,10 +7,10 @@ module PactBroker
7
7
  params = Rack::Utils.parse_nested_query(query)
8
8
  selectors = (params['q'] || []).collect do |i|
9
9
  p = {}
10
- p[:pacticipant_name] = i['pacticipant'] if i['pacticipant']
11
- p[:pacticipant_version_number] = i['version'] if i['version']
10
+ p[:pacticipant_name] = i['pacticipant'] if i['pacticipant'] && i['pacticipant'] != ''
11
+ p[:pacticipant_version_number] = i['version'] if i['version'] && i['version'] != ''
12
12
  p[:latest] = true if i['latest'] == 'true'
13
- p[:tag] = i['tag'] if i['tag']
13
+ p[:tag] = i['tag'] if i['tag'] && i['tag'] != ''
14
14
  p
15
15
  end
16
16
  options = {}
@@ -22,19 +22,16 @@ module PactBroker
22
22
  if params.key?('success') && params['success'].is_a?(String)
23
23
  options[:success] = [params['success'] == '' ? nil : params['success'] == 'true']
24
24
  end
25
- if params.key?('scope')
26
- options[:scope] = params['scope']
27
- end
28
- if params.key?('latestby')
25
+ if params.key?('latestby') && params['latestby'] != ''
29
26
  options[:latestby] = params['latestby']
30
27
  end
31
- if params.key?('limit')
28
+ if params.key?('limit') && params['limit'] != ''
32
29
  options[:limit] = params['limit']
33
30
  end
34
- if params.key?('latest')
31
+ if params.key?('latest') && params['latest'] != ''
35
32
  options[:latest] = params['latest']
36
33
  end
37
- if params.key?('tag')
34
+ if params.key?('tag') && params['tag'] != ''
38
35
  options[:tag] = params['tag']
39
36
  end
40
37
  return selectors, options
@@ -1,9 +1,13 @@
1
1
  require 'pact_broker/repositories/helpers'
2
2
  require 'pact_broker/matrix/row'
3
3
  require 'pact_broker/matrix/latest_row'
4
+ require 'pact_broker/error'
4
5
 
5
6
  module PactBroker
6
7
  module Matrix
8
+
9
+ class Error < PactBroker::Error; end
10
+
7
11
  class Repository
8
12
  include PactBroker::Repositories::Helpers
9
13
  include PactBroker::Repositories
@@ -78,7 +82,7 @@ module PactBroker
78
82
  # resource validation currently stops tag being specified without latest=true
79
83
  if selector[:tag] && selector[:latest]
80
84
  version = version_repository.find_by_pacticpant_name_and_latest_tag(selector[:pacticipant_name], selector[:tag])
81
- raise "Could not find version with tag #{selector[:tag].inspect} for #{selector[:pacticipant_name]}" unless version
85
+ raise Error.new("Could not find version with tag #{selector[:tag].inspect} for #{selector[:pacticipant_name]}") unless version
82
86
  # validation in resource should ensure we always have a version
83
87
  {
84
88
  pacticipant_name: selector[:pacticipant_name],
@@ -122,37 +126,6 @@ module PactBroker
122
126
  .flatten
123
127
  .uniq
124
128
  end
125
-
126
- # def where_row_matches_selectors selectors, query
127
- # if selectors.size == 1
128
- # where_consumer_or_provider_is(selectors.first, query)
129
- # else
130
- # where_consumer_and_provider_in(selectors, query)
131
- # end
132
- # end
133
-
134
- # def where_consumer_and_provider_in selectors, query
135
- # query.where{
136
- # Sequel.&(
137
- # Sequel.|(
138
- # *selectors.collect{ |s| s[:pacticipant_version_number] ? Sequel.&(consumer_name: s[:pacticipant_name], consumer_version_number: s[:pacticipant_version_number]) : Sequel.&(consumer_name: s[:pacticipant_name]) }
139
- # ),
140
- # Sequel.|(
141
- # *(selectors.collect{ |s| s[:pacticipant_version_number] ? Sequel.&(provider_name: s[:pacticipant_name], provider_version_number: s[:pacticipant_version_number]) : Sequel.&(provider_name: s[:pacticipant_name]) } +
142
- # selectors.collect{ |s| Sequel.&(provider_name: s[:pacticipant_name], provider_version_number: nil) })
143
- # )
144
- # )
145
- # }
146
- # end
147
-
148
- # def where_consumer_or_provider_is s, query
149
- # query.where{
150
- # Sequel.|(
151
- # s[:pacticipant_version_number] ? Sequel.&(consumer_name: s[:pacticipant_name], consumer_version_number: s[:pacticipant_version_number]) : Sequel.&(consumer_name: s[:pacticipant_name]),
152
- # s[:pacticipant_version_number] ? Sequel.&(provider_name: s[:pacticipant_name], provider_version_number: s[:pacticipant_version_number]) : Sequel.&(provider_name: s[:pacticipant_name])
153
- # )
154
- # }
155
- # end
156
129
  end
157
130
  end
158
131
  end
@@ -16,6 +16,26 @@ module PactBroker
16
16
  matrix_repository.find_for_consumer_and_provider params[:consumer_name], params[:provider_name]
17
17
  end
18
18
 
19
+ def find_for_consumer_and_provider_with_tags params
20
+ consumer_criteria = {
21
+ pacticipant_name: params[:consumer_name],
22
+ tag: params[:tag],
23
+ latest: true
24
+ }
25
+ provider_criteria = {
26
+ pacticipant_name: params[:provider_name],
27
+ tag: params[:provider_tag],
28
+ latest: true
29
+ }
30
+ selectors = [consumer_criteria, provider_criteria]
31
+ options = { latestby: 'cvpv' }
32
+ if validate_selectors(selectors).empty?
33
+ matrix_repository.find(selectors, options).first
34
+ else
35
+ nil
36
+ end
37
+ end
38
+
19
39
  def find_compatible_pacticipant_versions criteria
20
40
  matrix_repository.find_compatible_pacticipant_versions criteria
21
41
  end
@@ -24,9 +44,7 @@ module PactBroker
24
44
  error_messages = []
25
45
 
26
46
  selectors.each do | s |
27
- if s[:pacticipant_name].nil? && s[:pacticipant_version_number].nil?
28
- error_messages << "Please specify the pacticipant name and version"
29
- elsif s[:pacticipant_name].nil?
47
+ if s[:pacticipant_name].nil?
30
48
  error_messages << "Please specify the pacticipant name"
31
49
  else
32
50
  if s.key?(:pacticipant_version_number) && s.key?(:latest)
@@ -103,13 +103,20 @@ module PactBroker
103
103
  end
104
104
 
105
105
  def find_pact consumer_name, consumer_version, provider_name, pact_version_sha = nil
106
- query = pact_version_sha ? AllPactPublications.pact_version_sha(pact_version_sha) : LatestPactPublicationsByConsumerVersion
106
+ query = if pact_version_sha
107
+ AllPactPublications
108
+ .pact_version_sha(pact_version_sha)
109
+ .reverse_order(:consumer_version_order)
110
+ .limit(1)
111
+ else
112
+ LatestPactPublicationsByConsumerVersion
113
+ end
107
114
  query = query
108
115
  .eager(:tags)
109
116
  .consumer(consumer_name)
110
117
  .provider(provider_name)
111
118
  query = query.consumer_version_number(consumer_version) if consumer_version
112
- query.limit(1).collect(&:to_domain_with_content)[0]
119
+ query.collect(&:to_domain_with_content)[0]
113
120
  end
114
121
 
115
122
  def find_all_revisions consumer_name, consumer_version, provider_name
@@ -102,7 +102,7 @@ module PactBroker
102
102
  updated_pact = pact_repository.update existing_pact.id, params
103
103
 
104
104
  if existing_pact.json_content != updated_pact.json_content
105
- webhook_service.execute_webhooks updated_pact
105
+ webhook_service.execute_webhooks updated_pact, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
106
106
  end
107
107
 
108
108
  updated_pact
@@ -117,7 +117,7 @@ module PactBroker
117
117
 
118
118
  def trigger_webhooks pact
119
119
  if pact_has_changed_since_previous_version? pact
120
- webhook_service.execute_webhooks pact
120
+ webhook_service.execute_webhooks pact, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
121
121
  end
122
122
  end
123
123
  end
@@ -56,5 +56,10 @@ module PactBroker
56
56
  require 'pact_broker/matrix/service'
57
57
  Matrix::Service
58
58
  end
59
+
60
+ def certificate_service
61
+ require 'pact_broker/certificates/service'
62
+ Certificates::Service
63
+ end
59
64
  end
60
65
  end
@@ -3,8 +3,22 @@ require 'pact_broker/ui/controllers/groups'
3
3
  require 'pact_broker/ui/controllers/matrix'
4
4
  require 'pact_broker/doc/controllers/app'
5
5
 
6
+
6
7
  module PactBroker
7
8
  module UI
9
+ class PathInfoFixer
10
+ PATH_INFO = 'PATH_INFO'.freeze
11
+
12
+ def initialize app
13
+ @app = app
14
+ end
15
+
16
+ def call env
17
+ env[PATH_INFO] = '/' if env[PATH_INFO] == ''
18
+ @app.call(env)
19
+ end
20
+ end
21
+
8
22
  class App
9
23
 
10
24
  def initialize
@@ -23,6 +37,7 @@ module PactBroker
23
37
  end
24
38
 
25
39
  map "/matrix" do
40
+ use PathInfoFixer
26
41
  run PactBroker::UI::Controllers::Matrix
27
42
  end
28
43
 
@@ -1,5 +1,7 @@
1
1
  require 'pact_broker/ui/controllers/base_controller'
2
2
  require 'pact_broker/ui/view_models/matrix_line'
3
+ require 'pact_broker/matrix/parse_query'
4
+ require 'pact_broker/logging'
3
5
  require 'haml'
4
6
 
5
7
  module PactBroker
@@ -8,20 +10,73 @@ module PactBroker
8
10
  class Matrix < Base
9
11
 
10
12
  include PactBroker::Services
13
+ include PactBroker::Logging
14
+
15
+ get "/" do
16
+ selectors = [OpenStruct.new, OpenStruct.new]
17
+ options = { limit: 100, latestby: 'cvpv' }
18
+ locals = {
19
+ lines: [],
20
+ title: "The Matrix",
21
+ selectors: create_selector_objects(selectors),
22
+ options: create_options_model(options)
23
+ }
24
+ begin
25
+ if params[:q]
26
+ selectors, options = PactBroker::Matrix::ParseQuery.call(request.env['QUERY_STRING'])
27
+ locals[:selectors] = create_selector_objects(selectors)
28
+ locals[:options] = create_options_model(options)
29
+ errors = matrix_service.validate_selectors(selectors)
30
+ if errors.empty?
31
+ lines = matrix_service.find(selectors, options)
32
+ locals[:lines] = lines.collect{ |line| PactBroker::UI::ViewDomain::MatrixLine.new(line) }
33
+ else
34
+ locals[:errors] = errors
35
+ end
36
+ end
37
+ rescue StandardError => e
38
+ log_error(e) unless e.is_a?(PactBroker::Error)
39
+ locals[:errors] = [e.message]
40
+ end
41
+ haml :'matrix/show', {locals: locals, layout: :'layouts/main'}
42
+ end
11
43
 
12
44
  get "/provider/:provider_name/consumer/:consumer_name" do
13
45
  selectors = [{ pacticipant_name: params[:consumer_name] }, { pacticipant_name: params[:provider_name] } ]
14
- lines = matrix_service.find(selectors, {latestby: 'cvpv', limit: 1000})
15
- lines = lines.collect{|line| PactBroker::UI::ViewDomain::MatrixLine.new(line) }.sort
46
+ options = {latestby: 'cvpv', limit: 100}
47
+ lines = matrix_service.find(selectors, options)
48
+ lines = lines.collect{ |line| PactBroker::UI::ViewDomain::MatrixLine.new(line) }.sort
16
49
  locals = {
17
50
  lines: lines,
18
51
  title: "The Matrix",
19
52
  consumer_name: params[:consumer_name],
20
- provider_name: params[:provider_name]
53
+ provider_name: params[:provider_name],
54
+ selectors: create_selector_objects(selectors),
55
+ options: create_options_model(options)
21
56
  }
22
57
  haml :'matrix/show', {locals: locals, layout: :'layouts/main'}
23
58
  end
24
59
 
60
+ def create_selector_objects(selector_hashes)
61
+ selector_hashes.collect do | selector_hash |
62
+ o = OpenStruct.new(selector_hash)
63
+ o.tag_disabled = o.tag ? nil : 'disabled'
64
+ o.version_disabled = o.pacticipant_version_number ? nil : 'disabled'
65
+ o.specify_latest_tag_checked = o.tag ? 'checked' : nil
66
+ o.specify_latest_checked = o.latest ? 'checked' : nil
67
+ o.specify_version_checked = o.pacticipant_version_number ? 'checked' : nil
68
+ o.specify_all_versions_checked = !(o.tag || o.pacticipant_version_number) ? 'checked' : nil
69
+ o
70
+ end
71
+ end
72
+
73
+ def create_options_model(options)
74
+ o = OpenStruct.new(options)
75
+ o.cvpv_checked = o.latestby == 'cvpv' ? 'checked' : nil
76
+ o.cvp_checked = o.latestby == 'cvp' ? 'checked' : nil
77
+ o.all_rows_checked = o.latestby.nil? ? 'checked' : nil
78
+ o
79
+ end
25
80
  end
26
81
  end
27
82
  end
@@ -1,13 +1,78 @@
1
1
  %body
2
2
  %link{rel: 'stylesheet', href: '/css/bootstrap.min.css'}
3
3
  %link{rel: 'stylesheet', href: '/stylesheets/index.css'}
4
+ %link{rel: 'stylesheet', href: '/stylesheets/matrix.css'}
4
5
  %script{type: 'text/javascript', src:'/javascripts/jquery-2.1.1.min.js'}
5
6
  %script{type: 'text/javascript', src:'/javascripts/jquery.tablesorter.min.js'}
7
+ %script{type: 'text/javascript', src:'/javascripts/matrix.js'}
6
8
  %script{type: 'text/javascript', src:'/js/bootstrap.min.js'}
7
9
 
10
+ -# This code is an embarassment. Sorry. Just trying to get as much stuff done in the little time I have.
11
+
8
12
  .container
9
13
  %h1.page-header
10
14
  = title
15
+
16
+ - if defined?(errors) && errors.any?
17
+ - errors.each do | error |
18
+ %div.alert.alert-danger
19
+ = error
20
+
21
+ %form{action: '/matrix', onsubmit:'return onSubmit()'}
22
+ - selectors.each_with_index do | selector, index |
23
+ .selector
24
+ %label{for: "pacticipant#{index}"}
25
+ Pacticipant name
26
+ %input{name: 'q[]pacticipant', id: "pacticipant1#{index}", value: selector.pacticipant_name}
27
+
28
+ .input-group
29
+ %input{type: 'radio', name: "ignorethis#{index}", class: 'specify-all-versions version-selectorizor', value: 'all_versions', id: "pacticipant#{index}_all_versions", checked: selector.specify_all_versions_checked}
30
+ %label{for: "pacticipant#{index}_all_versions"}
31
+ All versions
32
+
33
+ .input-group
34
+ %input{type: 'radio', name: "ignorethis#{index}", class: 'specify-version version-selectorizor', value: 'version', id: "pacticipant#{index}_by_version", checked: selector.specify_version_checked}
35
+ %label{for: "pacticipant#{index}_by_version"}
36
+ Version
37
+ %input{name: 'q[]version', type: 'text', id: "pacticipant#{index}_version", class: 'by-version', value: selector.pacticipant_version_number}
38
+
39
+ .input-group
40
+ %input{type: 'radio', name: "ignorethis#{index}", class: 'specify-latest version-selectorizor', value: 'tag', id: "pacticipant#{index}_latest", checked: selector.specify_latest_checked}
41
+ %label{for: "pacticipant#{index}_latest"}
42
+ Latest version
43
+ %input{name: 'q[]latest', value: 'true', hidden: true, class: 'latest-flag'}
44
+
45
+ .input-group
46
+ %input{type: 'radio', name: "ignorethis#{index}", class: 'specify-latest-tag version-selectorizor', value: 'tag', id: "pacticipant#{index}_by_tag", checked: selector.specify_latest_tag_checked}
47
+ %label{for: "pacticipant#{index}_by_tag"}
48
+ Latest version with tag
49
+ %input{name: 'q[]tag', type: 'text', id: "pacticipant#{index}_tag", class: "by-latest-tag", value: selector.tag}
50
+ %input{name: 'q[]latest', value: 'true', hidden: true, class: 'latest-flag'}
51
+
52
+ %div.top-of-group
53
+ .input-group
54
+ %input{type: 'radio', name: "latestby", class: '', value: 'cvpv', id: 'cvpv', checked: options.cvpv_checked}
55
+ %label{for: 'cvpv'}
56
+ Show latest row for each consumer version/provider version
57
+ %div
58
+ .input-group
59
+ %input{type: 'radio', name: "latestby", class: '', value: 'cvp', id: 'cvp', checked: options.cvp_checked}
60
+ %label{for: 'cvp'}
61
+ Show latest row for each consumer version/provider
62
+ %div
63
+ .input-group
64
+ %input{type: 'radio', name: "latestby", class: '', value: '', id: 'all_rows', checked: options.all_rows_checked}
65
+ %label{for: 'all_rows'}
66
+ Show all rows
67
+ %div.top-of-group
68
+ %label{for: "limit"}
69
+ Limit
70
+ %input{name: 'limit', id: "limit", value: options.limit}
71
+ %div.top-of-group
72
+ %input{type: 'submit'}
73
+
74
+
75
+
11
76
  %table.table.table-bordered.table-striped{id: 'matrix'}
12
77
  %thead
13
78
  %th.consumer
@@ -45,13 +110,3 @@
45
110
  = line.provider_version_number
46
111
  %td.verification-result{class: line.verification_status_class}
47
112
  = line.verification_status
48
-
49
- :javascript
50
- $(function(){
51
- $("#matrix").tablesorter({
52
- textExtraction : function(node, table, cellIndex){
53
- n = $(node);
54
- return n.attr('data-sort-value') || n.text();
55
- }
56
- });
57
- });
@@ -22,7 +22,8 @@ module PactBroker
22
22
  provider_version_number = params.fetch('providerApplicationVersion')
23
23
  PactBroker::Api::Decorators::VerificationDecorator.new(verification).from_hash(params)
24
24
  verification.number = next_verification_number
25
- verification_repository.create(verification, provider_version_number, pact)
25
+ webhook_service.execute_webhooks pact, PactBroker::Webhooks::WebhookEvent::VERIFICATION_PUBLISHED
26
+ verification = verification_repository.create(verification, provider_version_number, pact)
26
27
  end
27
28
 
28
29
  def errors params
@@ -35,6 +36,10 @@ module PactBroker
35
36
  verification_repository.find(params.fetch(:consumer_name), params.fetch(:provider_name), params.fetch(:pact_version_sha), params.fetch(:verification_number))
36
37
  end
37
38
 
39
+ def find_by_id id
40
+ PactBroker::Domain::Verification.find(id: id)
41
+ end
42
+
38
43
  def find_latest_verifications_for_consumer_version params
39
44
  verification_repository.find_latest_verifications_for_consumer_version params[:consumer_name], params[:consumer_version_number]
40
45
  end
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = '2.12.0'
2
+ VERSION = '2.13.0'
3
3
  end
@@ -45,7 +45,7 @@ module PactBroker
45
45
  end
46
46
 
47
47
  def handle_error e
48
- log_error e
48
+ log_error e, "Error executing triggered webhook with ID #{triggered_webhook ? triggered_webhook.id : nil}"
49
49
  handle_failure
50
50
  end
51
51
 
@@ -3,6 +3,7 @@ require 'pact_broker/domain/webhook'
3
3
  require 'pact_broker/domain/pacticipant'
4
4
  require 'pact_broker/db'
5
5
  require 'pact_broker/webhooks/webhook'
6
+ require 'pact_broker/webhooks/webhook_event'
6
7
  require 'pact_broker/webhooks/triggered_webhook'
7
8
  require 'pact_broker/webhooks/latest_triggered_webhook'
8
9
  require 'pact_broker/webhooks/execution'
@@ -21,6 +22,9 @@ module PactBroker
21
22
  webhook.request.headers.each_pair do | name, value |
22
23
  db_webhook.add_header PactBroker::Webhooks::WebhookHeader.from_domain(name, value, db_webhook.id)
23
24
  end
25
+ (webhook.events || []).each do | webhook_event |
26
+ db_webhook.add_event(webhook_event)
27
+ end
24
28
  find_by_uuid db_webhook.uuid
25
29
  end
26
30
 
@@ -32,9 +36,13 @@ module PactBroker
32
36
  existing_webhook = Webhook.find(uuid: uuid)
33
37
  existing_webhook.update_from_domain(webhook).save
34
38
  existing_webhook.headers.collect(&:delete)
39
+ existing_webhook.events.collect(&:delete)
35
40
  webhook.request.headers.each_pair do | name, value |
36
41
  existing_webhook.add_header PactBroker::Webhooks::WebhookHeader.from_domain(name, value, existing_webhook.id)
37
42
  end
43
+ (webhook.events || []).each do | webhook_event |
44
+ existing_webhook.add_event(webhook_event)
45
+ end
38
46
  find_by_uuid uuid
39
47
  end
40
48
 
@@ -55,6 +63,15 @@ module PactBroker
55
63
  Webhook.where(consumer_id: consumer.id, provider_id: provider.id).collect(&:to_domain)
56
64
  end
57
65
 
66
+ def find_by_consumer_and_provider_and_event_name consumer, provider, event_name
67
+ Webhook
68
+ .select_all_qualified
69
+ .where(consumer_id: consumer.id, provider_id: provider.id)
70
+ .join(:webhook_events, { webhook_id: :id })
71
+ .where(Sequel[:webhook_events][:name] => event_name)
72
+ .collect(&:to_domain)
73
+ end
74
+
58
75
  def find_by_consumer_and_provider_existing_at consumer, provider, date_time
59
76
  Webhook.where(consumer_id: consumer.id, provider_id: provider.id)
60
77
  .where(Sequel.lit("created_at < ?", date_time))