pact_broker 2.65.0 → 2.66.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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/db/ddl_statements/latest_triggered_webhooks.rb +66 -0
  4. data/db/migrations/20180119_update_latest_triggered_webhooks.rb +5 -39
  5. data/db/migrations/20200930_update_latest_triggered_webhooks.rb +15 -0
  6. data/db/migrations/migration_helper.rb +10 -2
  7. data/lib/pact_broker/api/decorators/decorator_context.rb +2 -2
  8. data/lib/pact_broker/api/decorators/pagination_links.rb +34 -0
  9. data/lib/pact_broker/api/decorators/versions_decorator.rb +5 -1
  10. data/lib/pact_broker/api/pact_broker_urls.rb +8 -0
  11. data/lib/pact_broker/api/resources/index.rb +1 -1
  12. data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +11 -1
  13. data/lib/pact_broker/api/resources/versions.rb +12 -1
  14. data/lib/pact_broker/db/clean.rb +100 -43
  15. data/lib/pact_broker/doc/views/pacticipant/versions.markdown +9 -0
  16. data/lib/pact_broker/domain/pacticipant.rb +4 -0
  17. data/lib/pact_broker/domain/tag.rb +2 -0
  18. data/lib/pact_broker/domain/version.rb +1 -0
  19. data/lib/pact_broker/feature_toggle.rb +8 -4
  20. data/lib/pact_broker/matrix/service.rb +3 -0
  21. data/lib/pact_broker/pacticipants/repository.rb +6 -5
  22. data/lib/pact_broker/pacticipants/service.rb +5 -18
  23. data/lib/pact_broker/pacts/latest_tagged_pact_publications.rb +15 -1
  24. data/lib/pact_broker/tags/repository.rb +2 -5
  25. data/lib/pact_broker/test/test_data_builder.rb +22 -2
  26. data/lib/pact_broker/ui/views/matrix/show.haml +8 -0
  27. data/lib/pact_broker/version.rb +1 -1
  28. data/spec/features/get_versions_spec.rb +8 -0
  29. data/spec/lib/pact_broker/api/decorators/versions_decorator_spec.rb +14 -9
  30. data/spec/lib/pact_broker/api/resources/default_base_resource_spec.rb +10 -4
  31. data/spec/lib/pact_broker/db/clean_spec.rb +72 -4
  32. data/spec/lib/pact_broker/feature_toggle_spec.rb +9 -1
  33. data/spec/lib/pact_broker/pacticipants/repository_spec.rb +8 -1
  34. data/spec/lib/pact_broker/pacts/latest_tagged_pact_publications_spec.rb +99 -0
  35. data/spec/lib/pact_broker/webhooks/repository_spec.rb +20 -0
  36. metadata +8 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2f74ca577601716567fbf1b435dba1a2d0c8b3cec8d3c9f77ca3930ce83e49bd
4
- data.tar.gz: 3920435e5b898db13b39808b43a0f40de770674ecf99ce84e3587b4658a1b0a5
3
+ metadata.gz: 2ded381f9c89732b48d2d27f1f9dc7c26708a54c407c6a777a0f698c221d03b5
4
+ data.tar.gz: 9ac73a1fde0c35b5cc5870e8006556bcc74a5c3765d86ba373b9a91040657b14
5
5
  SHA512:
6
- metadata.gz: 72e1efd36d6f4ccce34a9e7088ee0232678721606710a5d2a91f74d72ddb0b1d4642645ab26083af05683343f928818132ec37eab0b76e54efc0077fe4d474ea
7
- data.tar.gz: 0dee5c2f282ca4a21e25502a4ea2c3d11dae57931e196297f4d3fcda46f6bfec82c155899e69975f72f79c16bc34813ce38b6bd9171c4d4d45238564f0d21255
6
+ metadata.gz: 15667e1349e7ff6a2484016659d1eee0a26d95471ea6f0f959135f72b2fcf68714a550421a1ff239efa089514ef0064a07602cd84c22f60fedfc82b30a2337a0
7
+ data.tar.gz: e1c836e2cc3b82096ee5d03c9fe215e5010a7b0eef2aad43781a8713e5e8f8b987fbc86c19d5b5c95c819831a6d07f953a3b8b552d6104b3daddc5a1e62680d0
@@ -1,3 +1,17 @@
1
+ <a name="v2.66.0"></a>
2
+ ### v2.66.0 (2020-10-01)
3
+
4
+ #### Features
5
+
6
+ * paginate pacticipant versions ([f489ba7b](/../../commit/f489ba7b))
7
+
8
+ * **webhooks**
9
+ * add event name to group by clause when selecting latest triggered webhooks ([134f12c8](/../../commit/134f12c8))
10
+
11
+ #### Bug Fixes
12
+
13
+ * maintain latest and tag params when submitting page after following link from can-i-deploy debug logs ([6e2f1a85](/../../commit/6e2f1a85))
14
+
1
15
  <a name="v2.65.0"></a>
2
16
  ### v2.65.0 (2020-09-25)
3
17
 
@@ -0,0 +1,66 @@
1
+ # These views find the latest triggered webhook for each webhook/consumer/provider
2
+ # by finding the latest execution date for each webhook
3
+ # then taking the row with the max ID in case there there are two
4
+ # triggered webhooks for the same UUID and same creation date
5
+ # Not sure if this is strictly necessary to do the extra step, but better to be
6
+ # safe than sorry.
7
+ # I probably could just take the max ID for each webhook/consumer/provider, but
8
+ # something in my head says that
9
+ # relying on the primary key for order is not a good idea, even though
10
+ # according to the SQL it should be fine.
11
+ def latest_triggered_webhook_creation_dates_v2
12
+ "select webhook_uuid, consumer_id, provider_id, max(created_at) as latest_triggered_webhook_created_at
13
+ from triggered_webhooks
14
+ group by webhook_uuid, consumer_id, provider_id"
15
+ end
16
+
17
+ # Ignore ltwcd.latest_triggered_webhook_created_at, it's there because postgres doesn't allow you to modify
18
+ # the names and types of columns in a view
19
+ def latest_triggered_webhook_ids_v2
20
+ "select tw.webhook_uuid, tw.consumer_id, tw.provider_id, ltwcd.latest_triggered_webhook_created_at, max(tw.id) as latest_triggered_webhook_id
21
+ from latest_triggered_webhook_creation_dates ltwcd
22
+ inner join triggered_webhooks tw
23
+ on tw.consumer_id = ltwcd.consumer_id
24
+ and tw.provider_id = ltwcd.provider_id
25
+ and tw.webhook_uuid = ltwcd.webhook_uuid
26
+ and tw.created_at = ltwcd.latest_triggered_webhook_created_at
27
+ group by tw.webhook_uuid, tw.consumer_id, tw.provider_id, ltwcd.latest_triggered_webhook_created_at"
28
+ end
29
+
30
+ def latest_triggered_webhooks_v2
31
+ "select tw.*
32
+ from triggered_webhooks tw
33
+ inner join latest_triggered_webhook_ids ltwi
34
+ on tw.consumer_id = ltwi.consumer_id
35
+ and tw.provider_id = ltwi.provider_id
36
+ and tw.webhook_uuid = ltwi.webhook_uuid
37
+ and tw.id = ltwi.latest_triggered_webhook_id"
38
+ end
39
+
40
+ # use explicit columns - can't drop event_name in 20200922_add_event_to_triggered_webhook.rb
41
+ # if tw.* is used because you can't remove columns from a view in postgres
42
+ def latest_triggered_webhooks_v3_rollback(is_postgres)
43
+ if is_postgres
44
+ "select tw.id, tw.trigger_uuid, tw.trigger_type, tw.pact_publication_id, tw.webhook_id, tw.webhook_uuid, tw.consumer_id, tw.provider_id, tw.status, tw.created_at, tw.updated_at, tw.verification_id, ''::text as event_name
45
+ from triggered_webhooks tw
46
+ inner join latest_triggered_webhook_ids ltwi
47
+ on tw.consumer_id = ltwi.consumer_id
48
+ and tw.provider_id = ltwi.provider_id
49
+ and tw.webhook_uuid = ltwi.webhook_uuid
50
+ and tw.id = ltwi.latest_triggered_webhook_id"
51
+ else
52
+ latest_triggered_webhooks_v2
53
+ end
54
+ end
55
+
56
+ ##### v3
57
+
58
+ # screw dates, just use IDs.
59
+ def latest_triggered_webhooks_v3
60
+ "select tw.id, tw.trigger_uuid, tw.trigger_type, tw.pact_publication_id, tw.webhook_id, tw.webhook_uuid, tw.consumer_id, tw.provider_id, tw.status, tw.created_at, tw.updated_at, tw.verification_id, tw.event_name
61
+ from triggered_webhooks tw
62
+ inner join (select max(id) as max_id
63
+ from triggered_webhooks
64
+ group by webhook_uuid, consumer_id, provider_id, event_name) latest_ids
65
+ on latest_ids.max_id = tw.id"
66
+ end
@@ -1,44 +1,10 @@
1
+ require_relative '../ddl_statements/latest_triggered_webhooks'
2
+
1
3
  Sequel.migration do
2
4
  up do
3
- # These views find the latest triggered webhook for each webhook/consumer/provider
4
- # by finding the latest execution date for each webhook
5
- # then taking the row with the max ID in case there there are two
6
- # triggered webhooks for the same UUID and same creation date
7
- # Not sure if this is strictly necessary to do the extra step, but better to be
8
- # safe than sorry.
9
- # I probably could just take the max ID for each webhook/consumer/provider, but
10
- # something in my head says that
11
- # relying on the primary key for order is not a good idea, even though
12
- # according to the SQL it should be fine.
13
-
14
- create_or_replace_view(:latest_triggered_webhook_creation_dates,
15
- "select webhook_uuid, consumer_id, provider_id, max(created_at) as latest_triggered_webhook_created_at
16
- from triggered_webhooks
17
- group by webhook_uuid, consumer_id, provider_id"
18
- )
19
-
20
- # Ignore ltwcd.latest_triggered_webhook_created_at, it's there because postgres doesn't allow you to modify
21
- # the names and types of columns in a view
22
- create_or_replace_view(:latest_triggered_webhook_ids,
23
- "select tw.webhook_uuid, tw.consumer_id, tw.provider_id, ltwcd.latest_triggered_webhook_created_at, max(tw.id) as latest_triggered_webhook_id
24
- from latest_triggered_webhook_creation_dates ltwcd
25
- inner join triggered_webhooks tw
26
- on tw.consumer_id = ltwcd.consumer_id
27
- and tw.provider_id = ltwcd.provider_id
28
- and tw.webhook_uuid = ltwcd.webhook_uuid
29
- and tw.created_at = ltwcd.latest_triggered_webhook_created_at
30
- group by tw.webhook_uuid, tw.consumer_id, tw.provider_id, ltwcd.latest_triggered_webhook_created_at"
31
- )
32
-
33
- create_or_replace_view(:latest_triggered_webhooks,
34
- "select tw.*
35
- from triggered_webhooks tw
36
- inner join latest_triggered_webhook_ids ltwi
37
- on tw.consumer_id = ltwi.consumer_id
38
- and tw.provider_id = ltwi.provider_id
39
- and tw.webhook_uuid = ltwi.webhook_uuid
40
- and tw.id = ltwi.latest_triggered_webhook_id"
41
- )
5
+ create_or_replace_view(:latest_triggered_webhook_creation_dates, latest_triggered_webhook_creation_dates_v2)
6
+ create_or_replace_view(:latest_triggered_webhook_ids, latest_triggered_webhook_ids_v2)
7
+ create_or_replace_view(:latest_triggered_webhooks, latest_triggered_webhooks_v2)
42
8
  end
43
9
 
44
10
  down do
@@ -0,0 +1,15 @@
1
+ require_relative '../ddl_statements/latest_triggered_webhooks'
2
+ require_relative 'migration_helper'
3
+
4
+ Sequel.migration do
5
+ up do
6
+ # TODO
7
+ # drop_view(:latest_triggered_webhook_ids)
8
+ # drop_view(:latest_triggered_webhook_creation_dates)
9
+ create_or_replace_view(:latest_triggered_webhooks, latest_triggered_webhooks_v3)
10
+ end
11
+
12
+ down do
13
+ create_or_replace_view(:latest_triggered_webhooks, latest_triggered_webhooks_v3_rollback(PactBroker::MigrationHelper.postgres?))
14
+ end
15
+ end
@@ -4,7 +4,7 @@ module PactBroker
4
4
  extend self
5
5
 
6
6
  def large_text_type
7
- if adapter == 'postgres'
7
+ if postgres?
8
8
  :text
9
9
  else
10
10
  # Assume mysql
@@ -13,11 +13,19 @@ module PactBroker
13
13
  end
14
14
 
15
15
  def with_mysql
16
- if adapter =~ /mysql/
16
+ if mysql?
17
17
  yield
18
18
  end
19
19
  end
20
20
 
21
+ def mysql?
22
+ adapter =~ /mysql/
23
+ end
24
+
25
+ def postgres?
26
+ adapter == 'postgres'
27
+ end
28
+
21
29
  def adapter
22
30
  Sequel::Model.db.adapter_scheme.to_s
23
31
  end
@@ -2,14 +2,14 @@ module PactBroker
2
2
  module Api
3
3
  module Decorators
4
4
  class DecoratorContext < Hash
5
-
6
- attr_reader :base_url, :resource_url, :resource_title, :env
5
+ attr_reader :base_url, :resource_url, :resource_title, :env, :query_string
7
6
 
8
7
  def initialize base_url, resource_url, env, options = {}
9
8
  @base_url = self[:base_url] = base_url
10
9
  @resource_url = self[:resource_url] = resource_url
11
10
  @resource_title = self[:resource_title] = options[:resource_title]
12
11
  @env = self[:env] = env
12
+ @query_string = self[:query_string] = (env['QUERY_STRING'] && !env['QUERY_STRING'].empty? ? env['QUERY_STRING'] : nil)
13
13
  merge!(options)
14
14
  end
15
15
 
@@ -0,0 +1,34 @@
1
+ require 'roar/decorator'
2
+ require 'roar/json/hal'
3
+
4
+ module PactBroker
5
+ module Api
6
+ module Decorators
7
+ module PaginationLinks
8
+ include Roar::JSON::HAL
9
+ include Roar::JSON::HAL::Links
10
+
11
+ link :next do | context |
12
+ if represented.respond_to?(:current_page) &&
13
+ represented.respond_to?(:page_count) &&
14
+ represented.current_page < represented.page_count
15
+ {
16
+ href: context[:resource_url] + "?pageSize=#{represented.page_size}&pageNumber=#{represented.current_page + 1}",
17
+ title: "Next page"
18
+ }
19
+
20
+ end
21
+ end
22
+
23
+ link :previous do | context |
24
+ if represented.respond_to?(:first_page?) && !represented.first_page?
25
+ {
26
+ href: context[:resource_url] + "?pageSize=#{represented.page_size}&pageNumber=#{represented.current_page - 1}",
27
+ title: "Previous page"
28
+ }
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,5 +1,6 @@
1
1
  require_relative 'base_decorator'
2
2
  require_relative 'version_decorator'
3
+ require_relative 'pagination_links'
3
4
 
4
5
  module PactBroker
5
6
  module Api
@@ -9,12 +10,15 @@ module PactBroker
9
10
  collection :entries, as: :versions, embedded: true, :extend => PactBroker::Api::Decorators::VersionDecorator
10
11
 
11
12
  link :self do | context |
13
+ href = append_query_if_present(context[:resource_url], context[:query_string])
12
14
  {
13
- href: context[:resource_url],
15
+ href: href,
14
16
  title: "All application versions of #{context[:pacticipant_name]}"
15
17
  }
16
18
  end
17
19
 
20
+ include PaginationLinks
21
+
18
22
  link :'pb:pacticipant' do | context |
19
23
  {
20
24
  href: pacticipant_url(context[:base_url], OpenStruct.new(name: context[:pacticipant_name])),
@@ -307,6 +307,14 @@ module PactBroker
307
307
  ERB::Util.url_encode param
308
308
  end
309
309
 
310
+ def append_query_if_present(url, query)
311
+ if query && query.size > 0
312
+ url + "?#{query}"
313
+ else
314
+ url
315
+ end
316
+ end
317
+
310
318
  private
311
319
 
312
320
  def representable_pact pact
@@ -144,7 +144,7 @@ module PactBroker
144
144
  }]
145
145
  }
146
146
 
147
- if PactBroker.feature_enabled?(:disable_pacts_for_verification)
147
+ if PactBroker.feature_enabled?('disable_pacts_for_verification', true)
148
148
  links_hash.delete('pb:provider-pacts-for-verification')
149
149
  links_hash.delete('beta:provider-pacts-for-verification')
150
150
  end
@@ -52,6 +52,7 @@ module PactBroker
52
52
  end
53
53
 
54
54
  def to_json
55
+ log_request
55
56
  PactBroker::Api::Decorators::VerifiablePactsDecorator.new(pacts).to_json(
56
57
  decorator_options(
57
58
  include_pending_status: parsed_query_params.include_pending_status,
@@ -76,12 +77,21 @@ module PactBroker
76
77
  def query
77
78
  @query ||= begin
78
79
  if request.get?
79
- Rack::Utils.parse_nested_query(request.uri.query)
80
+ nested_query
80
81
  elsif request.post?
81
82
  params(symbolize_names: false, default: {})
82
83
  end
83
84
  end
84
85
  end
86
+
87
+ def log_request
88
+ parameters = request.get? ? nested_query : params
89
+ logger.info "Fetching pacts for verification by #{provider_name}", provider_name: provider_name, params: parameters
90
+ end
91
+
92
+ def nested_query
93
+ @nested_query ||= Rack::Utils.parse_nested_query(request.uri.query)
94
+ end
85
95
  end
86
96
  end
87
97
  end
@@ -23,12 +23,23 @@ module PactBroker
23
23
  end
24
24
 
25
25
  def versions
26
- @versions ||= pacticipant_service.find_all_pacticipant_versions_in_reverse_order pacticipant_name
26
+ @versions ||= pacticipant_service.find_all_pacticipant_versions_in_reverse_order(pacticipant_name, pagination_options)
27
27
  end
28
28
 
29
29
  def policy_name
30
30
  :'versions::versions'
31
31
  end
32
+
33
+ def pagination_options
34
+ if request.query['pageNumber'] || request.query['pageSize']
35
+ {
36
+ page_number: request.query['pageNumber']&.to_i || 1,
37
+ page_size: request.query['pageSize']&.to_i || 100
38
+ }
39
+ else
40
+ nil
41
+ end
42
+ end
32
43
  end
33
44
  end
34
45
  end
@@ -1,9 +1,20 @@
1
1
  require 'sequel'
2
2
  require 'pact_broker/project_root'
3
+ require 'pact_broker/pacts/latest_tagged_pact_publications'
3
4
 
4
5
  module PactBroker
5
6
  module DB
6
7
  class Clean
8
+
9
+ class Unionable < Array
10
+ alias_method :union, :+
11
+
12
+ def union(other)
13
+ Unionable.new(self + other)
14
+ end
15
+ end
16
+
17
+
7
18
  def self.call database_connection, options = {}
8
19
  new(database_connection, options).call
9
20
  end
@@ -13,55 +24,87 @@ module PactBroker
13
24
  @options = options
14
25
  end
15
26
 
16
- def call
17
- deleted_counts = {}
18
- kept_counts = {}
19
- date = options[:date]
27
+ def keep
28
+ options[:keep] || [PactBroker::Matrix::UnresolvedSelector.new(tag: true, latest: true)]
29
+ end
20
30
 
21
- version_ids_to_keep = nil
31
+ def resolve_ids(query)
32
+ # query
33
+ Unionable.new(query.collect { |h| h[:id] })
34
+ end
22
35
 
23
- if options[:keep]
24
- version_ids_to_keep = options[:keep].collect do | selector |
25
- PactBroker::Domain::Version.select(:id).for_selector(selector)
26
- end.reduce(&:union)
27
- end
36
+ def pact_publication_ids_to_keep
37
+ @pact_publication_ids_to_keep ||= pact_publication_ids_to_keep_for_version_ids_to_keep
38
+ .union(pact_publications_to_keep_for_verification_ids_to_keep)
39
+ .union(latest_tagged_pact_publications_ids_to_keep)
40
+ end
28
41
 
29
- pact_publication_ids_to_delete = if date
30
- db[:pact_publications].select(:id).where(Sequel.lit('created_at < ?', date))
31
- elsif version_ids_to_keep
32
- db[:pact_publications].select(:id).where(consumer_version_id: version_ids_to_keep).invert
33
- else
34
- keep = db[:latest_tagged_pact_publications].select(:id).union(db[:latest_pact_publications].select(:id))
35
- db[:pact_publications].select(:id).where(id: keep).invert
36
- end
42
+ def pact_publication_ids_to_keep_for_version_ids_to_keep
43
+ @pact_publication_ids_to_keep_for_version_ids_to_keep ||= resolve_ids(db[:pact_publications].select(:id).where(consumer_version_id: version_ids_to_keep))
44
+ end
45
+
46
+ def pact_publications_to_keep_for_verification_ids_to_keep
47
+ @pact_publications_to_keep_for_verification_ids_to_keep ||= resolve_ids(db[:pact_publications].select(:id).where(pact_version_id: db[:verifications].select(:pact_version_id).where(id: verification_ids_to_keep_for_version_ids_to_keep)))
48
+ end
49
+
50
+ def latest_tagged_pact_publications_ids_to_keep
51
+ @latest_tagged_pact_publications_ids_to_keep ||= resolve_ids(keep.select(&:tag).select(&:latest).collect do | selector |
52
+ PactBroker::Pacts::LatestTaggedPactPublications.select(:id).for_selector(selector)
53
+ end.reduce(&:union))
54
+ end
55
+
56
+ def pact_publication_ids_to_delete
57
+ @pact_publication_ids_to_delete ||= resolve_ids(db[:pact_publications].select(:id).where(id: pact_publication_ids_to_keep).invert)
58
+ end
37
59
 
60
+ # because they belong to the versions to keep
61
+ def verification_ids_to_keep_for_version_ids_to_keep
62
+ @verification_ids_to_keep_for_version_ids_to_keep ||= resolve_ids(db[:verifications].select(:id).where(provider_version_id: version_ids_to_keep))
63
+ end
64
+
65
+ def verification_ids_to_keep_for_pact_publication_ids_to_keep
66
+ @verification_ids_to_keep_for_pact_publication_ids_to_keep ||= resolve_ids(db[:verifications].select(:id).where(pact_version_id: db[:pact_publications].select(:pact_version_id).where(id: pact_publication_ids_to_keep_for_version_ids_to_keep)))
67
+ end
68
+
69
+ def verification_ids_to_keep
70
+ @verification_ids_to_keep ||= verification_ids_to_keep_for_version_ids_to_keep.union(verification_ids_to_keep_for_pact_publication_ids_to_keep)
71
+ end
72
+
73
+ def verification_ids_to_delete
74
+ @verification_ids_to_delete ||= db[:verifications].select(:id).where(id: verification_ids_to_keep).invert
75
+ end
76
+
77
+ def version_ids_to_keep
78
+ @version_ids_to_keep ||= keep.collect do | selector |
79
+ PactBroker::Domain::Version.select(:id).for_selector(selector)
80
+ end.reduce(&:union)
81
+ end
82
+
83
+ def call
84
+ deleted_counts = {}
85
+ kept_counts = {}
38
86
 
39
87
  deleted_counts[:pact_publications] = pact_publication_ids_to_delete.count
40
- kept_counts[:pact_publications] = db[:pact_publications].where(id: pact_publication_ids_to_delete).invert.count
88
+ kept_counts[:pact_publications] = pact_publication_ids_to_keep.count
41
89
 
42
- # TODO head matrix is the head for the consumer tags, not the provider tags.
43
90
  # Work out how to keep the head verifications for the provider tags.
44
- verification_ids = get_verification_ids(pact_publication_ids_to_delete)
45
- deleted_counts[:verification_results] = verification_ids.count
46
- kept_counts[:verification_results] = db[:verifications].where(id:verification_ids ).invert.count
47
91
 
48
- delete_webhook_data(db[:triggered_webhooks].where(verification_id: verification_ids).select(:id))
49
- verification_ids.delete
92
+ deleted_counts[:verification_results] = verification_ids_to_delete.count
93
+ kept_counts[:verification_results] = verification_ids_to_keep.count
50
94
 
51
- delete_webhook_data(db[:triggered_webhooks].where(pact_publication_id: pact_publication_ids_to_delete).select(:id))
52
- delete_pact_publications(pact_publication_ids_to_delete)
95
+ delete_webhook_data(verification_triggered_webhook_ids_to_delete)
96
+ delete_verifications
97
+
98
+ delete_webhook_data(pact_publication_triggered_webhook_ids_to_delete)
99
+ delete_pact_publications
53
100
 
54
101
  delete_orphan_pact_versions
55
102
  overwritten_delete_counts = delete_overwritten_verifications
56
103
  deleted_counts[:verification_results] = deleted_counts[:verification_results] + overwritten_delete_counts[:verification_results]
57
104
  kept_counts[:verification_results] = kept_counts[:verification_results] - overwritten_delete_counts[:verification_results]
58
105
 
59
-
60
- referenced_version_ids = db[:pact_publications].select(:consumer_version_id).collect{ | h| h[:consumer_version_id] } +
61
- db[:verifications].select(:provider_version_id).collect{ | h| h[:provider_version_id] }
62
-
63
- delete_orphan_tags(referenced_version_ids)
64
- delete_orphan_versions(referenced_version_ids)
106
+ delete_orphan_tags
107
+ delete_orphan_versions
65
108
 
66
109
  { kept: kept_counts, deleted: deleted_counts }
67
110
  end
@@ -70,8 +113,21 @@ module PactBroker
70
113
 
71
114
  attr_reader :db, :options
72
115
 
73
- def get_verification_ids(pact_publication_ids)
74
- db[:verifications].select(:id).where(pact_version_id: db[:pact_publications].select(:pact_version_id).where(id: pact_publication_ids))
116
+ def verification_triggered_webhook_ids_to_delete
117
+ db[:triggered_webhooks].select(:id).where(verification_id: verification_ids_to_delete)
118
+ end
119
+
120
+ def pact_publication_triggered_webhook_ids_to_delete
121
+ db[:triggered_webhooks].select(:id).where(pact_publication_id: pact_publication_ids_to_delete)
122
+ end
123
+
124
+ def referenced_version_ids
125
+ db[:pact_publications].select(:consumer_version_id).union(db[:verifications].select(:provider_version_id))
126
+ end
127
+
128
+ def verification_ids_for_pact_publication_ids_to_delete
129
+ @verification_ids_for_pact_publication_ids_to_delete ||=
130
+ db[:verifications].select(:id).where(pact_version_id: db[:pact_publications].select(:pact_version_id).where(id: pact_publication_ids_to_delete))
75
131
  end
76
132
 
77
133
  def delete_webhook_data(triggered_webhook_ids)
@@ -79,23 +135,24 @@ module PactBroker
79
135
  db[:triggered_webhooks].where(id: triggered_webhook_ids).delete
80
136
  end
81
137
 
82
- def delete_pact_publications(pact_publication_ids)
83
- db[:pact_publications].where(id: pact_publication_ids).delete
84
- db[:pact_versions].where(id: db[:pact_publications].select(:pact_version_id)).invert.delete
138
+ def delete_pact_publications
139
+ db[:pact_publications].where(id: pact_publication_ids_to_delete).delete
140
+ end
141
+
142
+ def delete_verifications
143
+ db[:verifications].where(id: verification_ids_to_delete).delete
85
144
  end
86
145
 
87
146
  def delete_orphan_pact_versions
88
- # TODO use union
89
- referenced_pact_version_ids = db[:pact_publications].select(:pact_version_id).collect{ | h| h[:pact_version_id] } +
90
- db[:verifications].select(:pact_version_id).collect{ | h| h[:pact_version_id] }
147
+ referenced_pact_version_ids = db[:pact_publications].select(:pact_version_id).union(db[:verifications].select(:pact_version_id))
91
148
  db[:pact_versions].where(id: referenced_pact_version_ids).invert.delete
92
149
  end
93
150
 
94
- def delete_orphan_tags(referenced_version_ids)
151
+ def delete_orphan_tags
95
152
  db[:tags].where(version_id: referenced_version_ids).invert.delete
96
153
  end
97
154
 
98
- def delete_orphan_versions(referenced_version_ids)
155
+ def delete_orphan_versions
99
156
  db[:versions].where(id: referenced_version_ids).invert.delete
100
157
  end
101
158