pact_broker 2.84.0 → 2.85.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/db/migrations/20210913_add_pending_to_verifications.rb +7 -0
- data/lib/pact/doc/markdown/consumer_contract_renderer.rb +3 -3
- data/lib/pact_broker/api/decorators/reason_decorator.rb +2 -2
- data/lib/pact_broker/api/decorators/verification_summary_decorator.rb +1 -2
- data/lib/pact_broker/api/middleware/configuration.rb +33 -0
- data/lib/pact_broker/api/pact_broker_urls.rb +5 -1
- data/lib/pact_broker/api/renderers/html_pact_renderer.rb +15 -11
- data/lib/pact_broker/api/resources/pact_versions_for_branch.rb +40 -0
- data/lib/pact_broker/api/resources/verifications.rb +5 -1
- data/lib/pact_broker/api.rb +1 -0
- data/lib/pact_broker/app.rb +2 -0
- data/lib/pact_broker/badges/service.rb +3 -1
- data/lib/pact_broker/configuration.rb +33 -29
- data/lib/pact_broker/domain/verification.rb +9 -0
- data/lib/pact_broker/domain/webhook.rb +22 -10
- data/lib/pact_broker/domain/webhook_request.rb +2 -2
- data/lib/pact_broker/index/service.rb +73 -22
- data/lib/pact_broker/locale/en.yml +2 -0
- data/lib/pact_broker/pacts/metadata.rb +4 -2
- data/lib/pact_broker/pacts/pact_publication.rb +37 -0
- data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +39 -0
- data/lib/pact_broker/pacts/repository.rb +2 -1
- data/lib/pact_broker/test/http_test_data_builder.rb +1 -1
- data/lib/pact_broker/test/test_data_builder.rb +5 -1
- data/lib/pact_broker/ui/app.rb +7 -1
- data/lib/pact_broker/ui/controllers/dashboard.rb +80 -0
- data/lib/pact_broker/ui/controllers/groups.rb +23 -8
- data/lib/pact_broker/ui/helpers/url_helper.rb +5 -1
- data/lib/pact_broker/ui/view_models/index_item.rb +49 -7
- data/lib/pact_broker/ui/view_models/matrix_branch.rb +1 -1
- data/lib/pact_broker/ui/view_models/matrix_tag.rb +0 -1
- data/lib/pact_broker/ui/views/dashboard/show.haml +195 -0
- data/lib/pact_broker/ui/views/groups/show.html.erb +60 -14
- data/lib/pact_broker/ui/views/index/_dashboard_navbar.haml +7 -0
- data/lib/pact_broker/ui/views/index/_navbar.haml +0 -7
- data/lib/pact_broker/ui/views/index/show-with-tags.haml +3 -1
- data/lib/pact_broker/ui/views/index/show.haml +35 -13
- data/lib/pact_broker/ui/views/matrix/show.haml +7 -3
- data/lib/pact_broker/verifications/pseudo_branch_status.rb +2 -0
- data/lib/pact_broker/verifications/service.rb +1 -0
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/webhooks/event_listener.rb +3 -3
- data/lib/pact_broker/webhooks/execution_configuration.rb +16 -0
- data/lib/pact_broker/webhooks/execution_configuration_creator.rb +3 -0
- data/lib/pact_broker/webhooks/job.rb +1 -1
- data/lib/pact_broker/webhooks/trigger_service.rb +2 -2
- data/lib/pact_broker/webhooks/webhook_execution_result.rb +3 -7
- data/lib/pact_broker/webhooks/webhook_request_logger.rb +4 -12
- data/lib/pact_broker/webhooks/webhook_request_template.rb +6 -8
- data/pact_broker.gemspec +4 -0
- data/public/javascripts/index.js +75 -68
- data/public/javascripts/pact.js +14 -14
- data/public/stylesheets/index.css +1 -2
- data/public/stylesheets/pact.css +11 -0
- data/script/data/auto-create-things-for-tags.rb +2 -0
- data/script/data/branches.rb +2 -2
- data/script/data/contract-published-requiring-verification.rb +1 -1
- data/script/data/environments.rb +0 -0
- data/script/data/pending.rb +26 -0
- data/script/data/tags.rb +35 -0
- data/script/data/webhook.rb +22 -0
- data/script/seed.rb +50 -89
- data/spec/features/delete_pact_versions_for_branch_spec.rb +34 -0
- data/spec/fixtures/approvals/modifiable_resources.approved.json +4 -0
- data/spec/integration/app_spec.rb +6 -6
- data/spec/lib/pact/doc/markdown/consumer_contract_renderer_spec.rb +2 -2
- data/spec/lib/pact_broker/api/decorators/reason_decorator_spec.rb +2 -2
- data/spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb +2 -0
- data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +1 -1
- data/spec/lib/pact_broker/api/middleware/configuration_spec.rb +43 -0
- data/spec/lib/pact_broker/api/resources/verifications_spec.rb +2 -3
- data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +1 -1
- data/spec/lib/pact_broker/badges/service_spec.rb +22 -0
- data/spec/lib/pact_broker/domain/webhook_request_spec.rb +2 -1
- data/spec/lib/pact_broker/domain/webhook_spec.rb +15 -5
- data/spec/lib/pact_broker/index/service_spec.rb +1 -5
- data/spec/lib/pact_broker/index/service_view_spec.rb +144 -0
- data/spec/lib/pact_broker/pacts/metadata_spec.rb +11 -2
- data/spec/lib/pact_broker/pacts/pact_publication_latest_verification_spec.rb +29 -0
- data/spec/lib/pact_broker/pacts/repository_spec.rb +15 -2
- data/spec/lib/pact_broker/ui/view_models/index_item_spec.rb +11 -8
- data/spec/lib/pact_broker/verifications/pseudo_branch_status_spec.rb +9 -1
- data/spec/lib/pact_broker/verifications/service_spec.rb +4 -2
- data/spec/lib/pact_broker/webhooks/job_spec.rb +4 -4
- data/spec/lib/pact_broker/webhooks/trigger_service_spec.rb +9 -5
- data/spec/lib/pact_broker/webhooks/webhook_request_logger_spec.rb +6 -12
- data/spec/lib/pact_broker/webhooks/webhook_request_template_spec.rb +3 -2
- data/spec/support/generated_markdown.md +3 -3
- metadata +47 -4
- data/spec/lib/pact_broker/api/resources/webhook_execution_result_spec.rb +0 -56
@@ -18,7 +18,7 @@ module PactBroker
|
|
18
18
|
|
19
19
|
HEADERS_TO_REDACT = [/authorization/i, /token/i]
|
20
20
|
|
21
|
-
attr_accessor :method, :url, :headers, :body, :username, :password, :uuid
|
21
|
+
attr_accessor :method, :url, :headers, :body, :username, :password, :uuid, :user_agent
|
22
22
|
|
23
23
|
# Reform gets confused by the :method method, as :method is a standard
|
24
24
|
# Ruby method.
|
@@ -58,7 +58,7 @@ module PactBroker
|
|
58
58
|
@http_request ||= begin
|
59
59
|
req = Net::HTTP.const_get(method.capitalize).new(uri.request_uri)
|
60
60
|
req.delete("accept-encoding")
|
61
|
-
req["user-agent"] =
|
61
|
+
req["user-agent"] = user_agent
|
62
62
|
headers.each_pair { | name, value | req[name] = value }
|
63
63
|
req.basic_auth(username, password) if username && username.size > 0
|
64
64
|
req.body = body unless body.nil?
|
@@ -30,6 +30,32 @@ module PactBroker
|
|
30
30
|
find_index_items(page_number: 1, page_size: 100000000000)
|
31
31
|
end
|
32
32
|
|
33
|
+
def self.smart_default_view(consumer_name, provider_name)
|
34
|
+
consumer = pacticipant_repository.find_by_name(consumer_name)
|
35
|
+
provider = pacticipant_repository.find_by_name(provider_name)
|
36
|
+
if consumer && provider
|
37
|
+
pact_publications_with_branches = PactBroker::Pacts::PactPublication
|
38
|
+
.for_consumer_name(consumer_name)
|
39
|
+
.for_provider_name(provider_name)
|
40
|
+
.join_consumer_branch_versions
|
41
|
+
|
42
|
+
pact_publication_with_tags = PactBroker::Pacts::PactPublication
|
43
|
+
.for_consumer_name(consumer_name)
|
44
|
+
.for_provider_name(provider_name)
|
45
|
+
.join_consumer_version_tags
|
46
|
+
|
47
|
+
if pact_publications_with_branches.any?
|
48
|
+
"branch"
|
49
|
+
elsif pact_publication_with_tags.any?
|
50
|
+
"tag"
|
51
|
+
else
|
52
|
+
"all"
|
53
|
+
end
|
54
|
+
else
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
33
59
|
# rubocop: disable Metrics/CyclomaticComplexity
|
34
60
|
# rubocop: disable Metrics/MethodLength
|
35
61
|
def self.find_index_items options = {}
|
@@ -53,7 +79,7 @@ module PactBroker
|
|
53
79
|
index_items = pact_publications.all.collect do | pact_publication |
|
54
80
|
is_overall_latest_for_integration = latest_pp_ids.include?(pact_publication.id)
|
55
81
|
|
56
|
-
latest_verification = latest_verification_for_pseudo_branch(pact_publication, is_overall_latest_for_integration, latest_verifications_for_cv_tags, options[:tags])
|
82
|
+
latest_verification = latest_verification_for_pseudo_branch(pact_publication, is_overall_latest_for_integration, latest_verifications_for_cv_tags, options[:tags], options)
|
57
83
|
webhook = webhooks.find{ |wh| wh.is_for?(pact_publication.integration) }
|
58
84
|
|
59
85
|
PactBroker::Domain::IndexItem.create(
|
@@ -77,10 +103,13 @@ module PactBroker
|
|
77
103
|
# rubocop: enable Metrics/CyclomaticComplexity
|
78
104
|
|
79
105
|
# Worst. Code. Ever.
|
80
|
-
#
|
106
|
+
# This needs a big rethink.
|
107
|
+
# TODO environments view
|
81
108
|
# rubocop: disable Metrics/CyclomaticComplexity
|
82
|
-
def self.latest_verification_for_pseudo_branch(pact_publication, is_overall_latest, latest_verifications_for_cv_tags, tags_option)
|
83
|
-
if
|
109
|
+
def self.latest_verification_for_pseudo_branch(pact_publication, is_overall_latest, latest_verifications_for_cv_tags, tags_option, options)
|
110
|
+
if options[:view] == "branch" || (options[:view] == "all" && pact_publication.consumer_version.branch_heads.any?)
|
111
|
+
pact_publication.latest_verification || pact_publication.latest_verification_for_consumer_branches
|
112
|
+
elsif tags_option == true
|
84
113
|
latest_verifications_for_cv_tags
|
85
114
|
.select{ | v | v.consumer_id == pact_publication.consumer_id && v.provider_id == pact_publication.provider_id && pact_publication.head_pact_tags.collect(&:name).include?(v.consumer_version_tag_name) }
|
86
115
|
.sort{ |v1, v2| v1.id <=> v2.id }.last || (is_overall_latest && pact_publication.integration.latest_verification)
|
@@ -157,25 +186,27 @@ module PactBroker
|
|
157
186
|
return base.paginate(options[:page_number] || DEFAULT_PAGE_NUMBER, options[:page_size] || DEFAULT_PAGE_SIZE) if pacticipant_ids.blank?
|
158
187
|
end
|
159
188
|
|
160
|
-
ids_query =
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
.join_providers(:providers)
|
166
|
-
.join(:versions,
|
167
|
-
{ Sequel[:pact_publications][:consumer_version_id] => Sequel[:cv][:id] },
|
168
|
-
{ table_alias: :cv }
|
169
|
-
)
|
189
|
+
ids_query = if options[:view]
|
190
|
+
pact_publications_by_view(base, options)
|
191
|
+
else
|
192
|
+
query_pact_publication_ids_by_tags(base, options[:tags])
|
193
|
+
end
|
170
194
|
|
171
|
-
|
172
|
-
|
173
|
-
Sequel.desc(Sequel[:cv][:order]),
|
174
|
-
Sequel.asc(Sequel.function(:lower, Sequel[:providers][:name]))
|
175
|
-
]
|
195
|
+
select_columns_and_order(ids_query, options)
|
196
|
+
end
|
176
197
|
|
177
|
-
|
178
|
-
|
198
|
+
def self.pact_publications_by_view(query, options)
|
199
|
+
case options[:view]
|
200
|
+
when "branch" then query.latest_by_consumer_branch
|
201
|
+
when "tag" then query.latest_by_consumer_tag
|
202
|
+
when "environment" then query.in_environments
|
203
|
+
else
|
204
|
+
query
|
205
|
+
.overall_latest
|
206
|
+
.union(query.latest_by_consumer_branch)
|
207
|
+
.union(query.latest_by_consumer_tag)
|
208
|
+
.union(query.in_environments)
|
209
|
+
end
|
179
210
|
end
|
180
211
|
|
181
212
|
# eager loading the tag stuff doesn't seem to make it quicker
|
@@ -223,7 +254,27 @@ module PactBroker
|
|
223
254
|
pacticipant_repository.search_by_name(pacticipant_name).collect(&:id)
|
224
255
|
end
|
225
256
|
|
226
|
-
|
257
|
+
def self.select_columns_and_order(ids_query, options)
|
258
|
+
query = PactBroker::Pacts::PactPublication
|
259
|
+
.select_all_qualified
|
260
|
+
.where(Sequel[:pact_publications][:id] => ids_query)
|
261
|
+
.join_consumers(:consumers)
|
262
|
+
.join_providers(:providers)
|
263
|
+
|
264
|
+
|
265
|
+
order_columns = [
|
266
|
+
Sequel.asc(Sequel.function(:lower, Sequel[:consumers][:name])),
|
267
|
+
Sequel.desc(Sequel[:pact_publications][:consumer_version_order]),
|
268
|
+
Sequel.asc(Sequel.function(:lower, Sequel[:providers][:name]))
|
269
|
+
]
|
270
|
+
|
271
|
+
pact_number = options[:page_number] || DEFAULT_PAGE_NUMBER
|
272
|
+
page_size = options[:page_size] || DEFAULT_PAGE_SIZE
|
273
|
+
|
274
|
+
query.order(*order_columns).paginate(pact_number, page_size)
|
275
|
+
end
|
276
|
+
|
277
|
+
private_class_method :base_query, :query_pact_publication_ids_by_tags, :pact_pacticipant_ids_by_name, :select_columns_and_order
|
227
278
|
end
|
228
279
|
end
|
229
280
|
end
|
@@ -19,6 +19,8 @@ en:
|
|
19
19
|
response_body_hidden: For security purposes, the response details are not logged. To enable response logging, configure the webhook_host_whitelist property. See %{base_url}/doc/webhooks#whitelist for more information.
|
20
20
|
index:
|
21
21
|
title: Pacts
|
22
|
+
dashboard:
|
23
|
+
title: "%{consumer_name} / %{provider_name}"
|
22
24
|
matrix:
|
23
25
|
pre_verified: This pact was "pre-verified" as it has identical content to a previously verified pact.
|
24
26
|
webhooks:
|
@@ -8,6 +8,7 @@ module PactBroker
|
|
8
8
|
[:consumer_version_number, "cvn"], # for old urls
|
9
9
|
[:consumer_version_id, "cv"],
|
10
10
|
[:wip, "w"],
|
11
|
+
[:pending, "p"],
|
11
12
|
[:consumer_version_selectors, "s"],
|
12
13
|
[:tag, "t"],
|
13
14
|
[:branch, "b"],
|
@@ -62,8 +63,9 @@ module PactBroker
|
|
62
63
|
"l" => selector.latest,
|
63
64
|
"cv" => selector.consumer_version.id
|
64
65
|
}.compact
|
65
|
-
end
|
66
|
-
|
66
|
+
end,
|
67
|
+
"p" => verifiable_pact.pending?
|
68
|
+
}.compact
|
67
69
|
end
|
68
70
|
end
|
69
71
|
|
@@ -27,6 +27,43 @@ module PactBroker
|
|
27
27
|
# TODO rename to consumer_version_tags
|
28
28
|
associate(:one_to_many, :tags, :class => "PactBroker::Domain::Tag", :key => :version_id, :primary_key => :consumer_version_id)
|
29
29
|
|
30
|
+
many_to_one(:latest_verification_for_consumer_branches,
|
31
|
+
class: "PactBroker::Domain::Verification",
|
32
|
+
read_only: true,
|
33
|
+
key: :id,
|
34
|
+
primary_key: :id,
|
35
|
+
dataset: lambda {
|
36
|
+
|
37
|
+
bv_pp_join = {
|
38
|
+
Sequel[:branch_versions][:version_id] => Sequel[:pact_publications][:consumer_version_id],
|
39
|
+
Sequel[:pact_publications][:provider_id] => provider_id
|
40
|
+
}
|
41
|
+
|
42
|
+
verifications_join = {
|
43
|
+
Sequel[:verifications][:pact_version_id] => Sequel[:pact_publications][:pact_version_id]
|
44
|
+
}
|
45
|
+
|
46
|
+
branch_ids = PactBroker::Versions::BranchVersion
|
47
|
+
.select(:branch_id)
|
48
|
+
.where(version_id: consumer_version_id)
|
49
|
+
|
50
|
+
|
51
|
+
latest_verification_id = PactBroker::Versions::BranchVersion
|
52
|
+
.select(Sequel[:verifications][:id])
|
53
|
+
.where(Sequel[:branch_versions][:branch_id] => branch_ids)
|
54
|
+
.join(:pact_publications, bv_pp_join)
|
55
|
+
.join(:verifications, verifications_join)
|
56
|
+
.order(Sequel.desc(Sequel[:verifications][:id]))
|
57
|
+
.limit(1)
|
58
|
+
|
59
|
+
PactBroker::Domain::Verification.where(id: latest_verification_id)
|
60
|
+
},
|
61
|
+
eager_loader: proc do | _ |
|
62
|
+
raise NotImplementedError
|
63
|
+
end
|
64
|
+
)
|
65
|
+
|
66
|
+
|
30
67
|
one_to_many(:head_pact_publications_for_tags,
|
31
68
|
class: PactPublication,
|
32
69
|
read_only: true,
|
@@ -216,6 +216,27 @@ module PactBroker
|
|
216
216
|
end
|
217
217
|
end
|
218
218
|
|
219
|
+
def in_environments
|
220
|
+
currently_deployed_join = {
|
221
|
+
Sequel[:pact_publications][:consumer_version_id] => Sequel[:currently_deployed_version_ids][:version_id]
|
222
|
+
}
|
223
|
+
|
224
|
+
released_join = {
|
225
|
+
Sequel[:pact_publications][:consumer_version_id] => Sequel[:released_versions][:version_id],
|
226
|
+
Sequel[:released_versions][:support_ended_at] => nil
|
227
|
+
}
|
228
|
+
|
229
|
+
base_query = self
|
230
|
+
if no_columns_selected?
|
231
|
+
base_query = base_query.select_all_qualified
|
232
|
+
end
|
233
|
+
|
234
|
+
deployed = base_query.join(:currently_deployed_version_ids, currently_deployed_join)
|
235
|
+
released = base_query.join(:released_versions, released_join)
|
236
|
+
|
237
|
+
deployed.union(released)
|
238
|
+
end
|
239
|
+
|
219
240
|
def verified_before_date(date)
|
220
241
|
where { Sequel[:verifications][:execution_date] < date }
|
221
242
|
end
|
@@ -251,6 +272,10 @@ module PactBroker
|
|
251
272
|
join(:tags, { Sequel[table_alias][:version_id] => Sequel[:pact_publications][:consumer_version_id]}, { table_alias: table_alias })
|
252
273
|
end
|
253
274
|
|
275
|
+
def join_consumer_branch_versions
|
276
|
+
join(:branch_versions, { Sequel[:pact_publications][:consumer_version_id] => Sequel[:branch_versions][:version_id] })
|
277
|
+
end
|
278
|
+
|
254
279
|
def join_consumer_version_tags_with_names(consumer_version_tag_names)
|
255
280
|
join(:tags, {
|
256
281
|
Sequel[:ct][:version_id] => Sequel[:pact_publications][:consumer_version_id],
|
@@ -292,6 +317,20 @@ module PactBroker
|
|
292
317
|
join(:tags, {version_id: :consumer_version_id}).where(filter)
|
293
318
|
end
|
294
319
|
|
320
|
+
def for_branch_name branch_name
|
321
|
+
branch_versions_join = {
|
322
|
+
Sequel[:branch_versions][:version_id] => Sequel[:pact_publications][:consumer_version_id],
|
323
|
+
Sequel[:branch_versions][:branch_name] => branch_name
|
324
|
+
}
|
325
|
+
|
326
|
+
base_query = self
|
327
|
+
if no_columns_selected?
|
328
|
+
base_query = base_query.select_all_qualified.select_append(Sequel[:branch_versions][:branch_name].as(:branch_name))
|
329
|
+
end
|
330
|
+
|
331
|
+
base_query.join(:branch_versions, branch_versions_join)
|
332
|
+
end
|
333
|
+
|
295
334
|
def provider_name_like(name)
|
296
335
|
where(name_like(Sequel[:providers][:name], name))
|
297
336
|
end
|
@@ -130,8 +130,9 @@ module PactBroker
|
|
130
130
|
provider = pacticipant_repository.find_by_name!(options.fetch(:and))
|
131
131
|
query = scope_for(PactPublication).where(consumer: consumer, provider: provider)
|
132
132
|
query = query.tag(options[:tag]) if options[:tag]
|
133
|
+
query = query.for_branch_name(options[:branch_name]) if options[:branch_name]
|
133
134
|
|
134
|
-
ids = query.select_for_subquery(:id)
|
135
|
+
ids = query.select_for_subquery(Sequel.qualify(:pact_publications, :id).as(:id))
|
135
136
|
webhook_repository.delete_triggered_webhooks_by_pact_publication_ids(ids)
|
136
137
|
unscoped(PactPublication).where(id: ids).delete
|
137
138
|
end
|
@@ -145,7 +145,7 @@ module PactBroker
|
|
145
145
|
self
|
146
146
|
end
|
147
147
|
|
148
|
-
def get_pacts_for_verification(provider: last_provider_name, provider_version_tag: nil, provider_version_branch: nil, consumer_version_selectors: nil, enable_pending:
|
148
|
+
def get_pacts_for_verification(provider: last_provider_name, provider_version_tag: nil, provider_version_branch: nil, consumer_version_selectors: nil, enable_pending: nil, include_wip_pacts_since: nil)
|
149
149
|
@last_provider_name = provider
|
150
150
|
@last_provider_version_tag = provider_version_tag
|
151
151
|
@last_provder_version_branch = provider_version_branch
|
@@ -234,6 +234,10 @@ module PactBroker
|
|
234
234
|
self
|
235
235
|
end
|
236
236
|
|
237
|
+
def create_pact_with_different_content params = {}
|
238
|
+
create_pact(params.merge(json_content: random_json_content(consumer.name, provider.name)))
|
239
|
+
end
|
240
|
+
|
237
241
|
def republish_same_pact params = {}
|
238
242
|
params.delete(:comment)
|
239
243
|
last_pact_version = PactBroker::Pacts::PactVersion.order(:id).last
|
@@ -336,7 +340,7 @@ module PactBroker
|
|
336
340
|
def create_webhook_execution params = {}
|
337
341
|
params.delete(:comment)
|
338
342
|
logs = params[:logs] || "logs"
|
339
|
-
webhook_execution_result = PactBroker::Webhooks::WebhookExecutionResult.new(nil, OpenStruct.new(code: "200"), logs, nil)
|
343
|
+
webhook_execution_result = PactBroker::Webhooks::WebhookExecutionResult.new(nil, OpenStruct.new(code: "200"), true, logs, nil)
|
340
344
|
@webhook_execution = PactBroker::Webhooks::Repository.new.create_execution @triggered_webhook, webhook_execution_result
|
341
345
|
created_at = params[:created_at] || @pact.created_at + Rational(1, 86400)
|
342
346
|
set_created_at_if_set created_at, :webhook_executions, {id: @webhook_execution.id}
|
data/lib/pact_broker/ui/app.rb
CHANGED
@@ -4,6 +4,7 @@ require "pact_broker/ui/controllers/pacts"
|
|
4
4
|
require "pact_broker/ui/controllers/matrix"
|
5
5
|
require "pact_broker/ui/controllers/can_i_deploy"
|
6
6
|
require "pact_broker/ui/controllers/error_test"
|
7
|
+
require "pact_broker/ui/controllers/dashboard"
|
7
8
|
require "pact_broker/doc/controllers/app"
|
8
9
|
|
9
10
|
module PactBroker
|
@@ -30,7 +31,7 @@ module PactBroker
|
|
30
31
|
run PactBroker::UI::Controllers::Index
|
31
32
|
end
|
32
33
|
|
33
|
-
map "/
|
34
|
+
map "/pacticipants" do
|
34
35
|
run PactBroker::UI::Controllers::Groups
|
35
36
|
end
|
36
37
|
|
@@ -58,6 +59,11 @@ module PactBroker
|
|
58
59
|
run PactBroker::UI::Controllers::ErrorTest
|
59
60
|
end
|
60
61
|
|
62
|
+
map "/dashboard" do
|
63
|
+
use PathInfoFixer
|
64
|
+
run PactBroker::UI::Controllers::Dashboard
|
65
|
+
end
|
66
|
+
|
61
67
|
map "/" do
|
62
68
|
use PathInfoFixer
|
63
69
|
run PactBroker::UI::Controllers::Index
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require "pact_broker/ui/controllers/base_controller"
|
2
|
+
require "pact_broker/ui/view_models/index_items"
|
3
|
+
require "haml"
|
4
|
+
|
5
|
+
module PactBroker
|
6
|
+
module UI
|
7
|
+
module Controllers
|
8
|
+
class Dashboard < Base
|
9
|
+
include PactBroker::Services
|
10
|
+
|
11
|
+
get "/provider/:provider_name/consumer/:consumer_name" do
|
12
|
+
set_headers
|
13
|
+
consumer_name = params[:consumer_name]
|
14
|
+
provider_name = params[:provider_name]
|
15
|
+
view = params[:view] || index_service.smart_default_view(consumer_name, provider_name) || "branch"
|
16
|
+
tags = view == "tag" || view == "all"
|
17
|
+
page_number = params[:page]&.to_i || 1
|
18
|
+
# Make page size smaller for data intensive query
|
19
|
+
page_size = params[:pageSize]&.to_i || 30
|
20
|
+
options = {
|
21
|
+
tags: tags,
|
22
|
+
page_number: page_number,
|
23
|
+
page_size: page_size,
|
24
|
+
consumer_name: params[:consumer_name],
|
25
|
+
provider_name: params[:provider_name],
|
26
|
+
view: view
|
27
|
+
}.compact
|
28
|
+
error_messages = []
|
29
|
+
|
30
|
+
consumer = pacticipant_service.find_pacticipant_by_name(params[:consumer_name])
|
31
|
+
provider = pacticipant_service.find_pacticipant_by_name(params[:provider_name])
|
32
|
+
|
33
|
+
if !consumer
|
34
|
+
error_messages << "No pacticipant found with name #{consumer_name}"
|
35
|
+
end
|
36
|
+
|
37
|
+
if !provider
|
38
|
+
error_messages << "No pacticipant found with name #{provider_name}"
|
39
|
+
end
|
40
|
+
|
41
|
+
index_items = if consumer && provider
|
42
|
+
index_service.find_index_items(options)
|
43
|
+
else
|
44
|
+
[]
|
45
|
+
end
|
46
|
+
|
47
|
+
view_index_items = ViewDomain::IndexItems.new(index_items, base_url: base_url, view: view)
|
48
|
+
|
49
|
+
page = :'dashboard/show'
|
50
|
+
locals = {
|
51
|
+
title: PactBroker::Messages.message("messages.dashboard.title", consumer_name: params[:consumer_name], provider_name: params[:provider_name]),
|
52
|
+
index_items: view_index_items,
|
53
|
+
page_number: page_number,
|
54
|
+
page_size: page_size,
|
55
|
+
pagination_record_count: view_index_items.pagination_record_count,
|
56
|
+
current_page_size: view_index_items.size,
|
57
|
+
base_url: base_url,
|
58
|
+
errors: error_messages,
|
59
|
+
tags: tags,
|
60
|
+
view: view,
|
61
|
+
consumer_name: params[:consumer_name],
|
62
|
+
provider_name: params[:provider_name],
|
63
|
+
consumer: consumer,
|
64
|
+
provider: provider
|
65
|
+
}
|
66
|
+
|
67
|
+
haml page, { locals: locals, layout: :'layouts/main', escape_html: true }
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def set_headers
|
73
|
+
response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
|
74
|
+
response.headers["Pragma"] = "no-cache"
|
75
|
+
response.headers["Expires"] = "0"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -2,27 +2,42 @@ require "pact_broker/ui/controllers/base_controller"
|
|
2
2
|
require "pact_broker/ui/view_models/index_items"
|
3
3
|
require "haml"
|
4
4
|
|
5
|
+
# TODO handle 404 gracefully
|
6
|
+
|
5
7
|
module PactBroker
|
6
8
|
module UI
|
7
9
|
module Controllers
|
8
10
|
class Groups < Base
|
9
|
-
|
10
11
|
include PactBroker::Services
|
11
12
|
|
12
13
|
get ":name" do
|
13
|
-
pacticipant = pacticipant_service.find_pacticipant_by_name(params[:name])
|
14
14
|
erb :'groups/show.html', {
|
15
|
-
locals:
|
16
|
-
csv_path: "#{base_url}/groups/#{ERB::Util.url_encode(params[:name])}.csv",
|
17
|
-
pacticipant_name: params[:name],
|
18
|
-
repository_url: pacticipant&.repository_url,
|
19
|
-
base_url: base_url
|
20
|
-
}
|
15
|
+
locals: locals(tab: "details")
|
21
16
|
}, {
|
22
17
|
layout: "layouts/main",
|
23
18
|
}
|
24
19
|
end
|
25
20
|
|
21
|
+
get ":name/network" do
|
22
|
+
erb :'groups/show.html', {
|
23
|
+
locals: locals(tab: "network")
|
24
|
+
}, {
|
25
|
+
layout: "layouts/main",
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def locals(overrides)
|
30
|
+
pacticipant = pacticipant_service.find_pacticipant_by_name(params[:name])
|
31
|
+
{
|
32
|
+
csv_path: "#{base_url}/groups/#{ERB::Util.url_encode(params[:name])}.csv",
|
33
|
+
pacticipant_name: params[:name],
|
34
|
+
repository_url: pacticipant&.repository_url,
|
35
|
+
base_url: base_url,
|
36
|
+
pacticipant: pacticipant,
|
37
|
+
details_url: "#{base_url}/pacticipants/#{ERB::Util.url_encode(params[:name])}",
|
38
|
+
network_url: "#{base_url}/pacticipants/#{ERB::Util.url_encode(params[:name])}/network"
|
39
|
+
}.merge(overrides)
|
40
|
+
end
|
26
41
|
end
|
27
42
|
end
|
28
43
|
end
|