workarea-core 3.5.13 → 3.5.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b15a5824ab2746ddff9941773fefcaec1829d2a721a65893b3dac3a2fc7aad8a
4
- data.tar.gz: 90b49ae058315ad91c7427c0b94c39a86016ed1898bb44d4bad99c9377053d53
3
+ metadata.gz: 32f457800d2f9e59fb315b3bdedde57f90d04ea6befdd4cf04dc5b4c78838eaf
4
+ data.tar.gz: 564f64759f19ea4d0db9b1ea4b7a2c12cdebf629ea2f52b5916519a3c958d611
5
5
  SHA512:
6
- metadata.gz: 7ee0b818334a756cbeceacf3be95347e8fa0d46090c0fd3729073c67a04e4c2e17530adc50e772e3bc4f759fdc5d62d7d775e5e2cb0281a5541e063d82fe7526
7
- data.tar.gz: bd4eb10892770ef2b332a25203f54e703940cec8d45fce3f13a3316636b4ec3c78c0ce4088e504845e7f017ebf75eaa8a0036251f37ed9207d90f3fe6a86be5e
6
+ metadata.gz: 6ae82b803bfe0daffc1e54953aa54f0c3a045cbe83fbb7b2e0c3d68961746950f442f7d87bee7c6b31c4fb697f685b0db3aa5277b0e6b430e6adabfbab4d9837
7
+ data.tar.gz: '094e9624ee3213c17dc554e263dc79538c5c09d2db4868d0f1aaa827db8559e60e46728c171364db364d2ff323f6100e0b2edaeea5746a4f59a73cbc51b16832'
@@ -144,7 +144,7 @@ module Workarea
144
144
  .where(releasable_type: ProductRule.name)
145
145
  .any_in(releasable_id: category.product_rules.map(&:id))
146
146
  .includes(:release)
147
- .to_a
147
+ .select(&:release)
148
148
  end
149
149
  end
150
150
  end
@@ -0,0 +1,37 @@
1
+ module Workarea
2
+ class IndexReleaseSchedulePreviews
3
+ attr_reader :release, :starts_at, :ends_at
4
+
5
+ def initialize(release: nil, starts_at: nil, ends_at: nil)
6
+ @release = release
7
+ @starts_at = starts_at
8
+ @ends_at = ends_at
9
+ end
10
+
11
+ def affected_releases
12
+ result = Release
13
+ .scheduled(after: starts_at, before: ends_at)
14
+ .includes(:changesets)
15
+ .to_a
16
+
17
+ result << release if release.present?
18
+ result.uniq
19
+ end
20
+
21
+ def affected_models
22
+ affected_releases.flat_map(&:changesets).flat_map(&:releasable).compact
23
+ end
24
+
25
+ def perform
26
+ affected_releases.each do |release|
27
+ affected_models.each do |releasable|
28
+ Search::Storefront.new(releasable.in_release(release)).destroy
29
+
30
+ # Different models have different indexing workers, running callbacks
31
+ # ensures the appropriate worker is triggered
32
+ releasable.run_callbacks(:save_release_changes)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,32 @@
1
+ module Workarea
2
+ class IndexReleaseScheduleChange
3
+ include Sidekiq::Worker
4
+ include Sidekiq::CallbacksWorker
5
+
6
+ sidekiq_options(
7
+ enqueue_on: {
8
+ Release => [:save, :destroy],
9
+ only_if: -> { publish_at_changed? || destroyed? },
10
+ with: -> { [id, publish_at_was, publish_at] }
11
+ },
12
+ queue: 'releases'
13
+ )
14
+
15
+ def perform(id, previous_publish_at, new_publish_at)
16
+ # When destroyed, changesets for the release ID will still exist and be used to update the index
17
+ rescheduled_release = Release.find_or_initialize_by(id: id)
18
+
19
+ earlier, later = if rescheduled_release.persisted? && previous_publish_at.present? && new_publish_at.present?
20
+ [previous_publish_at, new_publish_at].sort
21
+ elsif previous_publish_at.present?
22
+ [previous_publish_at, nil]
23
+ else
24
+ [new_publish_at, nil]
25
+ end
26
+
27
+ IndexReleaseSchedulePreviews
28
+ .new(release: rescheduled_release, starts_at: earlier, ends_at: later)
29
+ .perform
30
+ end
31
+ end
32
+ end
@@ -8,6 +8,7 @@ module Workarea
8
8
  system_user = User.find_system_user!(release.name, 'Release')
9
9
 
10
10
  Mongoid::AuditLog.record(system_user) { release.publish! }
11
+ IndexReleaseSchedulePreviews.new(release: release).perform
11
12
 
12
13
  rescue Mongoid::Errors::DocumentNotFound
13
14
  # Doesn't matter, release has been removed
@@ -2,7 +2,7 @@ module Workarea
2
2
  module VERSION
3
3
  MAJOR = 3
4
4
  MINOR = 5
5
- PATCH = 13
5
+ PATCH = 14
6
6
  PRE = nil
7
7
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
8
8
 
@@ -75,6 +75,17 @@ module Workarea
75
75
  assert_equal([@category.id.to_s], CategoryQuery.find_by_product(@product))
76
76
  end
77
77
  end
78
+
79
+ def test_deleted_releases
80
+ release = create_release
81
+ release.as_current do
82
+ @category.product_rules.first.update!(value: 'bar')
83
+ end
84
+
85
+ release.destroy
86
+ CategoryQuery.new(@category).update
87
+ assert_equal([@category.id.to_s], CategoryQuery.find_by_product(@product))
88
+ end
78
89
  end
79
90
  end
80
91
  end
@@ -0,0 +1,28 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class IndexReleaseSchedulePreviewsTest < TestCase
5
+ def test_affected_releases
6
+ release = create_release
7
+ results = IndexReleaseSchedulePreviews.new(release: release).affected_releases
8
+ assert_equal([release], results)
9
+
10
+ a = create_release(publish_at: 1.week.from_now)
11
+ b = create_release(publish_at: 2.weeks.from_now)
12
+ c = create_release(publish_at: 4.weeks.from_now)
13
+ assert_equal([a, b, c], IndexReleaseSchedulePreviews.new.affected_releases)
14
+
15
+ results = IndexReleaseSchedulePreviews
16
+ .new(starts_at: 3.days.from_now, ends_at: 17.days.from_now)
17
+ .affected_releases
18
+
19
+ assert_equal([a, b], results)
20
+
21
+ results = IndexReleaseSchedulePreviews
22
+ .new(release: release, starts_at: 3.days.from_now, ends_at: 10.days.from_now)
23
+ .affected_releases
24
+
25
+ assert_equal([a, release], results)
26
+ end
27
+ end
28
+ end
@@ -1,7 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  module Workarea
4
- class ReindexReleaseTest < TestCase
4
+ class IndexReleaseScheduleChangeTest < TestCase
5
5
  include TestCase::SearchIndexing
6
6
 
7
7
  setup :set_product
@@ -26,7 +26,9 @@ module Workarea
26
26
  previous_publish_at = b.publish_at
27
27
  b.set(publish_at: 5.weeks.from_now)
28
28
 
29
- Sidekiq::Callbacks.enable(IndexProduct) { ReindexRelease.new.perform(b.id, previous_publish_at, b.publish_at) }
29
+ Sidekiq::Callbacks.enable(IndexProduct) do
30
+ IndexReleaseScheduleChange.new.perform(b.id, previous_publish_at, b.publish_at)
31
+ end
30
32
 
31
33
  a.as_current { assert_empty(Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
32
34
  b.as_current { assert_equal([@product], Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
@@ -49,7 +51,9 @@ module Workarea
49
51
  previous_publish_at = b.publish_at
50
52
  b.set(publish_at: nil)
51
53
 
52
- Sidekiq::Callbacks.enable(IndexProduct) { ReindexRelease.new.perform(b.id, previous_publish_at, nil) }
54
+ Sidekiq::Callbacks.enable(IndexProduct) do
55
+ IndexReleaseScheduleChange.new.perform(b.id, previous_publish_at, nil)
56
+ end
53
57
 
54
58
  a.as_current { assert_empty(Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
55
59
  b.as_current { assert_equal([@product], Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
@@ -71,11 +75,33 @@ module Workarea
71
75
  # Changing publish_at via `update` causes the release to publish due to Sidekiq inline
72
76
  b.set(publish_at: 2.weeks.from_now)
73
77
 
74
- Sidekiq::Callbacks.enable(IndexProduct) { ReindexRelease.new.perform(b.id, nil, b.publish_at) }
78
+ Sidekiq::Callbacks.enable(IndexProduct) do
79
+ IndexReleaseScheduleChange.new.perform(b.id, nil, b.publish_at)
80
+ end
75
81
 
76
82
  a.as_current { assert_empty(Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
77
83
  b.as_current { assert_equal([@product], Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
78
84
  c.as_current { assert_equal([@product], Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
79
85
  end
86
+
87
+ def test_destroyed
88
+ a = create_release(name: 'A', publish_at: 1.week.from_now)
89
+ b = create_release(name: 'B', publish_at: 2.weeks.from_now)
90
+ c = create_release(name: 'C', publish_at: 4.weeks.from_now)
91
+
92
+ b.as_current { @product.update!(name: 'Bar') }
93
+ IndexProduct.perform(@product)
94
+
95
+ a.as_current { assert_empty(Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
96
+ b.as_current { assert_equal([@product], Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
97
+ c.as_current { assert_equal([@product], Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
98
+
99
+ Sidekiq::Callbacks.enable(IndexReleaseScheduleChange, IndexProduct) do
100
+ b.destroy
101
+ end
102
+
103
+ a.as_current { assert_empty(Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
104
+ c.as_current { assert_empty(Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
105
+ end
80
106
  end
81
107
  end
@@ -2,6 +2,8 @@ require 'test_helper'
2
2
 
3
3
  module Workarea
4
4
  class PublishReleaseTest < TestCase
5
+ include TestCase::SearchIndexing
6
+
5
7
  def test_publishes_the_release
6
8
  release = create_release
7
9
  PublishRelease.new.perform(release.id)
@@ -16,5 +18,27 @@ module Workarea
16
18
  assert_equal(1, Mongoid::AuditLog::Entry.count)
17
19
  assert(Mongoid::AuditLog::Entry.first.modifier.system?)
18
20
  end
21
+
22
+ def test_reindexes_release_schedule
23
+ product = create_product(name: 'Foo')
24
+
25
+ a = create_release(publish_at: 1.week.from_now)
26
+ b = create_release(publish_at: 2.weeks.from_now)
27
+ c = create_release(publish_at: 4.weeks.from_now)
28
+
29
+ b.as_current { product.update!(name: 'Bar') }
30
+ IndexProduct.perform(product)
31
+
32
+ assert_empty(Search::ProductSearch.new(q: 'bar').results.pluck(:model))
33
+ a.as_current { assert_empty(Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
34
+ b.as_current { assert_equal([product], Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
35
+ c.as_current { assert_equal([product], Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
36
+
37
+ Sidekiq::Callbacks.enable(IndexProduct) { PublishRelease.new.perform(b.id) }
38
+
39
+ assert_equal([product], Search::ProductSearch.new(q: 'bar').results.pluck(:model))
40
+ a.as_current { assert_equal([product], Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
41
+ c.as_current { assert_equal([product], Search::ProductSearch.new(q: 'bar').results.pluck(:model)) }
42
+ end
19
43
  end
20
44
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workarea-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.13
4
+ version: 3.5.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Crouse
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-11 00:00:00.000000000 Z
11
+ date: 2020-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -1734,6 +1734,7 @@ files:
1734
1734
  - app/services/workarea/direct_upload/product_image.rb
1735
1735
  - app/services/workarea/export_report.rb
1736
1736
  - app/services/workarea/hash_update.rb
1737
+ - app/services/workarea/index_release_schedule_previews.rb
1737
1738
  - app/services/workarea/inventory_adjustment.rb
1738
1739
  - app/services/workarea/login.rb
1739
1740
  - app/services/workarea/new_discount.rb
@@ -1771,6 +1772,7 @@ files:
1771
1772
  - app/workers/workarea/index_product.rb
1772
1773
  - app/workers/workarea/index_product_children.rb
1773
1774
  - app/workers/workarea/index_product_rule.rb
1775
+ - app/workers/workarea/index_release_schedule_change.rb
1774
1776
  - app/workers/workarea/index_search_customizations.rb
1775
1777
  - app/workers/workarea/index_skus.rb
1776
1778
  - app/workers/workarea/keep_product_index_fresh.rb
@@ -1785,7 +1787,6 @@ files:
1785
1787
  - app/workers/workarea/publish_bulk_action.rb
1786
1788
  - app/workers/workarea/publish_release.rb
1787
1789
  - app/workers/workarea/redirect_navigable_slugs.rb
1788
- - app/workers/workarea/reindex_release.rb
1789
1790
  - app/workers/workarea/save_metrics.rb
1790
1791
  - app/workers/workarea/save_order_cancellation_metrics.rb
1791
1792
  - app/workers/workarea/save_order_metrics.rb
@@ -2442,6 +2443,7 @@ files:
2442
2443
  - test/services/workarea/direct_upload_test.rb
2443
2444
  - test/services/workarea/export_report_test.rb
2444
2445
  - test/services/workarea/hash_update_test.rb
2446
+ - test/services/workarea/index_release_schedule_previews_test.rb
2445
2447
  - test/services/workarea/inventory_adjustment_test.rb
2446
2448
  - test/services/workarea/login_test.rb
2447
2449
  - test/services/workarea/order_merge_test.rb
@@ -2474,6 +2476,7 @@ files:
2474
2476
  - test/workers/workarea/index_payment_transactions_test.rb
2475
2477
  - test/workers/workarea/index_product_rule_test.rb
2476
2478
  - test/workers/workarea/index_product_test.rb
2479
+ - test/workers/workarea/index_release_schedule_change_test.rb
2477
2480
  - test/workers/workarea/index_skus_test.rb
2478
2481
  - test/workers/workarea/keep_product_index_fresh_test.rb
2479
2482
  - test/workers/workarea/mark_discounts_as_redeemed_test.rb
@@ -2484,7 +2487,6 @@ files:
2484
2487
  - test/workers/workarea/publish_bulk_action_test.rb
2485
2488
  - test/workers/workarea/publish_release_test.rb
2486
2489
  - test/workers/workarea/redirect_navigable_slugs_test.rb
2487
- - test/workers/workarea/reindex_release_test.rb
2488
2490
  - test/workers/workarea/save_order_metrics_test.rb
2489
2491
  - test/workers/workarea/save_user_order_details_test.rb
2490
2492
  - test/workers/workarea/send_refund_email_test.rb
@@ -1,42 +0,0 @@
1
- module Workarea
2
- class ReindexRelease
3
- include Sidekiq::Worker
4
- include Sidekiq::CallbacksWorker
5
-
6
- sidekiq_options(
7
- enqueue_on: {
8
- Release => :save,
9
- only_if: -> { publish_at_changed? },
10
- with: -> { [id, publish_at_was, publish_at] }
11
- },
12
- queue: 'high'
13
- )
14
-
15
- def perform(id, previous_publish_at, new_publish_at)
16
- rescheduled_release = Release.find(id)
17
- earlier, later = if previous_publish_at.present? && new_publish_at.present?
18
- [previous_publish_at, new_publish_at].sort
19
- elsif previous_publish_at.present?
20
- [previous_publish_at, nil]
21
- else
22
- [new_publish_at, nil]
23
- end
24
-
25
- affected_releases = Release.scheduled(after: earlier, before: later).includes(:changesets).to_a
26
- affected_releases += [rescheduled_release]
27
- affected_releases.uniq!
28
-
29
- affected_models = affected_releases.flat_map(&:changesets).flat_map(&:releasable)
30
-
31
- affected_releases.each do |release|
32
- affected_models.each do |releasable|
33
- Search::Storefront.new(releasable.in_release(release)).destroy
34
-
35
- # Different models have different indexing workers, running callbacks
36
- # ensures the appropriate worker is triggered
37
- releasable.run_callbacks(:save_release_changes)
38
- end
39
- end
40
- end
41
- end
42
- end