/
repository.rb
131 lines (114 loc) · 5.64 KB
/
repository.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
require 'sequel'
require 'pact_broker/domain/verification'
require 'pact_broker/verifications/latest_verifications_by_consumer_version'
require 'pact_broker/verifications/all_verifications'
require 'pact_broker/verifications/sequence'
module PactBroker
module Verifications
class Repository
include PactBroker::Repositories::Helpers
include PactBroker::Repositories
# Ideally this would just be a sequence, but Sqlite and MySQL don't support sequences
# in the way we need to use them ie. determining what the next number will be before we
# create the record, because Webmachine wants to set the URL of the resource that is about
# to be created *before* we actually create it.
def next_number
Sequence.next_val
end
def create verification, provider_version_number, pact
provider = pacticipant_repository.find_by_name(pact.provider_name)
consumer = pacticipant_repository.find_by_name(pact.consumer_name)
version = version_repository.find_by_pacticipant_id_and_number_or_create(provider.id, provider_version_number)
verification.pact_version_id = pact_version_id_for(pact)
verification.provider_version = version
verification.provider_id = provider.id
verification.consumer_id = consumer.id
verification.save
update_latest_verification_id(verification)
verification
end
def update_latest_verification_id verification
key = {
pact_version_id: verification.pact_version_id, provider_version_id: verification.provider_version_id
}
other = {
provider_id: verification.provider_version.pacticipant_id,
verification_id: verification.id,
consumer_id: verification.consumer_id
}
table = PactBroker::Domain::Verification.db[:latest_verif_id_for_pact_version_and_provider_version]
PactBroker::Repositories::Helpers.upsert(table, key, other)
end
def find consumer_name, provider_name, pact_version_sha, verification_number
PactBroker::Domain::Verification
.select_all_qualified
.join(:all_pact_publications, pact_version_id: :pact_version_id)
.consumer(consumer_name)
.provider(provider_name)
.pact_version_sha(pact_version_sha)
.verification_number(verification_number).single_record
end
def search_for_latest consumer_name, provider_name
query = LatestVerificationsByConsumerVersion
.select_all_qualified
.join(:all_pact_publications, pact_version_id: :pact_version_id)
query = query.consumer(consumer_name) if consumer_name
query = query.provider(provider_name) if provider_name
query.reverse(:execution_date, :id).first
end
def find_latest_verifications_for_consumer_version consumer_name, consumer_version_number
# Use LatestPactPublicationsByConsumerVersion not AllPactPublcations because we don't
# want verifications for shadowed revisions as it would be misleading.
LatestVerificationsByConsumerVersion
.select_all_qualified
.join(:latest_pact_publications_by_consumer_versions, pact_version_id: :pact_version_id)
.consumer(consumer_name)
.consumer_version_number(consumer_version_number)
.order(:provider_name)
.all
end
# The most recent verification for the latest revision of the pact
# belonging to the version with the largest consumer_version_order.
def find_latest_verification_for consumer_name, provider_name, consumer_version_tag = nil
query = LatestVerificationsByConsumerVersion
.select_all_qualified
.join(:all_pact_publications, pact_version_id: :pact_version_id)
.consumer(consumer_name)
.provider(provider_name)
if consumer_version_tag == :untagged
query = query.untagged
elsif consumer_version_tag
query = query.tag(consumer_version_tag)
end
query.reverse_order(
Sequel[:all_pact_publications][:consumer_version_order],
Sequel[:all_pact_publications][:revision_number],
Sequel[LatestVerificationsByConsumerVersion.table_name][:number]
).limit(1).single_record
end
def find_latest_verification_for_tags consumer_name, provider_name, consumer_version_tag, provider_version_tag
view_name = PactBroker::Verifications::AllVerifications.table_name
query = PactBroker::Verifications::AllVerifications
.select_all_qualified
.join(:versions, {Sequel[:provider_versions][:id] => Sequel[view_name][:provider_version_id]}, {table_alias: :provider_versions})
.join(:latest_pact_publications_by_consumer_versions, { Sequel[view_name][:pact_version_id] => Sequel[:latest_pact_publications_by_consumer_versions][:pact_version_id] })
.consumer(consumer_name)
.provider(provider_name)
.tag(consumer_version_tag)
.provider_version_tag(provider_version_tag)
query.reverse_order(
Sequel[:latest_pact_publications_by_consumer_versions][:consumer_version_order],
Sequel[:latest_pact_publications_by_consumer_versions][:revision_number],
Sequel[:provider_versions][:order],
Sequel[view_name][:execution_date]
).limit(1).single_record
end
def delete_by_provider_version_id version_id
PactBroker::Domain::Verification.where(provider_version_id: version_id).delete
end
def pact_version_id_for pact
PactBroker::Pacts::PactPublication.select(:pact_version_id).where(id: pact.id)
end
end
end
end