Skip to content

Commit 718f021

Browse files
committed
feat: add delete integration which deletes all objects pertaining to an integration that are not referenced by other objects
1 parent b5d15d5 commit 718f021

25 files changed

+361
-25
lines changed

lib/pact_broker/api/resources/integrations.rb

+6-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def content_types_provided
1010
end
1111

1212
def allowed_methods
13-
["GET", "OPTIONS"]
13+
["GET", "OPTIONS", "DELETE"]
1414
end
1515

1616
def to_dot
@@ -20,6 +20,11 @@ def to_dot
2020
def integrations
2121
pact_service.find_latest_pacts
2222
end
23+
24+
def delete_resource
25+
integration_service.delete(consumer_name, provider_name)
26+
true
27+
end
2328
end
2429
end
2530
end

lib/pact_broker/api/resources/pact_versions.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def pacts
3030
end
3131

3232
def delete_resource
33-
pact_service.delete_all_pact_versions_between(consumer_name, and: provider_name)
33+
pact_service.delete_all_pact_publications_between(consumer_name, and: provider_name)
3434
true
3535
end
3636
end

lib/pact_broker/api/resources/tagged_pact_versions.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def to_json
2525
end
2626

2727
def delete_resource
28-
pact_service.delete_all_pact_versions_between consumer_name, and: provider_name, tag: identifier_from_path[:tag]
28+
pact_service.delete_all_pact_publications_between consumer_name, and: provider_name, tag: identifier_from_path[:tag]
2929
true
3030
end
3131

lib/pact_broker/domain/pacticipant.rb

+5
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ def label label_name
2626
end
2727
end
2828

29+
def before_destroy
30+
PactBroker::Domain::Label.where(pacticipant: self).destroy
31+
super
32+
end
33+
2934
def latest_version
3035
versions.last
3136
end

lib/pact_broker/domain/verification.rb

+2-12
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ class Verification < Sequel::Model
1010
set_primary_key :id
1111
associate(:many_to_one, :pact_version, class: "PactBroker::Pacts::PactVersion", key: :pact_version_id, primary_key: :id)
1212
associate(:many_to_one, :provider_version, class: "PactBroker::Domain::Version", key: :provider_version_id, primary_key: :id)
13+
associate(:many_to_one, :provider, class: "PactBroker::Domain::Pacticipant", key: :provider_id, primary_key: :id)
14+
associate(:many_to_one, :consumer, class: "PactBroker::Domain::Pacticipant", key: :consumer_id, primary_key: :id)
1315
plugin :serialization, :json, :test_results
1416

1517
def before_create
@@ -74,18 +76,6 @@ def provider_name
7476
provider.name
7577
end
7678

77-
def consumer
78-
Pacticipant.find(id: PactBroker::Pacts::AllPactPublications
79-
.where(pact_version_id: pact_version_id)
80-
.limit(1).select(:consumer_id))
81-
end
82-
83-
def provider
84-
Pacticipant.find(id: PactBroker::Pacts::AllPactPublications
85-
.where(pact_version_id: pact_version_id)
86-
.limit(1).select(:provider_id))
87-
end
88-
8979
def provider_version_number
9080
provider_version.number
9181
end

lib/pact_broker/domain/version.rb

+5-3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,8 @@
33
require 'pact_broker/repositories/helpers'
44

55
module PactBroker
6-
76
module Domain
8-
97
class Version < Sequel::Model
10-
118
set_primary_key :id
129
one_to_many :pact_publications, order: :revision_number, class: "PactBroker::Pacts::PactPublication", key: :consumer_version_id
1310
associate(:many_to_one, :pacticipant, :class => "PactBroker::Domain::Pacticipant", :key => :pacticipant_id, :primary_key => :id)
@@ -21,6 +18,11 @@ def after_create
2118
OrderVersions.(self)
2219
end
2320

21+
def before_destroy
22+
PactBroker::Domain::Tag.where(version: self).destroy
23+
super
24+
end
25+
2426
def to_s
2527
"Version: number=#{number}, pacticipant=#{pacticipant_id}"
2628
end
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require 'pact_broker/services'
2+
require 'pact_broker/repositories'
3+
require 'pact_broker/logging'
4+
5+
module PactBroker
6+
module Integrations
7+
class Service
8+
extend PactBroker::Repositories
9+
extend PactBroker::Services
10+
include PactBroker::Logging
11+
12+
def self.delete(consumer_name, provider_name)
13+
consumer = pacticipant_service.find_pacticipant_by_name(consumer_name)
14+
provider = pacticipant_service.find_pacticipant_by_name(provider_name)
15+
# this takes care of the triggered webhooks and webhook executions
16+
pact_service.delete_all_pact_publications_between(consumer_name, and: provider_name)
17+
verification_service.delete_all_verifications_between(consumer_name, and: provider_name)
18+
pact_service.delete_all_pact_versions_between(consumer_name, and: provider_name)
19+
webhook_repository.delete_by_consumer_and_provider(consumer, provider)
20+
version_repository.delete_orphan_versions(consumer, provider)
21+
22+
pacticipant_service.delete_if_orphan(consumer)
23+
pacticipant_service.delete_if_orphan(provider)
24+
end
25+
end
26+
end
27+
end

lib/pact_broker/pacticipants/repository.rb

+9
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ def create args
5454
def pacticipant_names
5555
PactBroker::Domain::Pacticipant.select(:name).order(:name).collect{ | pacticipant| pacticipant.name }
5656
end
57+
58+
def delete_if_orphan(pacticipant)
59+
if PactBroker::Domain::Version.where(pacticipant: pacticipant).empty? &&
60+
PactBroker::Pacts::PactPublication.where(provider: pacticipant).or(consumer: pacticipant).empty? &&
61+
PactBroker::Pacts::PactVersion.where(provider: pacticipant).or(consumer: pacticipant).empty? &&
62+
PactBroker::Webhooks::Webhook.where(provider: pacticipant).or(consumer: pacticipant).empty?
63+
pacticipant.destroy
64+
end
65+
end
5766
end
5867
end
5968
end

lib/pact_broker/pacticipants/service.rb

+4
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ def self.delete name
9090
connection.run("delete from pacticipants where id = #{pacticipant.id}")
9191
end
9292

93+
def self.delete_if_orphan(pacticipant)
94+
pacticipant_repository.delete_if_orphan(pacticipant)
95+
end
96+
9397
def self.pacticipant_names
9498
pacticipant_repository.pacticipant_names
9599
end

lib/pact_broker/pacts/pact_publication.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ class PactPublication < Sequel::Model(:pact_publications)
88

99
extend Forwardable
1010

11-
delegate [:consumer, :consumer_version_number, :name, :provider_name, :consumer_name] => :cached_domain_for_delegation
11+
delegate [:consumer_version_number, :name, :provider_name, :consumer_name] => :cached_domain_for_delegation
1212

1313
set_primary_key :id
1414
associate(:many_to_one, :provider, :class => "PactBroker::Domain::Pacticipant", :key => :provider_id, :primary_key => :id)
15+
associate(:many_to_one, :consumer, :class => "PactBroker::Domain::Pacticipant", :key => :consumer_id, :primary_key => :id)
1516
associate(:many_to_one, :consumer_version, :class => "PactBroker::Domain::Version", :key => :consumer_version_id, :primary_key => :id)
1617
associate(:many_to_one, :pact_version, class: "PactBroker::Pacts::PactVersion", :key => :pact_version_id, :primary_key => :id)
1718

lib/pact_broker/pacts/pact_version.rb

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ module Pacts
55
class PactVersion < Sequel::Model(:pact_versions)
66
one_to_many :pact_publications, reciprocal: :pact_version
77
one_to_many :verifications, reciprocal: :verification, order: :id, :class => "PactBroker::Domain::Verification"
8+
associate(:many_to_one, :provider, class: "PactBroker::Domain::Pacticipant", key: :provider_id, primary_key: :id)
9+
associate(:many_to_one, :consumer, class: "PactBroker::Domain::Pacticipant", key: :consumer_id, primary_key: :id)
810

911
def name
1012
"Pact between #{consumer_name} and #{provider_name}"

lib/pact_broker/pacts/repository.rb

+7-1
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,18 @@ def find_all_pact_versions_between consumer_name, options
9191
.collect(&:to_domain)
9292
end
9393

94-
def delete_all_pact_versions_between consumer_name, options
94+
def delete_all_pact_publications_between consumer_name, options
9595
ids = find_all_database_versions_between(consumer_name, options).select_for_subquery(:id)
9696
webhook_repository.delete_triggered_webhooks_by_pact_publication_ids(ids)
9797
PactPublication.where(id: ids).delete
9898
end
9999

100+
def delete_all_pact_versions_between consumer_name, options
101+
consumer = pacticipant_repository.find_by_name(consumer_name)
102+
provider = pacticipant_repository.find_by_name(options.fetch(:and))
103+
PactVersion.where(consumer: consumer, provider: provider).destroy
104+
end
105+
100106
def find_latest_pact_versions_for_provider provider_name, tag = nil
101107
if tag
102108
LatestTaggedPactPublications.provider(provider_name).order_ignore_case(:consumer_name).where(tag_name: tag).collect(&:to_domain)

lib/pact_broker/pacts/service.rb

+4
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ def find_all_pact_versions_between consumer, options
6868
pact_repository.find_all_pact_versions_between consumer, options
6969
end
7070

71+
def delete_all_pact_publications_between consumer, options
72+
pact_repository.delete_all_pact_publications_between consumer, options
73+
end
74+
7175
def delete_all_pact_versions_between consumer, options
7276
pact_repository.delete_all_pact_versions_between consumer, options
7377
end

lib/pact_broker/services.rb

+5
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,10 @@ def certificate_service
6161
require 'pact_broker/certificates/service'
6262
Certificates::Service
6363
end
64+
65+
def integration_service
66+
require 'pact_broker/integrations/service'
67+
Integrations::Service
68+
end
6469
end
6570
end

lib/pact_broker/verifications/all_verifications.rb

+15
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,21 @@ class AllVerifications < PactBroker::Domain::Verification
88
set_dataset(:all_verifications)
99
end
1010

11+
# this view doesn't have a consumer_id
12+
# TODO add it
13+
def consumer
14+
PactBroker::Domain::Pacticipant.find(id: PactBroker::Pacts::AllPactPublications
15+
.where(pact_version_id: pact_version_id)
16+
.limit(1).select(:consumer_id))
17+
end
18+
19+
# this view doesn't have a provider_id
20+
# TODO add it
21+
def provider
22+
PactBroker::Domain::Pacticipant.find(id: PactBroker::Pacts::AllPactPublications
23+
.where(pact_version_id: pact_version_id)
24+
.limit(1).select(:provider_id))
25+
end
1126
end
1227
end
1328

lib/pact_broker/verifications/latest_verification_for_pact_version.rb

+16
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,22 @@ module PactBroker
44
module Verifications
55
class LatestVerificationForPactVersion < PactBroker::Domain::Verification
66
set_dataset(:latest_verifications_for_pact_versions)
7+
8+
# this view doesn't have a consumer_id
9+
# TODO add it
10+
def consumer
11+
PactBroker::Domain::Pacticipant.find(id: PactBroker::Pacts::AllPactPublications
12+
.where(pact_version_id: pact_version_id)
13+
.limit(1).select(:consumer_id))
14+
end
15+
16+
# this view doesn't have a provider_id
17+
# TODO add it
18+
def provider
19+
PactBroker::Domain::Pacticipant.find(id: PactBroker::Pacts::AllPactPublications
20+
.where(pact_version_id: pact_version_id)
21+
.limit(1).select(:provider_id))
22+
end
723
end
824
end
925
end

lib/pact_broker/verifications/repository.rb

+6
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,12 @@ def delete_by_provider_version_id version_id
120120
PactBroker::Domain::Verification.where(provider_version_id: version_id).delete
121121
end
122122

123+
def delete_all_verifications_between(consumer_name, options)
124+
consumer = pacticipant_repository.find_by_name(consumer_name)
125+
provider = pacticipant_repository.find_by_name(options.fetch(:and))
126+
PactBroker::Domain::Verification.where(provider: provider, consumer: consumer).destroy
127+
end
128+
123129
def pact_version_id_for pact
124130
PactBroker::Pacts::PactPublication.select(:pact_version_id).where(id: pact.id)
125131
end

lib/pact_broker/verifications/service.rb

+4
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ def verification_summary_for_consumer_version params
6464
pacts = pact_service.find_by_consumer_version(params)
6565
SummaryForConsumerVersion.new(verifications, pacts)
6666
end
67+
68+
def delete_all_verifications_between(consumer_name, options)
69+
verification_repository.delete_all_verifications_between(consumer_name, options)
70+
end
6771
end
6872
end
6973
end

lib/pact_broker/versions/repository.rb

+12
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,18 @@ def find_by_pacticipant_id_and_number_or_create pacticipant_id, number
7979
def delete_by_id version_ids
8080
Domain::Version.where(id: version_ids).delete
8181
end
82+
83+
def delete_orphan_versions consumer, provider
84+
version_ids_with_pact_publications = PactBroker::Pacts::PactPublication.where(consumer_id: [consumer.id, provider.id]).select(:consumer_version_id).collect{|r| r[:consumer_version_id]}
85+
version_ids_with_verifications = PactBroker::Domain::Verification.where(provider_id: [provider.id, consumer.id]).select(:provider_version_id).collect{|r| r[:provider_version_id]}
86+
# Hope we don't hit max parameter constraints here...
87+
version_ids_to_keep = (version_ids_with_pact_publications + version_ids_with_verifications).uniq
88+
89+
PactBroker::Domain::Version
90+
.where(pacticipant_id: [consumer.id, provider.id])
91+
.exclude(id: (version_ids_with_pact_publications + version_ids_with_verifications).uniq)
92+
.destroy
93+
end
8294
end
8395
end
8496
end

lib/pact_broker/webhooks/repository.rb

+5
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ def find_by_consumer_and_provider consumer, provider
7878
Webhook.where(criteria).collect(&:to_domain)
7979
end
8080

81+
def delete_by_consumer_and_provider consumer, provider
82+
Webhook.where(consumer: consumer, provider: provider).destroy
83+
end
84+
8185
def find_for_pact_and_event_name pact, event_name
8286
find_by_consumer_and_or_provider_and_event_name(pact.consumer, pact.provider, event_name)
8387
end
@@ -102,6 +106,7 @@ def find_by_consumer_and_provider_and_event_name consumer, provider, event_name
102106
.collect(&:to_domain)
103107
end
104108

109+
# TODO delete
105110
def find_by_consumer_and_provider_existing_at consumer, provider, date_time
106111
Webhook.where(consumer_id: consumer.id, provider_id: provider.id)
107112
.where(Sequel.lit("created_at < ?", date_time))

lib/pact_broker/webhooks/triggered_webhook.rb

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
require 'pact_broker/repositories/helpers'
33
require 'pact_broker/webhooks/execution'
44

5+
# Represents the relationship between a webhook and the event and object
6+
# that caused it to be triggered. eg a pact publication
7+
58
module PactBroker
69
module Webhooks
710
class TriggeredWebhook < Sequel::Model(:triggered_webhooks)

lib/pact_broker/webhooks/webhook.rb

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class Webhook < Sequel::Model
1919

2020
def before_destroy
2121
WebhookHeader.where(webhook_id: id).destroy
22+
super
2223
end
2324

2425
def update_from_domain webhook

spec/lib/pact_broker/api/resources/tagged_pact_versions_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,13 @@ module Resources
6868

6969
context "DELETE" do
7070
before do
71-
allow(pact_service).to receive(:delete_all_pact_versions_between)
71+
allow(pact_service).to receive(:delete_all_pact_publications_between)
7272
end
7373

7474
subject { delete(path) }
7575

7676
it "deletes all the pacts with the given consumer/provider/tag" do
77-
expect(pact_service).to receive(:delete_all_pact_versions_between).with("Foo", and: "Bar", tag: "prod")
77+
expect(pact_service).to receive(:delete_all_pact_publications_between).with("Foo", and: "Bar", tag: "prod")
7878
subject
7979
end
8080

0 commit comments

Comments
 (0)