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.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/db/migrations/20210913_add_pending_to_verifications.rb +7 -0
  4. data/lib/pact/doc/markdown/consumer_contract_renderer.rb +3 -3
  5. data/lib/pact_broker/api/decorators/reason_decorator.rb +2 -2
  6. data/lib/pact_broker/api/decorators/verification_summary_decorator.rb +1 -2
  7. data/lib/pact_broker/api/middleware/configuration.rb +33 -0
  8. data/lib/pact_broker/api/pact_broker_urls.rb +5 -1
  9. data/lib/pact_broker/api/renderers/html_pact_renderer.rb +15 -11
  10. data/lib/pact_broker/api/resources/pact_versions_for_branch.rb +40 -0
  11. data/lib/pact_broker/api/resources/verifications.rb +5 -1
  12. data/lib/pact_broker/api.rb +1 -0
  13. data/lib/pact_broker/app.rb +2 -0
  14. data/lib/pact_broker/badges/service.rb +3 -1
  15. data/lib/pact_broker/configuration.rb +33 -29
  16. data/lib/pact_broker/domain/verification.rb +9 -0
  17. data/lib/pact_broker/domain/webhook.rb +22 -10
  18. data/lib/pact_broker/domain/webhook_request.rb +2 -2
  19. data/lib/pact_broker/index/service.rb +73 -22
  20. data/lib/pact_broker/locale/en.yml +2 -0
  21. data/lib/pact_broker/pacts/metadata.rb +4 -2
  22. data/lib/pact_broker/pacts/pact_publication.rb +37 -0
  23. data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +39 -0
  24. data/lib/pact_broker/pacts/repository.rb +2 -1
  25. data/lib/pact_broker/test/http_test_data_builder.rb +1 -1
  26. data/lib/pact_broker/test/test_data_builder.rb +5 -1
  27. data/lib/pact_broker/ui/app.rb +7 -1
  28. data/lib/pact_broker/ui/controllers/dashboard.rb +80 -0
  29. data/lib/pact_broker/ui/controllers/groups.rb +23 -8
  30. data/lib/pact_broker/ui/helpers/url_helper.rb +5 -1
  31. data/lib/pact_broker/ui/view_models/index_item.rb +49 -7
  32. data/lib/pact_broker/ui/view_models/matrix_branch.rb +1 -1
  33. data/lib/pact_broker/ui/view_models/matrix_tag.rb +0 -1
  34. data/lib/pact_broker/ui/views/dashboard/show.haml +195 -0
  35. data/lib/pact_broker/ui/views/groups/show.html.erb +60 -14
  36. data/lib/pact_broker/ui/views/index/_dashboard_navbar.haml +7 -0
  37. data/lib/pact_broker/ui/views/index/_navbar.haml +0 -7
  38. data/lib/pact_broker/ui/views/index/show-with-tags.haml +3 -1
  39. data/lib/pact_broker/ui/views/index/show.haml +35 -13
  40. data/lib/pact_broker/ui/views/matrix/show.haml +7 -3
  41. data/lib/pact_broker/verifications/pseudo_branch_status.rb +2 -0
  42. data/lib/pact_broker/verifications/service.rb +1 -0
  43. data/lib/pact_broker/version.rb +1 -1
  44. data/lib/pact_broker/webhooks/event_listener.rb +3 -3
  45. data/lib/pact_broker/webhooks/execution_configuration.rb +16 -0
  46. data/lib/pact_broker/webhooks/execution_configuration_creator.rb +3 -0
  47. data/lib/pact_broker/webhooks/job.rb +1 -1
  48. data/lib/pact_broker/webhooks/trigger_service.rb +2 -2
  49. data/lib/pact_broker/webhooks/webhook_execution_result.rb +3 -7
  50. data/lib/pact_broker/webhooks/webhook_request_logger.rb +4 -12
  51. data/lib/pact_broker/webhooks/webhook_request_template.rb +6 -8
  52. data/pact_broker.gemspec +4 -0
  53. data/public/javascripts/index.js +75 -68
  54. data/public/javascripts/pact.js +14 -14
  55. data/public/stylesheets/index.css +1 -2
  56. data/public/stylesheets/pact.css +11 -0
  57. data/script/data/auto-create-things-for-tags.rb +2 -0
  58. data/script/data/branches.rb +2 -2
  59. data/script/data/contract-published-requiring-verification.rb +1 -1
  60. data/script/data/environments.rb +0 -0
  61. data/script/data/pending.rb +26 -0
  62. data/script/data/tags.rb +35 -0
  63. data/script/data/webhook.rb +22 -0
  64. data/script/seed.rb +50 -89
  65. data/spec/features/delete_pact_versions_for_branch_spec.rb +34 -0
  66. data/spec/fixtures/approvals/modifiable_resources.approved.json +4 -0
  67. data/spec/integration/app_spec.rb +6 -6
  68. data/spec/lib/pact/doc/markdown/consumer_contract_renderer_spec.rb +2 -2
  69. data/spec/lib/pact_broker/api/decorators/reason_decorator_spec.rb +2 -2
  70. data/spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb +2 -0
  71. data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +1 -1
  72. data/spec/lib/pact_broker/api/middleware/configuration_spec.rb +43 -0
  73. data/spec/lib/pact_broker/api/resources/verifications_spec.rb +2 -3
  74. data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +1 -1
  75. data/spec/lib/pact_broker/badges/service_spec.rb +22 -0
  76. data/spec/lib/pact_broker/domain/webhook_request_spec.rb +2 -1
  77. data/spec/lib/pact_broker/domain/webhook_spec.rb +15 -5
  78. data/spec/lib/pact_broker/index/service_spec.rb +1 -5
  79. data/spec/lib/pact_broker/index/service_view_spec.rb +144 -0
  80. data/spec/lib/pact_broker/pacts/metadata_spec.rb +11 -2
  81. data/spec/lib/pact_broker/pacts/pact_publication_latest_verification_spec.rb +29 -0
  82. data/spec/lib/pact_broker/pacts/repository_spec.rb +15 -2
  83. data/spec/lib/pact_broker/ui/view_models/index_item_spec.rb +11 -8
  84. data/spec/lib/pact_broker/verifications/pseudo_branch_status_spec.rb +9 -1
  85. data/spec/lib/pact_broker/verifications/service_spec.rb +4 -2
  86. data/spec/lib/pact_broker/webhooks/job_spec.rb +4 -4
  87. data/spec/lib/pact_broker/webhooks/trigger_service_spec.rb +9 -5
  88. data/spec/lib/pact_broker/webhooks/webhook_request_logger_spec.rb +6 -12
  89. data/spec/lib/pact_broker/webhooks/webhook_request_template_spec.rb +3 -2
  90. data/spec/support/generated_markdown.md +3 -3
  91. metadata +47 -4
  92. 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"] = PactBroker.configuration.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 tags_option == true
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 = query_pact_publication_ids_by_tags(base, options[:tags])
161
- query = PactBroker::Pacts::PactPublication
162
- .select_all_qualified
163
- .where(Sequel[:pact_publications][:id] => ids_query)
164
- .join_consumers(:consumers)
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
- order_columns = [
172
- Sequel.asc(Sequel.function(:lower, Sequel[:consumers][:name])),
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
- query.order(*order_columns)
178
- .paginate(options[:page_number] || DEFAULT_PAGE_NUMBER, options[:page_size] || DEFAULT_PAGE_SIZE)
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
- private_class_method :base_query, :query_pact_publication_ids_by_tags, :pact_pacticipant_ids_by_name
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: false, include_wip_pacts_since: nil)
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}
@@ -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 "/groups" do
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