workarea-core 3.5.13 → 3.5.14

Sign up to get free protection for your applications and to get access to all the features.
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