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 +4 -4
- data/app/models/workarea/search/storefront/category_query.rb +1 -1
- data/app/services/workarea/index_release_schedule_previews.rb +37 -0
- data/app/workers/workarea/index_release_schedule_change.rb +32 -0
- data/app/workers/workarea/publish_release.rb +1 -0
- data/lib/workarea/version.rb +1 -1
- data/test/models/workarea/search/storefront/category_query_test.rb +11 -0
- data/test/services/workarea/index_release_schedule_previews_test.rb +28 -0
- data/test/workers/workarea/{reindex_release_test.rb → index_release_schedule_change_test.rb} +30 -4
- data/test/workers/workarea/publish_release_test.rb +24 -0
- metadata +6 -4
- data/app/workers/workarea/reindex_release.rb +0 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 32f457800d2f9e59fb315b3bdedde57f90d04ea6befdd4cf04dc5b4c78838eaf
|
4
|
+
data.tar.gz: 564f64759f19ea4d0db9b1ea4b7a2c12cdebf629ea2f52b5916519a3c958d611
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ae82b803bfe0daffc1e54953aa54f0c3a045cbe83fbb7b2e0c3d68961746950f442f7d87bee7c6b31c4fb697f685b0db3aa5277b0e6b430e6adabfbab4d9837
|
7
|
+
data.tar.gz: '094e9624ee3213c17dc554e263dc79538c5c09d2db4868d0f1aaa827db8559e60e46728c171364db364d2ff323f6100e0b2edaeea5746a4f59a73cbc51b16832'
|
@@ -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
|
data/lib/workarea/version.rb
CHANGED
@@ -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
|
data/test/workers/workarea/{reindex_release_test.rb → index_release_schedule_change_test.rb}
RENAMED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
module Workarea
|
4
|
-
class
|
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)
|
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)
|
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)
|
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.
|
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
|
+
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
|