pact_broker 2.83.0 → 2.84.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -0
  3. data/Dockerfile +1 -1
  4. data/db/migrations/20210816_create_branches_tables.rb +40 -0
  5. data/db/migrations/20210831_add_index_to_pact_publications.rb +7 -0
  6. data/db/migrations/20210908_add_auto_created.rb +24 -0
  7. data/issue-reproduction/Dockerfile-pact-broker +1 -1
  8. data/lib/pact_broker/api/contracts/{verifiable_pacts_json_query_schema.rb → pacts_for_verification_json_query_schema.rb} +1 -1
  9. data/lib/pact_broker/api/contracts/{verifiable_pacts_query_schema.rb → pacts_for_verification_query_string_schema.rb} +1 -1
  10. data/lib/pact_broker/api/decorators/branch_version_decorator.rb +20 -0
  11. data/lib/pact_broker/api/decorators/dashboard_decorator.rb +4 -2
  12. data/lib/pact_broker/api/decorators/embedded_branch_version_decorator.rb +21 -0
  13. data/lib/pact_broker/api/decorators/embedded_tag_decorator.rb +0 -5
  14. data/lib/pact_broker/api/decorators/matrix_decorator.rb +11 -2
  15. data/lib/pact_broker/api/decorators/pacticipant_decorator.rb +8 -0
  16. data/lib/pact_broker/api/decorators/{verifiable_pacts_query_decorator.rb → pacts_for_verification_query_decorator.rb} +2 -2
  17. data/lib/pact_broker/api/decorators/version_decorator.rb +1 -1
  18. data/lib/pact_broker/api/pact_broker_urls.rb +8 -0
  19. data/lib/pact_broker/api/resources/branch_version.rb +48 -0
  20. data/lib/pact_broker/api/resources/index.rb +6 -0
  21. data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +6 -6
  22. data/lib/pact_broker/api/resources/version.rb +0 -8
  23. data/lib/pact_broker/api.rb +1 -0
  24. data/lib/pact_broker/config/runtime_configuration.rb +12 -0
  25. data/lib/pact_broker/contracts/service.rb +1 -1
  26. data/lib/pact_broker/db/data_migrations/create_branches.rb +97 -0
  27. data/lib/pact_broker/db/data_migrations/set_pacticipant_main_branch.rb +2 -0
  28. data/lib/pact_broker/db/migrate_data.rb +1 -1
  29. data/lib/pact_broker/db/models.rb +6 -0
  30. data/lib/pact_broker/deployments/deployed_version.rb +4 -0
  31. data/lib/pact_broker/deployments/deployed_version_service.rb +4 -3
  32. data/lib/pact_broker/deployments/environment.rb +4 -0
  33. data/lib/pact_broker/deployments/environment_service.rb +13 -8
  34. data/lib/pact_broker/doc/views/index/pacticipant-branch-version.markdown +14 -0
  35. data/lib/pact_broker/doc/views/webhooks.markdown +1 -0
  36. data/lib/pact_broker/domain/index_item.rb +15 -17
  37. data/lib/pact_broker/domain/pacticipant.rb +11 -0
  38. data/lib/pact_broker/domain/tag.rb +1 -2
  39. data/lib/pact_broker/domain/verification.rb +16 -13
  40. data/lib/pact_broker/domain/version.rb +87 -33
  41. data/lib/pact_broker/index/service.rb +8 -4
  42. data/lib/pact_broker/locale/en.yml +1 -0
  43. data/lib/pact_broker/matrix/quick_row.rb +6 -6
  44. data/lib/pact_broker/metrics/service.rb +7 -1
  45. data/lib/pact_broker/pacts/pact_publication.rb +22 -25
  46. data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +74 -33
  47. data/lib/pact_broker/pacts/pact_publication_selector_dataset_module.rb +18 -13
  48. data/lib/pact_broker/pacts/pact_publication_wip_dataset_module.rb +16 -4
  49. data/lib/pact_broker/pacts/pact_version.rb +11 -0
  50. data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +3 -3
  51. data/lib/pact_broker/pacts/selected_pact.rb +2 -2
  52. data/lib/pact_broker/pacts/selector.rb +98 -33
  53. data/lib/pact_broker/repositories.rb +5 -0
  54. data/lib/pact_broker/services.rb +9 -0
  55. data/lib/pact_broker/test/http_test_data_builder.rb +32 -7
  56. data/lib/pact_broker/test/test_data_builder.rb +25 -24
  57. data/lib/pact_broker/ui/view_models/index_item.rb +11 -0
  58. data/lib/pact_broker/ui/view_models/matrix_branch.rb +39 -0
  59. data/lib/pact_broker/ui/view_models/matrix_line.rb +11 -16
  60. data/lib/pact_broker/ui/views/index/show-with-tags.haml +12 -11
  61. data/lib/pact_broker/ui/views/matrix/show.haml +8 -8
  62. data/lib/pact_broker/version.rb +1 -1
  63. data/lib/pact_broker/versions/branch.rb +29 -0
  64. data/lib/pact_broker/versions/branch_head.rb +45 -0
  65. data/lib/pact_broker/versions/branch_service.rb +24 -0
  66. data/lib/pact_broker/versions/branch_version.rb +64 -0
  67. data/lib/pact_broker/versions/branch_version_repository.rb +34 -0
  68. data/lib/pact_broker/versions/eager_loaders.rb +0 -42
  69. data/lib/pact_broker/versions/repository.rb +25 -12
  70. data/lib/pact_broker/versions/service.rb +3 -22
  71. data/lib/pact_broker/webhooks/pact_and_verification_parameters.rb +11 -2
  72. data/lib/sequel/plugins/insert_ignore.rb +4 -0
  73. data/lib/sequel/plugins/upsert.rb +4 -0
  74. data/public/javascripts/index.js +129 -34
  75. data/scaffolding/templates/decorator.rb.erb +3 -1
  76. data/scaffolding/templates/migration.erb +1 -1
  77. data/scaffolding/templates/model.erb +2 -2
  78. data/scaffolding/templates/repository.rb.erb +2 -2
  79. data/scaffolding/templates/repository_spec.rb.erb +1 -1
  80. data/scaffolding/templates/resource.erb +2 -2
  81. data/scaffolding/templates/resource_spec.rb.erb +1 -1
  82. data/scaffolding/templates/service.rb.erb +3 -3
  83. data/scaffolding/templates/service_spec.rb.erb +1 -1
  84. data/script/data/branches.rb +35 -0
  85. data/script/data/issue-494.rb +25 -0
  86. data/spec/features/create_branch_version_spec.rb +29 -0
  87. data/spec/features/create_tag_spec.rb +1 -1
  88. data/spec/features/create_version_spec.rb +2 -4
  89. data/spec/features/get_branch_version_spec.rb +12 -0
  90. data/spec/features/publish_pact_all_in_one_spec.rb +0 -1
  91. data/spec/features/update_version_spec.rb +0 -55
  92. data/spec/fixtures/approvals/modifiable_resources.approved.json +3 -0
  93. data/spec/fixtures/approvals/publish_contract_nothing_exists.approved.json +1 -2
  94. data/spec/fixtures/approvals/publish_contract_nothing_exists_with_webhook.approved.json +1 -2
  95. data/spec/fixtures/approvals/publish_contract_verification_already_exists.approved.json +1 -2
  96. data/spec/fixtures/dashboard.json +4 -2
  97. data/spec/integration/ui/index_spec.rb +0 -2
  98. data/spec/integration/ui/matrix_spec.rb +0 -1
  99. data/spec/lib/pact_broker/api/contracts/{verifiable_pacts_json_query_schema_combinations_spec.rb → pacts_for_verification_json_query_schema_combinations_spec.rb} +6 -6
  100. data/spec/lib/pact_broker/api/contracts/{verifiable_pacts_json_query_schema_spec.rb → pacts_for_verification_json_query_schema_spec.rb} +3 -3
  101. data/spec/lib/pact_broker/api/contracts/{verifiable_pacts_query_schema_spec.rb → pacts_for_verification_query_string_schema_spec.rb} +3 -3
  102. data/spec/lib/pact_broker/api/decorators/dashboard_decorator_spec.rb +7 -7
  103. data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +19 -4
  104. data/spec/lib/pact_broker/api/decorators/{verifiable_pacts_query_decorator_spec.rb → pacts_for_verification_query_decorator_spec.rb} +3 -3
  105. data/spec/lib/pact_broker/api/decorators/version_decorator_spec.rb +7 -3
  106. data/spec/lib/pact_broker/contracts/service_spec.rb +24 -3
  107. data/spec/lib/pact_broker/db/data_migrations/create_branches_spec.rb +57 -0
  108. data/spec/lib/pact_broker/domain/index_item_spec.rb +1 -1
  109. data/spec/lib/pact_broker/domain/version_spec.rb +1 -35
  110. data/spec/lib/pact_broker/metrics/service_spec.rb +4 -1
  111. data/spec/lib/pact_broker/pacts/pact_publication_dataset_module_spec.rb +109 -10
  112. data/spec/lib/pact_broker/pacts/pact_publication_selector_dataset_module_spec.rb +3 -2
  113. data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +5 -5
  114. data/spec/lib/pact_broker/pacts/repository_find_for_currently_deployed_spec.rb +2 -2
  115. data/spec/lib/pact_broker/pacts/repository_find_for_currently_supported_releases_spec.rb +2 -2
  116. data/spec/lib/pact_broker/pacts/selector_spec.rb +45 -3
  117. data/spec/lib/pact_broker/pacts/verifiable_pact_messages_spec.rb +5 -5
  118. data/spec/lib/pact_broker/relationships/groupify_spec.rb +0 -5
  119. data/spec/lib/pact_broker/ui/view_models/index_item_spec.rb +15 -3
  120. data/spec/lib/pact_broker/verifications/repository_spec.rb +1 -1
  121. data/spec/lib/pact_broker/versions/branch_service_spec.rb +71 -0
  122. data/spec/lib/pact_broker/versions/branch_version_repository_spec.rb +81 -0
  123. data/spec/lib/pact_broker/versions/branch_version_spec.rb +27 -0
  124. data/spec/lib/pact_broker/versions/repository_spec.rb +91 -6
  125. data/spec/lib/pact_broker/versions/service_spec.rb +4 -3
  126. data/spec/lib/pact_broker/webhooks/render_spec.rb +6 -0
  127. data/spec/lib/sequel/plugins/upsert_spec.rb +11 -5
  128. data/spec/migrations/44_add_provider_version_to_verification_spec.rb +6 -9
  129. metadata +42 -15
  130. data/lib/pact_broker/versions/lazy_loaders.rb +0 -13
@@ -13,7 +13,9 @@ module PactBroker
13
13
 
14
14
  delegate [
15
15
  :consumer_version_branch,
16
+ :consumer_version_branches,
16
17
  :provider_version_branch,
18
+ :provider_version_branches,
17
19
  :latest_for_branch?,
18
20
  :consumer_version_environment_names,
19
21
  :provider_version_environment_names
@@ -206,6 +208,15 @@ module PactBroker
206
208
  @options[:base_url]
207
209
  end
208
210
 
211
+ def tagged_pacts
212
+ @relationship.tag_names.map do |tag|
213
+ {
214
+ tag: tag,
215
+ deletionUrl: PactBroker::Api::PactBrokerUrls.tagged_pact_versions_url(consumer_name, provider_name, tag, base_url)
216
+ }.to_json
217
+ end
218
+ end
219
+
209
220
  private
210
221
 
211
222
  attr_reader :relationship
@@ -0,0 +1,39 @@
1
+ require "pact_broker/api/pact_broker_urls"
2
+ require "pact_broker/ui/helpers/url_helper"
3
+ require "pact_broker/date_helper"
4
+
5
+ module PactBroker
6
+ module UI
7
+ module ViewDomain
8
+ class MatrixBranch
9
+
10
+ include PactBroker::Api::PactBrokerUrls
11
+
12
+ def initialize branch_version, pacticipant_name
13
+ @branch_version = branch_version
14
+ @pacticipant_name = pacticipant_name
15
+ end
16
+
17
+ def name
18
+ branch_version.branch_name
19
+ end
20
+
21
+ def tooltip
22
+ if branch_version.latest?
23
+ "This is the latest version of #{pacticipant_name} from branch \"#{branch_version.branch_name}\"."
24
+ else
25
+ "A more recent version of #{pacticipant_name} from branch \"#{branch_version.branch_name}\" exists."
26
+ end
27
+ end
28
+
29
+ def latest?
30
+ branch_version.latest?
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :branch_version, :pacticipant_name
36
+ end
37
+ end
38
+ end
39
+ end
@@ -2,6 +2,7 @@ require "pact_broker/api/pact_broker_urls"
2
2
  require "pact_broker/ui/helpers/url_helper"
3
3
  require "pact_broker/date_helper"
4
4
  require "pact_broker/ui/view_models/matrix_tag"
5
+ require "pact_broker/ui/view_models/matrix_branch"
5
6
  require "pact_broker/ui/view_models/matrix_deployed_version"
6
7
  require "pact_broker/ui/view_models/matrix_released_version"
7
8
  require "pact_broker/versions/abbreviate_number"
@@ -16,8 +17,6 @@ module PactBroker
16
17
  include PactBroker::Messages
17
18
  extend Forwardable
18
19
 
19
- delegate [:consumer_version_branch, :provider_version_branch] => :line
20
-
21
20
  def initialize line, options = {}
22
21
  @line = line
23
22
  @options = options
@@ -103,20 +102,10 @@ module PactBroker
103
102
  end
104
103
  end
105
104
 
106
- def consumer_version_branch_tooltip
107
- branch_tooltip(consumer_name, consumer_version_branch, consumer_version_latest_for_branch?)
108
- end
109
-
110
- def consumer_version_latest_for_branch?
111
- @line.consumer_version.latest_for_branch?
112
- end
113
-
114
- def provider_version_branch_tooltip
115
- branch_tooltip(provider_name, provider_version_branch, provider_version_latest_for_branch?)
116
- end
117
-
118
- def provider_version_latest_for_branch?
119
- @line.provider_version.latest_for_branch?
105
+ def consumer_version_branches
106
+ @line.consumer_version_branch_versions.collect do | branch_version |
107
+ MatrixBranch.new(branch_version, consumer_name)
108
+ end
120
109
  end
121
110
 
122
111
  def latest_consumer_version_tags
@@ -141,6 +130,12 @@ module PactBroker
141
130
  provider_deployed_versions + provider_released_versions
142
131
  end
143
132
 
133
+ def provider_version_branches
134
+ @line.provider_version_branch_versions.collect do | branch_version |
135
+ MatrixBranch.new(branch_version, provider_name)
136
+ end
137
+ end
138
+
144
139
  def latest_provider_version_tags
145
140
  @line.provider_version_tags
146
141
  .select(&:latest)
@@ -48,7 +48,11 @@
48
48
  %tbody
49
49
 
50
50
  - index_items.each do | index_item |
51
- %tr{'data-pact-versions-url': index_item.pact_versions_url, 'data-consumer-name': index_item.consumer_name, 'data-provider-name': index_item.provider_name, 'data-integration-url': index_item.integration_url}
51
+ %tr{'data-pact-versions-url': index_item.pact_versions_url,
52
+ 'data-consumer-name': index_item.consumer_name,
53
+ 'data-provider-name': index_item.provider_name,
54
+ 'data-integration-url': index_item.integration_url,
55
+ 'data-tagged-pacts': index_item.tagged_pacts}
52
56
  %td.consumer
53
57
  %a{:href => index_item.consumer_group_url }
54
58
  = index_item.consumer_name
@@ -58,10 +62,9 @@
58
62
  - if index_item.display_consumer_version_number
59
63
  %button.clippy.invisible{ title: "Copy to clipboard" }
60
64
  %span.copy-icon
61
- - if index_item.consumer_version_branch
62
- - branch_class = index_item.latest_for_branch? ? "tag badge badge-dark" : "tag badge badge-secondary"
63
- %div{"class": branch_class}
64
- = "branch: " + index_item.consumer_version_branch
65
+ - index_item.consumer_version_branches.each do | branch_name |
66
+ %div{"class": "tag badge badge-dark"}
67
+ = "branch: " + branch_name
65
68
  - index_item.consumer_version_latest_tag_names.each do | tag_name |
66
69
  .tag.badge.badge-primary
67
70
  = "tag: " + tag_name
@@ -85,10 +88,9 @@
85
88
  - if index_item.display_provider_version_number
86
89
  %button.clippy.invisible{ title: "Copy to clipboard" }
87
90
  %span.copy-icon
88
- - if index_item.provider_version_branch
89
- - branch_class = "tag badge badge-dark"
90
- %div{"class": branch_class}
91
- = "branch: " + index_item.provider_version_branch
91
+ - index_item.provider_version_branches.each do | branch_name |
92
+ %div{"class": "tag badge badge-dark"}
93
+ = "branch: " + branch_name
92
94
  - index_item.provider_version_latest_tag_names.each do | tag_name |
93
95
  .tag.badge.badge-primary
94
96
  = "tag: " + tag_name
@@ -108,8 +110,7 @@
108
110
  - if index_item.warning?
109
111
  %span.warning-icon{ 'aria-hidden': true }
110
112
  %td
111
- - if index_item.show_settings?
112
- %span.integration-settings.kebab-horizontal{ 'aria-hidden': true }
113
+ %span.integration-settings.kebab-horizontal{ 'aria-hidden': true }
113
114
 
114
115
  %div.pagination.text-center
115
116
 
@@ -136,11 +136,11 @@
136
136
  - if line.display_consumer_version_number
137
137
  %button.clippy.invisible{ title: "Copy to clipboard" }
138
138
  %span.copy-icon
139
- - if line.consumer_version_branch
140
- .tag-parent{"title": line.consumer_version_branch_tooltip, "data-toggle": "tooltip", "data-placement": "right"}
141
- - branch_class = line.consumer_version_latest_for_branch? ? "tag badge badge-dark" : "tag badge badge-secondary"
139
+ - line.consumer_version_branches.each do | branch |
140
+ .tag-parent{"title": branch.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
141
+ - branch_class = branch.latest? ? "tag badge badge-dark" : "tag badge badge-secondary"
142
142
  %div{"class": branch_class}
143
- = "branch: " + line.consumer_version_branch
143
+ = "branch: " + branch.name
144
144
  - line.consumer_versions_in_environments.each do | version_in_environment |
145
145
  .tag-parent{"title": version_in_environment.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
146
146
  %a{href: version_in_environment.url}
@@ -173,11 +173,11 @@
173
173
  - if line.display_provider_version_number
174
174
  %button.clippy.invisible{ title: "Copy to clipboard" }
175
175
  %span.copy-icon
176
- - if line.provider_version_branch
177
- .tag-parent{"title": line.provider_version_branch_tooltip, "data-toggle": "tooltip", "data-placement": "right"}
178
- - branch_class = line.provider_version_latest_for_branch? ? "tag badge badge-dark" : "tag badge badge-secondary"
176
+ - line.provider_version_branches.each do | branch |
177
+ .tag-parent{"title": branch.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
178
+ - branch_class = branch.latest? ? "tag badge badge-dark" : "tag badge badge-secondary"
179
179
  %div{"class": branch_class}
180
- = "branch: " + line.provider_version_branch
180
+ = "branch: " + branch.name
181
181
  - line.provider_versions_in_environments.each do | version_in_environment |
182
182
  .tag-parent{"title": version_in_environment.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
183
183
  %a{href: version_in_environment.url}
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = "2.83.0"
2
+ VERSION = "2.84.0"
3
3
  end
@@ -0,0 +1,29 @@
1
+ require "pact_broker/db"
2
+ require "pact_broker/repositories/helpers"
3
+
4
+ module PactBroker
5
+ module Versions
6
+ class Branch < Sequel::Model(:branches)
7
+ plugin :timestamps, update_on_create: true
8
+ plugin :insert_ignore, identifying_columns: [:name, :pacticipant_id]
9
+
10
+ associate(:many_to_one, :pacticipant, :class => "PactBroker::Domain::Pacticipant", :key => :pacticipant_id, :primary_key => :id)
11
+ end
12
+ end
13
+ end
14
+
15
+ # Table: branches
16
+ # Columns:
17
+ # id | integer | PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
18
+ # name | text |
19
+ # pacticipant_id | integer | NOT NULL
20
+ # created_at | timestamp without time zone | NOT NULL
21
+ # updated_at | timestamp without time zone | NOT NULL
22
+ # Indexes:
23
+ # branches_pkey | PRIMARY KEY btree (id)
24
+ # branches_pacticipant_id_name_index | UNIQUE btree (pacticipant_id, name)
25
+ # Foreign key constraints:
26
+ # branches_pacticipant_id_fkey | (pacticipant_id) REFERENCES pacticipants(id) ON DELETE CASCADE
27
+ # Referenced By:
28
+ # branch_heads | branch_heads_branch_id_fkey | (branch_id) REFERENCES branches(id) ON DELETE CASCADE
29
+ # branch_versions | branch_versions_branches_fk | (branch_id) REFERENCES branches(id) ON DELETE CASCADE
@@ -0,0 +1,45 @@
1
+ require "pact_broker/db"
2
+ require "pact_broker/repositories/helpers"
3
+
4
+ module PactBroker
5
+ module Versions
6
+ class BranchHead < Sequel::Model
7
+ plugin :upsert, identifying_columns: [:branch_id]
8
+ set_primary_key :branch_id
9
+ unrestrict_primary_key
10
+
11
+ associate(:many_to_one, :branch, :class => "PactBroker::Versions::Branch", :key => :branch_id, :primary_key => :id)
12
+ associate(:many_to_one, :branch_version, :class => "PactBroker::Versions::BranchVersion", :key => :branch_version_id, :primary_key => :id)
13
+ associate(:many_to_one, :version, :class => "PactBroker::Domain::Version", :key => :version_id, :primary_key => :id)
14
+
15
+ def before_save
16
+ super
17
+ self.pacticipant_id = branch.pacticipant_id
18
+ self.version_id = branch_version.version_id
19
+ self.branch_name = branch.name
20
+ end
21
+
22
+ def branch_name
23
+ branch.name
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ # Table: branch_heads
30
+ # Columns:
31
+ # id | integer | PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
32
+ # branch_id | integer | NOT NULL
33
+ # branch_version_id | integer | NOT NULL
34
+ # version_id | integer | NOT NULL
35
+ # pacticipant_id | integer | NOT NULL
36
+ # branch_name | text | NOT NULL
37
+ # Indexes:
38
+ # branch_heads_pkey | PRIMARY KEY btree (id)
39
+ # branch_heads_branch_id_index | UNIQUE btree (branch_id)
40
+ # branch_heads_branch_name_index | btree (branch_name)
41
+ # branch_heads_pacticipant_id_index | btree (pacticipant_id)
42
+ # branch_heads_version_id_index | btree (version_id)
43
+ # Foreign key constraints:
44
+ # branch_heads_branch_id_fkey | (branch_id) REFERENCES branches(id) ON DELETE CASCADE
45
+ # branch_heads_branch_version_id_fkey | (branch_version_id) REFERENCES branch_versions(id) ON DELETE CASCADE
@@ -0,0 +1,24 @@
1
+ require "pact_broker/logging"
2
+ require "pact_broker/repositories"
3
+ require "pact_broker/messages"
4
+
5
+ module PactBroker
6
+ module Versions
7
+ class BranchService
8
+ extend PactBroker::Repositories
9
+
10
+ def self.find_branch_version(pacticipant_name:, branch_name:, version_number:, **)
11
+ BranchVersion.where(
12
+ version: PactBroker::Domain::Version.where_pacticipant_name_and_version_number(pacticipant_name, version_number),
13
+ branch: Branch.where(name: branch_name)
14
+ ).single_record
15
+ end
16
+
17
+ def self.find_or_create_branch_version(pacticipant_name:, branch_name:, version_number:, **)
18
+ pacticipant = pacticipant_repository.find_by_name_or_create(pacticipant_name)
19
+ version = version_repository.find_by_pacticipant_id_and_number_or_create(pacticipant.id, version_number)
20
+ branch_version_repository.add_branch(version, branch_name)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,64 @@
1
+ require "pact_broker/db"
2
+ require "pact_broker/repositories/helpers"
3
+
4
+ module PactBroker
5
+ module Versions
6
+ class BranchVersion < Sequel::Model(:branch_versions)
7
+ plugin :timestamps, update_on_create: true
8
+ plugin :insert_ignore, identifying_columns: [:branch_id, :version_id]
9
+ plugin :upsert, identifying_columns: [:branch_id, :version_id]
10
+
11
+ associate(:many_to_one, :branch, :class => "PactBroker::Versions::Branch", :key => :branch_id, :primary_key => :id)
12
+ associate(:many_to_one, :version, :class => "PactBroker::Domain::Version", :key => :version_id, :primary_key => :id)
13
+ associate(:many_to_one, :branch_head, :class => "PactBroker::Versions::BranchHead", :key => :branch_id, :primary_key => :branch_id)
14
+
15
+ dataset_module do
16
+ def find_latest_for_branch(branch)
17
+ max_version_order = BranchVersion.select(Sequel.function(:max, :version_order)).where(branch_id: branch.id)
18
+ BranchVersion.where(branch_id: branch.id, version_order: max_version_order).single_record
19
+ end
20
+ end
21
+
22
+ def before_save
23
+ super
24
+ self.version_order = version.order
25
+ self.pacticipant_id = version.pacticipant_id
26
+ self.branch_name = branch.name
27
+ end
28
+
29
+ def latest?
30
+ branch_head.branch_version_id == id
31
+ end
32
+
33
+ def version_number
34
+ version.number
35
+ end
36
+
37
+ def pacticipant
38
+ branch.pacticipant
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ # Table: branch_versions
45
+ # Columns:
46
+ # id | integer | PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
47
+ # branch_id | integer | NOT NULL
48
+ # version_id | integer | NOT NULL
49
+ # version_order | integer | NOT NULL
50
+ # pacticipant_id | integer | NOT NULL
51
+ # branch_name | text | NOT NULL
52
+ # created_at | timestamp without time zone | NOT NULL
53
+ # updated_at | timestamp without time zone | NOT NULL
54
+ # Indexes:
55
+ # branch_versions_pkey | PRIMARY KEY btree (id)
56
+ # branch_versions_branch_id_version_id_index | UNIQUE btree (branch_id, version_id)
57
+ # branch_versions_branch_name_index | btree (branch_name)
58
+ # branch_versions_pacticipant_id_branch_id_version_order_index | btree (pacticipant_id, branch_id, version_order)
59
+ # branch_versions_version_id_index | btree (version_id)
60
+ # Foreign key constraints:
61
+ # branch_versions_branches_fk | (branch_id) REFERENCES branches(id) ON DELETE CASCADE
62
+ # branch_versions_versions_fk | (version_id) REFERENCES versions(id) ON DELETE CASCADE
63
+ # Referenced By:
64
+ # branch_heads | branch_heads_branch_version_id_fkey | (branch_version_id) REFERENCES branch_versions(id) ON DELETE CASCADE
@@ -0,0 +1,34 @@
1
+ module PactBroker
2
+ module Versions
3
+ class BranchVersionRepository
4
+ include PactBroker::Services
5
+
6
+ def add_branch(version, branch_name, auto_created: false)
7
+ branch = find_or_create_branch(version.pacticipant, branch_name)
8
+ branch_version = version.branch_version_for_branch(branch)
9
+ if branch_version
10
+ branch_version.update(updated_at: Sequel.datetime_class.now)
11
+ else
12
+ branch_version = PactBroker::Versions::BranchVersion.new(version: version, branch: branch, auto_created: auto_created).insert_ignore
13
+ PactBroker::Versions::BranchHead.new(branch: branch, branch_version: branch_version).upsert
14
+ end
15
+ pacticipant_service.maybe_set_main_branch(version.pacticipant, branch_name)
16
+ branch_version
17
+ end
18
+
19
+ private
20
+
21
+ def find_or_create_branch(pacticipant, branch_name)
22
+ find_branch(pacticipant, branch_name) || create_branch(pacticipant, branch_name)
23
+ end
24
+
25
+ def find_branch(pacticipant, branch_name)
26
+ PactBroker::Versions::Branch.where(pacticipant: pacticipant, name: branch_name).single_record
27
+ end
28
+
29
+ def create_branch(pacticipant, branch_name)
30
+ PactBroker::Versions::Branch.new(pacticipant: pacticipant, name: branch_name).insert_ignore
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,48 +1,6 @@
1
1
  module PactBroker
2
2
  module Versions
3
3
  module EagerLoaders
4
- class LatestVersionForBranch
5
- def self.call(eo, **_other)
6
- initialize_association(eo[:rows])
7
- populate_associations(eo[:rows])
8
- end
9
-
10
- def self.initialize_association(versions)
11
- versions.each{|version| version.associations[:latest_version_for_branch] = nil }
12
- end
13
-
14
- def self.populate_associations(versions)
15
- group_by_pacticipant_id(versions).each do | pacticipant, participant_versions |
16
- populate_associations_by_pacticipant(pacticipant, participant_versions)
17
- end
18
- end
19
-
20
- def self.group_by_pacticipant_id(versions)
21
- versions.to_a.group_by(&:pacticipant_id)
22
- end
23
-
24
- def self.populate_associations_by_pacticipant(pacticipant_id, versions)
25
- latest_versions_for_branches = latest_versions_for_pacticipant_branches(
26
- pacticipant_id,
27
- versions.collect(&:branch).uniq.compact,
28
- versions.first.class
29
- )
30
- self.populate_versions_with_branches(versions, latest_versions_for_branches)
31
- end
32
-
33
- def self.populate_versions_with_branches(versions, latest_versions_for_branches)
34
- versions.select(&:branch).each do | version |
35
- version.associations[:latest_version_for_branch] = latest_versions_for_branches[[version.pacticipant_id, version.branch]]
36
- end
37
- end
38
-
39
- def self.latest_versions_for_pacticipant_branches(pacticipant_id, branches, version_class)
40
- version_class.latest_versions_for_pacticipant_branches(pacticipant_id, branches).each_with_object({}) do | row, hash |
41
- hash[[row.pacticipant_id, row.branch]] = row
42
- end
43
- end
44
- end
45
-
46
4
  class LatestVersionForPacticipant
47
5
  def self.call(eo, **_other)
48
6
  populate_associations(eo[:rows])