spree_cm_commissioner 2.8.7.pre.pre2 → 2.8.8
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/.gitignore +0 -6
- data/Gemfile.lock +1 -1
- data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +0 -2
- data/app/controllers/spree/admin/homepage_section_controller.rb +1 -4
- data/app/controllers/spree/admin/taxons_controller_decorator.rb +0 -19
- data/app/controllers/spree/api/v2/storefront/homepage_sections_controller.rb +0 -1
- data/app/controllers/spree/api/v2/tenant/base_controller.rb +0 -4
- data/app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb +0 -1
- data/app/controllers/spree/api/v2/tenant/products_controller.rb +1 -1
- data/app/controllers/spree/api/v2/tenant/taxons_controller.rb +1 -1
- data/app/controllers/spree_cm_commissioner/admin/products_controller_decorator.rb +0 -19
- data/app/finders/spree_cm_commissioner/events/find_matches.rb +0 -1
- data/app/helpers/spree_cm_commissioner/admin/homepage_segment_helper.rb +0 -2
- data/app/interactors/spree_cm_commissioner/waiting_guests_caller.rb +39 -10
- data/app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb +1 -2
- data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +1 -2
- data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +1 -11
- data/app/models/concerns/spree_cm_commissioner/product_type.rb +1 -1
- data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -3
- data/app/models/spree_cm_commissioner/import.rb +1 -2
- data/app/models/spree_cm_commissioner/product_decorator.rb +0 -52
- data/app/models/spree_cm_commissioner/role_decorator.rb +1 -4
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +0 -23
- data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +1 -19
- data/app/models/spree_cm_commissioner/tenant.rb +0 -9
- data/app/models/spree_cm_commissioner/user_decorator.rb +0 -5
- data/app/models/spree_cm_commissioner/variant_decorator.rb +0 -4
- data/app/models/spree_cm_commissioner/variant_options.rb +0 -4
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +0 -4
- data/app/serializers/spree/v2/storefront/homepage_section_serializer.rb +1 -1
- data/app/serializers/spree/v2/storefront/product_serializer_decorator.rb +1 -2
- data/app/serializers/spree/v2/storefront/role_serializer.rb +1 -1
- data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +1 -2
- data/app/serializers/spree/v2/tenant/homepage_section_serializer.rb +1 -1
- data/app/serializers/spree/v2/tenant/role_serializer.rb +1 -1
- data/app/services/spree_cm_commissioner/api_caches/invalidate.rb +0 -12
- data/app/services/spree_cm_commissioner/waiting_room/publish_lobby_path.rb +11 -2
- data/app/services/spree_cm_commissioner/waiting_room/stamp_queue_positions.rb +37 -8
- data/app/views/spree/admin/homepage_section/_form.html.erb +0 -5
- data/config/initializers/spree_permitted_attributes.rb +0 -8
- data/config/locales/en.yml +3 -45
- data/config/locales/km.yml +1 -32
- data/config/routes.rb +0 -28
- data/lib/spree_cm_commissioner/version.rb +1 -1
- data/lib/spree_cm_commissioner.rb +1 -7
- data/spree_cm_commissioner.gemspec +1 -1
- metadata +3 -130
- data/app/controllers/spree/api/v2/storefront/preview_products_controller.rb +0 -48
- data/app/controllers/spree/api/v2/storefront/preview_sections_controller.rb +0 -27
- data/app/controllers/spree/api/v2/storefront/preview_taxons_controller.rb +0 -18
- data/app/controllers/spree/api/v2/storefront/products_controller_decorator.rb +0 -15
- data/app/controllers/spree/api/v2/storefront/taxons_controller_decorator.rb +0 -15
- data/app/controllers/spree/api/v2/tenant/ad_campaigns_controller.rb +0 -25
- data/app/controllers/spree/api/v2/tenant/episodes_controller.rb +0 -38
- data/app/controllers/spree/api/v2/tenant/free_vote_claims_controller.rb +0 -37
- data/app/controllers/spree/api/v2/tenant/preview_products_controller.rb +0 -47
- data/app/controllers/spree/api/v2/tenant/preview_sections_controller.rb +0 -26
- data/app/controllers/spree/api/v2/tenant/preview_shows_controller.rb +0 -19
- data/app/controllers/spree/api/v2/tenant/preview_taxons_controller.rb +0 -19
- data/app/controllers/spree/api/v2/tenant/show_contestants_controller.rb +0 -52
- data/app/controllers/spree/api/v2/tenant/show_elimination_sessions_controller.rb +0 -57
- data/app/controllers/spree/api/v2/tenant/show_people_controller.rb +0 -49
- data/app/controllers/spree/api/v2/tenant/show_person_assignments_controller.rb +0 -36
- data/app/controllers/spree/api/v2/tenant/shows_controller.rb +0 -36
- data/app/controllers/spree/api/v2/tenant/votes_controller.rb +0 -94
- data/app/controllers/spree/api/v2/tenant/voting_contestants_controller.rb +0 -43
- data/app/controllers/spree/api/v2/tenant/voting_credit_transactions_controller.rb +0 -41
- data/app/controllers/spree/api/v2/tenant/voting_credits_controller.rb +0 -31
- data/app/jobs/spree_cm_commissioner/show_contestants/import_job.rb +0 -9
- data/app/jobs/spree_cm_commissioner/vote_fraud_event_job.rb +0 -9
- data/app/jobs/spree_cm_commissioner/voting_credit_allocation_job.rb +0 -10
- data/app/jobs/spree_cm_commissioner/voting_credit_de_allocation_job.rb +0 -10
- data/app/models/concerns/spree_cm_commissioner/voting_session_live_stream_concern.rb +0 -41
- data/app/models/spree_cm_commissioner/imports/import_contestant.rb +0 -7
- data/app/models/spree_cm_commissioner/maintenance_tasks/voting_session.rb +0 -36
- data/app/models/spree_cm_commissioner/preview_role.rb +0 -8
- data/app/models/spree_cm_commissioner/role_user_decorator.rb +0 -8
- data/app/models/spree_cm_commissioner/show.rb +0 -163
- data/app/models/spree_cm_commissioner/show_contestant.rb +0 -39
- data/app/models/spree_cm_commissioner/show_contestant_image.rb +0 -11
- data/app/models/spree_cm_commissioner/show_contestant_video.rb +0 -15
- data/app/models/spree_cm_commissioner/show_episode.rb +0 -108
- data/app/models/spree_cm_commissioner/show_person.rb +0 -15
- data/app/models/spree_cm_commissioner/show_person_assignment.rb +0 -21
- data/app/models/spree_cm_commissioner/show_person_image.rb +0 -11
- data/app/models/spree_cm_commissioner/vote.rb +0 -16
- data/app/models/spree_cm_commissioner/vote_fraud_event.rb +0 -20
- data/app/models/spree_cm_commissioner/voting_contestant.rb +0 -100
- data/app/models/spree_cm_commissioner/voting_credit.rb +0 -72
- data/app/models/spree_cm_commissioner/voting_credit_transaction.rb +0 -55
- data/app/models/spree_cm_commissioner/voting_session.rb +0 -216
- data/app/models/spree_cm_commissioner/voting_session_stat.rb +0 -8
- data/app/overrides/spree/admin/products/_form/preview_checkbox.html.erb.deface +0 -9
- data/app/overrides/spree/admin/taxons/_form/preview_checkbox.html.erb.deface +0 -7
- data/app/serializers/spree/v2/tenant/ad_campaign_serializer.rb +0 -13
- data/app/serializers/spree/v2/tenant/advertisement_serializer.rb +0 -11
- data/app/serializers/spree/v2/tenant/show_contestant_serializer.rb +0 -21
- data/app/serializers/spree/v2/tenant/show_episode_serializer.rb +0 -20
- data/app/serializers/spree/v2/tenant/show_parent_serializer.rb +0 -13
- data/app/serializers/spree/v2/tenant/show_person_assignment_serializer.rb +0 -16
- data/app/serializers/spree/v2/tenant/show_person_serializer.rb +0 -13
- data/app/serializers/spree/v2/tenant/show_serializer.rb +0 -23
- data/app/serializers/spree/v2/tenant/video_serializer.rb +0 -9
- data/app/serializers/spree/v2/tenant/vote_package_serializer.rb +0 -9
- data/app/serializers/spree/v2/tenant/vote_serializer.rb +0 -14
- data/app/serializers/spree/v2/tenant/voting_contestant_serializer.rb +0 -23
- data/app/serializers/spree/v2/tenant/voting_credit_serializer.rb +0 -10
- data/app/serializers/spree/v2/tenant/voting_credit_transaction_serializer.rb +0 -14
- data/app/serializers/spree/v2/tenant/voting_session_serializer.rb +0 -21
- data/app/services/spree_cm_commissioner/fraud_check.rb +0 -299
- data/app/services/spree_cm_commissioner/imports/contestants/create.rb +0 -153
- data/app/services/spree_cm_commissioner/show_contestants/normalize_video_highlights.rb +0 -57
- data/app/services/spree_cm_commissioner/show_persons/contestant_assigner.rb +0 -51
- data/app/services/spree_cm_commissioner/url_embed/youtube_embed.rb +0 -44
- data/app/services/spree_cm_commissioner/vote_counters/audit_counters.rb +0 -43
- data/app/services/spree_cm_commissioner/vote_counters/base.rb +0 -31
- data/app/services/spree_cm_commissioner/vote_counters/increment.rb +0 -44
- data/app/services/spree_cm_commissioner/vote_counters/per_contestant_counter.rb +0 -68
- data/app/services/spree_cm_commissioner/vote_counters/rebuild_from_db.rb +0 -70
- data/app/services/spree_cm_commissioner/vote_counters/snapshot_to_db.rb +0 -113
- data/app/services/spree_cm_commissioner/vote_credit_deductor.rb +0 -68
- data/app/services/spree_cm_commissioner/vote_package/create.rb +0 -145
- data/app/services/spree_cm_commissioner/vote_package/update.rb +0 -91
- data/app/services/spree_cm_commissioner/vote_processor.rb +0 -144
- data/app/services/spree_cm_commissioner/voting_contestants/advancer.rb +0 -335
- data/app/services/spree_cm_commissioner/voting_contestants/assigner.rb +0 -40
- data/app/services/spree_cm_commissioner/voting_contestants/bulk_updater.rb +0 -106
- data/app/services/spree_cm_commissioner/voting_credits/allocate.rb +0 -77
- data/app/services/spree_cm_commissioner/voting_credits/claim_free_votes.rb +0 -119
- data/app/services/spree_cm_commissioner/voting_credits/credit_calculator.rb +0 -35
- data/app/services/spree_cm_commissioner/voting_credits/de_allocate.rb +0 -87
- data/app/services/spree_cm_commissioner/voting_leaderboards/calculate_score.rb +0 -67
- data/app/services/spree_cm_commissioner/voting_leaderboards/combined_result.rb +0 -190
- data/app/services/spree_cm_commissioner/voting_sessions/finalize.rb +0 -105
- data/db/migrate/20260309230148_create_cm_show_people.rb +0 -14
- data/db/migrate/20260309230149_create_cm_show_people_assignments.rb +0 -16
- data/db/migrate/20260310082711_create_cm_show_contestants.rb +0 -28
- data/db/migrate/20260310082720_create_cm_voting_sessions.rb +0 -21
- data/db/migrate/20260310082721_create_cm_voting_contestants.rb +0 -23
- data/db/migrate/20260310082734_add_voting_fields_to_spree_taxons.rb +0 -9
- data/db/migrate/20260310082735_add_type_to_spree_products.rb +0 -6
- data/db/migrate/20260310082749_create_cm_voting_credits.rb +0 -27
- data/db/migrate/20260326080200_create_cm_voting_credit_transactions.rb +0 -27
- data/db/migrate/20260330160000_create_cm_votes.rb +0 -25
- data/db/migrate/20260401072500_add_advanced_from_to_cm_voting_contestants.rb +0 -7
- data/db/migrate/20260402000001_add_voting_credit_scope_to_spree_taxons.rb +0 -6
- data/db/migrate/20260402000002_rename_scopeable_to_votable_in_cm_voting_credits.rb +0 -12
- data/db/migrate/20260403070000_add_name_to_cm_voting_sessions.rb +0 -5
- data/db/migrate/20260406000001_add_vendor_id_to_voting_tables.rb +0 -6
- data/db/migrate/20260406000001_rename_votes_remaining_to_amount_in_cm_voting_credits.rb +0 -11
- data/db/migrate/20260408085255_add_show_id_and_vendor_id_to_cm_voting_sessions.rb +0 -9
- data/db/migrate/20260420000001_rename_type_to_credit_type_in_cm_voting_credits.rb +0 -25
- data/db/migrate/20260422000001_create_cm_vote_fraud_events.rb +0 -23
- data/db/migrate/20260423000001_add_preview_to_taxons_products_and_sections.rb +0 -11
- data/db/migrate/20260423000002_create_preview_roles.rb +0 -24
- data/db/migrate/20260515120000_add_public_metadata_to_cm_voting_sessions.rb +0 -5
- data/db/migrate/20260518090920_add_unique_voter_count_to_voting_contestants.rb +0 -5
- data/db/migrate/20260518094322_create_cm_voting_session_stats.rb +0 -17
- data/db/migrate/20260520000001_add_scoring_model_to_cm_voting_sessions.rb +0 -5
- data/db/migrate/20260520000001_optimize_cm_votes_indexes.rb +0 -22
- data/db/migrate/20260525042257_add_vote_number_to_cm_voting_contestants.rb +0 -18
- data/db/migrate/20260527035430_add_confirmed_rank_to_cm_voting_contestants.rb +0 -5
- data/db/migrate/20260527062005_add_eliminated_at_to_cm_show_contestants.rb +0 -5
- data/db/migrate/20260603063652_add_parent_to_voting_sessions.rb +0 -9
- data/db/migrate/20260603090000_add_session_type_to_cm_voting_sessions.rb +0 -6
- data/db/migrate/20260608000000_add_display_to_cm_voting_sessions.rb +0 -5
- data/docs/sql/jsonb_query_guide.md +0 -57
- data/lib/spree_cm_commissioner/test_helper/factories/show_episode_factory.rb +0 -12
- data/lib/spree_cm_commissioner/test_helper/factories/show_factory.rb +0 -120
- data/lib/spree_cm_commissioner/test_helper/factories/vote_credit_factory.rb +0 -37
- data/lib/spree_cm_commissioner/test_helper/factories/vote_factory.rb +0 -28
- data/lib/spree_cm_commissioner/test_helper/factories/voting_credit_transaction_factory.rb +0 -11
- data/lib/spree_cm_commissioner/test_helper/factories/voting_session_factory.rb +0 -11
|
@@ -14,8 +14,7 @@ module Spree
|
|
|
14
14
|
|
|
15
15
|
base.attributes :need_confirmation, :product_type, :kyc, :kyc_fields, :allowed_upload_later, :allow_anonymous_booking,
|
|
16
16
|
:use_video_as_default, :allow_transfer, :allow_gift_transfer
|
|
17
|
-
|
|
18
|
-
base.attributes :reveal_description, :discontinue_on, :public_metadata, :purchasable_on, :preview,
|
|
17
|
+
base.attributes :reveal_description, :discontinue_on, :public_metadata, :purchasable_on,
|
|
19
18
|
:enable_inventory_hold
|
|
20
19
|
|
|
21
20
|
# Expose only the `event_id` here instead of the full event object.
|
|
@@ -17,8 +17,7 @@ module Spree
|
|
|
17
17
|
|
|
18
18
|
base.attributes :custom_redirect_url, :kind, :subtitle, :from_date, :to_date,
|
|
19
19
|
:background_color, :foreground_color, :show_badge_status,
|
|
20
|
-
:purchasable_on, :vendor_id, :available_on, :hide_video_banner
|
|
21
|
-
:preview
|
|
20
|
+
:purchasable_on, :vendor_id, :available_on, :hide_video_banner
|
|
22
21
|
|
|
23
22
|
# To get full seat layout details, call the seat_layouts API with this ID.
|
|
24
23
|
base.attribute :seat_layout_ids, &:preload_seat_layout_ids
|
|
@@ -3,7 +3,7 @@ module Spree
|
|
|
3
3
|
module Tenant
|
|
4
4
|
class HomepageSectionSerializer < BaseSerializer
|
|
5
5
|
attributes :id, :title, :segments, :description,
|
|
6
|
-
:active, :position, :
|
|
6
|
+
:active, :position, :created_at, :updated_at
|
|
7
7
|
|
|
8
8
|
has_many :homepage_section_relatables, serializer: ::Spree::V2::Tenant::HomepageSectionRelatableSerializer
|
|
9
9
|
end
|
|
@@ -66,19 +66,12 @@ module SpreeCmCommissioner
|
|
|
66
66
|
'/api/v2/storefront/homepage_data*'
|
|
67
67
|
],
|
|
68
68
|
'Spree::Taxon' => ['/api/v2/storefront/taxons/:id*'],
|
|
69
|
-
'SpreeCmCommissioner::Show' => ['/api/v2/storefront/taxons/:id*'],
|
|
70
69
|
'Spree::Product' => [
|
|
71
70
|
'/api/v2/tenant/products/:id*',
|
|
72
71
|
'/api/v2/tenant/products/:slug*',
|
|
73
72
|
'/api/v2/storefront/products/:id*',
|
|
74
73
|
'/api/v2/storefront/products/:slug*'
|
|
75
74
|
],
|
|
76
|
-
'SpreeCmCommissioner::ShowEpisode' => [
|
|
77
|
-
'/api/v2/tenant/products/:id*',
|
|
78
|
-
'/api/v2/tenant/products/:slug*',
|
|
79
|
-
'/api/v2/storefront/products/:id*',
|
|
80
|
-
'/api/v2/storefront/products/:slug*'
|
|
81
|
-
],
|
|
82
75
|
'Spree::Vendor' => [
|
|
83
76
|
'/api/v2/tenant/vendors/:id*',
|
|
84
77
|
'/api/v2/storefront/vendors/:id*',
|
|
@@ -94,15 +87,10 @@ module SpreeCmCommissioner
|
|
|
94
87
|
'SpreeCmCommissioner::HomepageBackground' => homepage_background_patterns,
|
|
95
88
|
'Spree::Menu' => ['/api/v2/storefront/menus/*'],
|
|
96
89
|
'Spree::Taxon' => ['/api/v2/storefront/taxons/*'],
|
|
97
|
-
'SpreeCmCommissioner::Show' => ['/api/v2/storefront/taxons/*'],
|
|
98
90
|
'Spree::Product' => [
|
|
99
91
|
'/api/v2/tenant/products/*',
|
|
100
92
|
'/api/v2/storefront/products/*'
|
|
101
93
|
],
|
|
102
|
-
'SpreeCmCommissioner::ShowEpisode' => [
|
|
103
|
-
'/api/v2/tenant/products/*',
|
|
104
|
-
'/api/v2/storefront/products/*'
|
|
105
|
-
],
|
|
106
94
|
'Spree::Vendor' => [
|
|
107
95
|
'/api/v2/tenant/vendors/*',
|
|
108
96
|
'/api/v2/storefront/vendors/*',
|
|
@@ -17,8 +17,17 @@ module SpreeCmCommissioner
|
|
|
17
17
|
extend SpreeCmCommissioner::ServiceModuleThrowable
|
|
18
18
|
|
|
19
19
|
def call
|
|
20
|
-
# merge: true so we never clobber the lobby's `full` / `available_slots` fields
|
|
21
|
-
|
|
20
|
+
# merge: true so we never clobber the lobby's `full` / `available_slots` fields, and it
|
|
21
|
+
# deep-merges the nested `logs` map so each job keeps its own namespaced key.
|
|
22
|
+
# logs.publish_lobby_path_job.last_published_at is a point-in-time heartbeat: it confirms
|
|
23
|
+
# the 5-min publisher cron is alive and (with the path above) shows the date partition.
|
|
24
|
+
lobby_document.set(
|
|
25
|
+
{
|
|
26
|
+
waiting_guests_records_path: records_path,
|
|
27
|
+
logs: { publish_lobby_path_job: { last_published_at: Time.zone.now } }
|
|
28
|
+
},
|
|
29
|
+
merge: true
|
|
30
|
+
)
|
|
22
31
|
|
|
23
32
|
success(records_path: records_path)
|
|
24
33
|
rescue StandardError => e
|
|
@@ -23,7 +23,7 @@ module SpreeCmCommissioner
|
|
|
23
23
|
CALLER_INTERVAL_SECONDS = (ENV['WAITING_ROOM_CALLER_INTERVAL_SECONDS'] || 60).to_i
|
|
24
24
|
|
|
25
25
|
# Caps the batch size assumed when estimating the ETA (not a release limit). The lobby's
|
|
26
|
-
#
|
|
26
|
+
# recent_slots_per_call is a single run's available_slots, which spikes on cold starts / lulls
|
|
27
27
|
# (active_sessions low → available_slots ≈ max_sessions). An uncapped spike collapses hundreds
|
|
28
28
|
# of positions into batch 1 and under-promises the wait, so we bound it to keep ETAs
|
|
29
29
|
# conservative. Tune to roughly the real per-minute release capacity.
|
|
@@ -39,11 +39,11 @@ module SpreeCmCommissioner
|
|
|
39
39
|
private
|
|
40
40
|
|
|
41
41
|
def stamp_positions
|
|
42
|
+
started_at = Time.zone.now
|
|
42
43
|
paths = stamp_paths
|
|
43
44
|
total = paths.sum { |path| waiting_count(path) }
|
|
44
|
-
return if total.zero?
|
|
45
45
|
|
|
46
|
-
@
|
|
46
|
+
@recent_slots_per_call = lobby_data[:recent_slots_per_call].to_i
|
|
47
47
|
@flat_wait = lobby_data[:avg_queue_to_enter_seconds].to_i
|
|
48
48
|
@stamped_at = Time.zone.now
|
|
49
49
|
@stamped = 0
|
|
@@ -60,6 +60,31 @@ module SpreeCmCommissioner
|
|
|
60
60
|
firestore.batch { |batch| slice.each { |doc| stamp_doc(batch, doc) } }
|
|
61
61
|
end
|
|
62
62
|
end
|
|
63
|
+
|
|
64
|
+
publish_logs(started_at: started_at, waiting_total: total)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Point-in-time heartbeat for the position-stamper cron, mirroring the caller/publisher writers.
|
|
68
|
+
# Written every run (even when nobody is waiting) so a stale timestamp signals a dead cron rather
|
|
69
|
+
# than an empty queue. merge: true deep-merges into the shared lobby `logs` map, so this job's
|
|
70
|
+
# key sits alongside the caller's and publisher's without clobbering them.
|
|
71
|
+
def publish_logs(started_at:, waiting_total:)
|
|
72
|
+
finished_at = Time.zone.now
|
|
73
|
+
lobby_document.set(
|
|
74
|
+
{
|
|
75
|
+
logs: {
|
|
76
|
+
stamp_queue_positions_job: {
|
|
77
|
+
stamped_count: @stamped,
|
|
78
|
+
waiting_total: waiting_total,
|
|
79
|
+
stamp_limit_reached: waiting_total > STAMP_LIMIT,
|
|
80
|
+
last_started_at: started_at,
|
|
81
|
+
last_finished_at: finished_at,
|
|
82
|
+
last_duration_ms: ((finished_at - started_at) * 1000).round
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
merge: true
|
|
87
|
+
)
|
|
63
88
|
end
|
|
64
89
|
|
|
65
90
|
def stamp_doc(batch, doc)
|
|
@@ -98,16 +123,16 @@ module SpreeCmCommissioner
|
|
|
98
123
|
end
|
|
99
124
|
|
|
100
125
|
# Groups positions into batches that enter together, so everyone in a batch gets the same ETA.
|
|
101
|
-
# The batch size is
|
|
102
|
-
# from under-promising. nil when
|
|
126
|
+
# The batch size is recent_slots_per_call, capped by MAX_ETA_BATCH_SIZE to keep a spiking release rate
|
|
127
|
+
# from under-promising. nil when recent_slots_per_call is unknown (cold start) → falls back to the
|
|
103
128
|
# flat lobby average. e.g. batch size 50, 1 call/min:
|
|
104
129
|
# flat estimate: position 1 and position 50 both see ~20 min ❌
|
|
105
130
|
# batch estimate: positions 1–50 → batch 1 → ~10 min
|
|
106
131
|
# positions 51–100 → batch 2 → ~20 min ✅
|
|
107
132
|
def batch_wait(position)
|
|
108
|
-
return nil unless @
|
|
133
|
+
return nil unless @recent_slots_per_call.positive?
|
|
109
134
|
|
|
110
|
-
batch_size = [@
|
|
135
|
+
batch_size = [@recent_slots_per_call, MAX_ETA_BATCH_SIZE].min
|
|
111
136
|
batch_number = ((position - 1) / batch_size) + 1
|
|
112
137
|
[batch_number * CALLER_INTERVAL_SECONDS, min_queue_floor].max
|
|
113
138
|
end
|
|
@@ -141,7 +166,11 @@ module SpreeCmCommissioner
|
|
|
141
166
|
end
|
|
142
167
|
|
|
143
168
|
def lobby_data
|
|
144
|
-
@lobby_data ||=
|
|
169
|
+
@lobby_data ||= lobby_document.get.data || {}
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def lobby_document
|
|
173
|
+
@lobby_document ||= firestore.col('waiting_rooms').doc('lobby')
|
|
145
174
|
end
|
|
146
175
|
|
|
147
176
|
def firestore
|
|
@@ -32,11 +32,6 @@
|
|
|
32
32
|
<%= f.label :active %>
|
|
33
33
|
<%= f.check_box :active %>
|
|
34
34
|
<% end %>
|
|
35
|
-
<%= f.field_container :preview, class: ['custom-control', 'custom-checkbox', 'my-4'] do %>
|
|
36
|
-
<%= f.check_box :preview, class: 'custom-control-input' %>
|
|
37
|
-
<%= f.label :preview, 'Preview (internal team only)', class: 'custom-control-label' %>
|
|
38
|
-
<%= f.error_message_on :preview %>
|
|
39
|
-
<% end %>
|
|
40
35
|
</div>
|
|
41
36
|
</div>
|
|
42
37
|
</div>
|
|
@@ -50,10 +50,6 @@ module Spree
|
|
|
50
50
|
available_on
|
|
51
51
|
hide_video_banner
|
|
52
52
|
vendor_id
|
|
53
|
-
type
|
|
54
|
-
voting_config
|
|
55
|
-
fraud_config
|
|
56
|
-
preview
|
|
57
53
|
]
|
|
58
54
|
|
|
59
55
|
@@store_attributes += [
|
|
@@ -111,9 +107,5 @@ module Spree
|
|
|
111
107
|
route_stops
|
|
112
108
|
terms_and_conditions
|
|
113
109
|
]
|
|
114
|
-
|
|
115
|
-
@@product_attributes += %i[
|
|
116
|
-
preview
|
|
117
|
-
]
|
|
118
110
|
end
|
|
119
111
|
end
|
data/config/locales/en.yml
CHANGED
|
@@ -216,10 +216,7 @@ en:
|
|
|
216
216
|
riel: "៛"
|
|
217
217
|
|
|
218
218
|
spree:
|
|
219
|
-
|
|
220
|
-
reversion_error: "Cannot eliminate here yet. This contestant appears in a later session."
|
|
221
|
-
is_open_dated: "Is Open Dated Trip?"
|
|
222
|
-
description: "Description"
|
|
219
|
+
description: Description
|
|
223
220
|
enable_telegram_alert: Enable Telegram Alert
|
|
224
221
|
registered_by:
|
|
225
222
|
system_registered: "System Registered"
|
|
@@ -538,10 +535,6 @@ en:
|
|
|
538
535
|
attributes:
|
|
539
536
|
exception_rules:
|
|
540
537
|
invalid_json: "is not a valid format"
|
|
541
|
-
spree_cm_commissioner/show_contestant:
|
|
542
|
-
attributes:
|
|
543
|
-
video_highlights:
|
|
544
|
-
invalid_json: "is not a valid format"
|
|
545
538
|
spree_cm_commissioner/customer:
|
|
546
539
|
attributes:
|
|
547
540
|
base:
|
|
@@ -553,20 +546,6 @@ en:
|
|
|
553
546
|
attributes:
|
|
554
547
|
place_id:
|
|
555
548
|
taken: "has already existed with this place type"
|
|
556
|
-
spree_cm_commissioner/voting_session:
|
|
557
|
-
attributes:
|
|
558
|
-
closes_at:
|
|
559
|
-
must_be_after_opens_at: "must be after opens_at"
|
|
560
|
-
must_not_exceed_parent: "cannot be after parent session closes_at"
|
|
561
|
-
parent_id:
|
|
562
|
-
must_have_contestants: '"%{name}" must have contestants assigned'
|
|
563
|
-
spree_cm_commissioner/voting_contestant:
|
|
564
|
-
attributes:
|
|
565
|
-
base:
|
|
566
|
-
last_contestant_in_parent_session: 'cannot remove the last contestant from "%{session_name}" because child sessions depend on it'
|
|
567
|
-
advanced_from_session: 'was advanced from a previous session and cannot be removed directly. Clear the advancement in the source session instead.'
|
|
568
|
-
pre_vote_session: 'cannot be removed from a pre-vote session.'
|
|
569
|
-
has_advanced_to_session: 'has been assigned to advance to another session. Clear the advancement first before removing this contestant.'
|
|
570
549
|
spree_cm_commissioner/tenant:
|
|
571
550
|
attributes:
|
|
572
551
|
host:
|
|
@@ -726,10 +705,6 @@ en:
|
|
|
726
705
|
FPS_TWEENTY_FOUR: "24 (Cinematic Mode)"
|
|
727
706
|
FPS_THIRTY: "30 (TV Show or Online Video)"
|
|
728
707
|
FPS_SIXTY: "60 (Sport and Gaming)"
|
|
729
|
-
import_contestants:
|
|
730
|
-
missing_file: "Please select a file to import."
|
|
731
|
-
queued: "Import queued. Contestants will be created in the background."
|
|
732
|
-
|
|
733
708
|
import_orders:
|
|
734
709
|
invalid_file: "Invalid File upload"
|
|
735
710
|
invalid_json_format: "Invalid JSON format for orders"
|
|
@@ -806,25 +781,7 @@ en:
|
|
|
806
781
|
token_missing: "Verification token is missing"
|
|
807
782
|
verification_failed: "Human verification failed"
|
|
808
783
|
service_unavailable: "Verification service is temporarily unavailable"
|
|
809
|
-
|
|
810
|
-
voting_contestants:
|
|
811
|
-
assigner:
|
|
812
|
-
not_eliminated: "Only eliminated contestants can be added to a Save Contestants session. %{name} is %{status}."
|
|
813
|
-
voting_leaderboards:
|
|
814
|
-
combined_result:
|
|
815
|
-
pre_vote_not_finalized: "Cannot combine results: Pre-Vote sessions not yet finalized: %{names}"
|
|
816
|
-
|
|
817
|
-
voting:
|
|
818
|
-
errors:
|
|
819
|
-
rate_limit_user: "You're voting too fast. Please wait a moment before voting again."
|
|
820
|
-
rate_limit_ip: "Too many votes from your network. Please try again shortly."
|
|
821
|
-
device_account_limit: "This device has been used by too many accounts."
|
|
822
|
-
vpn_blocked: "Voting is not allowed from VPN or proxy connections."
|
|
823
|
-
contestant_vote_cap_exceeded: "You have reached the maximum number of votes allowed for this contestant."
|
|
824
|
-
no_winners_confirmed: "No winners confirmed"
|
|
825
|
-
all_contestants_must_be_ranked: "All non-eliminated contestants must be ranked"
|
|
826
|
-
save_advance_to_session_required: "A target voting session must be selected to advance saved contestants"
|
|
827
|
-
advance_to_session_not_found: "The selected target session could not be found"
|
|
784
|
+
|
|
828
785
|
ticket_transfer:
|
|
829
786
|
rules:
|
|
830
787
|
rule_already_exists_for_scope: "An active transfer fee rule already exists for %{scope_type} with currency %{currency}"
|
|
@@ -870,3 +827,4 @@ en:
|
|
|
870
827
|
cooldown_active: "Please wait %{hours_remaining} hour(s) before attempting another transfer"
|
|
871
828
|
max_transfers_reached: "This ticket has reached the maximum number of transfers (%{limit})"
|
|
872
829
|
event_cutoff_reached: "Transfers are no longer allowed less than %{hours} hour(s) before the event starts"
|
|
830
|
+
|
data/config/locales/km.yml
CHANGED
|
@@ -200,8 +200,6 @@ km:
|
|
|
200
200
|
riel: "៛"
|
|
201
201
|
|
|
202
202
|
spree:
|
|
203
|
-
voting_contestant_advancer:
|
|
204
|
-
reversion_error: "មិនអាចដកចេញនៅវគ្គនេះបានទេ។ បេក្ខជននេះមាននៅវគ្គបោះឆ្នោតក្រោយ។"
|
|
205
203
|
registered_by:
|
|
206
204
|
system_registered: "ចុះឈ្មោះដោយប្រព័ន្ធ"
|
|
207
205
|
self_registered: "ចុះឈ្មោះដោយខ្លួនឯង"
|
|
@@ -409,24 +407,6 @@ km:
|
|
|
409
407
|
attributes:
|
|
410
408
|
exception_rules:
|
|
411
409
|
invalid_json: "Format មិនត្រឹមត្រូវ"
|
|
412
|
-
spree_cm_commissioner/show_contestant:
|
|
413
|
-
attributes:
|
|
414
|
-
video_highlights:
|
|
415
|
-
invalid_json: "Format មិនត្រឹមត្រូវ"
|
|
416
|
-
spree_cm_commissioner/voting_session:
|
|
417
|
-
attributes:
|
|
418
|
-
closes_at:
|
|
419
|
-
must_be_after_opens_at: "ត្រូវតែក្រោយ opens_at"
|
|
420
|
-
must_not_exceed_parent: "មិនអាចក្រោយ closes_at របស់ session មេ"
|
|
421
|
-
parent_id:
|
|
422
|
-
must_have_contestants: '"%{name}" ត្រូវតែមានអ្នកចូលប្រកួត'
|
|
423
|
-
spree_cm_commissioner/voting_contestant:
|
|
424
|
-
attributes:
|
|
425
|
-
base:
|
|
426
|
-
last_contestant_in_parent_session: 'មិនអាចដកអ្នកចូលប្រកួតចុងក្រោយពី "%{session_name}" ព្រោះ session កូនពឹងផ្អែកលើវា'
|
|
427
|
-
advanced_from_session: 'ត្រូវបានដំឡើងពី session មុន ហើយមិនអាចដកចេញដោយផ្ទាល់បានទេ។ សូមលុបការដំឡើងនៅក្នុង session ប្រភពជំនួសវិញ។'
|
|
428
|
-
pre_vote_session: 'មិនអាចដកចេញពី pre-vote session បានទេ។'
|
|
429
|
-
has_advanced_to_session: 'ត្រូវបានកំណត់ឱ្យដំឡើងទៅ session មួយទៀត។ សូមលុបការដំឡើងជាមុនសិន មុននឹងដកអ្នកចូលប្រកួតនេះចេញ។'
|
|
430
410
|
spree_cm_commissioner/tenant:
|
|
431
411
|
attributes:
|
|
432
412
|
host:
|
|
@@ -653,17 +633,7 @@ km:
|
|
|
653
633
|
turnstile:
|
|
654
634
|
token_missing: "សញ្ញាណផ្ទៀងផ្ទាត់គឺបាត់"
|
|
655
635
|
service_unavailable: "សេវាកម្មពេលនេះមិនមានការផ្ទៀងផ្ទាត់"
|
|
656
|
-
|
|
657
|
-
spree_cm_commissioner:
|
|
658
|
-
voting_contestants:
|
|
659
|
-
assigner:
|
|
660
|
-
not_eliminated: "តែអ្នកចូលប្រកួតដែលត្រូវបានលុបចោលប៉ុណ្ណោះអាចបន្ថែមទៅ Save Contestants session បាន។ %{name} មានស្ថានភាព %{status}។"
|
|
661
|
-
voting:
|
|
662
|
-
errors:
|
|
663
|
-
no_winners_confirmed: "មិនមានអ្នកឈ្នះត្រូវបានបញ្ជាក់"
|
|
664
|
-
all_contestants_must_be_ranked: "អ្នកចូលរួមទាំងអស់ដែលមិនត្រូវបានលុបចោលត្រូវតែមានចំណាត់ថ្នាក់"
|
|
665
|
-
save_advance_to_session_required: "ត្រូវតែជ្រើសរើសសម័យបោះឆ្នោតគោលដៅដើម្បីជំរុញអ្នកចូលរួមដែលបានជ្រើស"
|
|
666
|
-
advance_to_session_not_found: "រកមិនឃើញសម័យគោលដៅដែលបានជ្រើស"
|
|
636
|
+
verification_failed: "ការផ្ទៀងផ្ទាត់មនុស្សបានបរាជ័យ។ សូមព្យាយាមម្តងទៀត។"
|
|
667
637
|
|
|
668
638
|
ticket_transfer:
|
|
669
639
|
transfer_not_found: "រកមិនឃើញការផ្ទេរ"
|
|
@@ -707,4 +677,3 @@ km:
|
|
|
707
677
|
cooldown_active: "សូមរង់ចាំ %{hours_remaining} ម៉ោងមុនពេលព្យាយាមផ្ទេរម្តងទៀត"
|
|
708
678
|
max_transfers_reached: "សំបុត្រនេះបានឈានដល់ចំនួនផ្ទេរអតិបរមា (%{limit})"
|
|
709
679
|
event_cutoff_reached: "ការផ្ទេរមិនត្រូវបានអនុញ្ញាតឡើយក្នុងរយៈពេល %{hours} ម៉ោងមុនពេលព្រឹត្តិការណ៍ចាប់ផ្តើម"
|
|
710
|
-
verification_failed: "ការផ្ទៀងផ្ទាត់មនុស្សបានបរាជ័យ។ សូមព្យាយាមម្តងទៀត។"
|
data/config/routes.rb
CHANGED
|
@@ -511,7 +511,6 @@ Spree::Core::Engine.add_routes do
|
|
|
511
511
|
resources :vendors
|
|
512
512
|
resources :products
|
|
513
513
|
resources :taxons, only: %i[index show], id: /.+/
|
|
514
|
-
resources :ad_campaigns, only: [:index]
|
|
515
514
|
|
|
516
515
|
resources :account_checker
|
|
517
516
|
resource :pin_code_checkers, only: [:update]
|
|
@@ -521,7 +520,6 @@ Spree::Core::Engine.add_routes do
|
|
|
521
520
|
|
|
522
521
|
resources :homepage, only: [] do
|
|
523
522
|
resources :homepage_sections, only: [:index]
|
|
524
|
-
resources :preview_sections, only: %i[index]
|
|
525
523
|
end
|
|
526
524
|
|
|
527
525
|
resource :account, controller: :account, only: %i[show update]
|
|
@@ -600,29 +598,6 @@ Spree::Core::Engine.add_routes do
|
|
|
600
598
|
resources :cms_pages, only: %i[index show]
|
|
601
599
|
resources :waiting_room_sessions, only: :create
|
|
602
600
|
|
|
603
|
-
resources :shows, only: [:show] do
|
|
604
|
-
resources :episodes, only: %i[index show]
|
|
605
|
-
resources :people, controller: :show_people, only: %i[index] do
|
|
606
|
-
resources :assignments, controller: :show_person_assignments, only: %i[index]
|
|
607
|
-
end
|
|
608
|
-
resources :contestants, controller: :show_contestants, only: %i[show]
|
|
609
|
-
resources :elimination_sessions, controller: :show_elimination_sessions, only: %i[index]
|
|
610
|
-
resources :free_vote_claims, only: :create
|
|
611
|
-
end
|
|
612
|
-
|
|
613
|
-
resources :voting_sessions, only: [] do
|
|
614
|
-
resources :voting_contestants, only: :index
|
|
615
|
-
resources :voting_credits, only: :index
|
|
616
|
-
resources :votes, only: %i[create index]
|
|
617
|
-
end
|
|
618
|
-
|
|
619
|
-
resources :voting_credit_transactions, only: :index
|
|
620
|
-
resources :votes, only: :index
|
|
621
|
-
|
|
622
|
-
resources :preview_taxons, only: %i[index show], id: /.+/
|
|
623
|
-
resources :preview_products, only: %i[index show]
|
|
624
|
-
resources :preview_shows, only: %i[show]
|
|
625
|
-
|
|
626
601
|
resources :order_histories, only: %i[index] do
|
|
627
602
|
member do
|
|
628
603
|
patch :archive
|
|
@@ -734,7 +709,6 @@ Spree::Core::Engine.add_routes do
|
|
|
734
709
|
resources :homepage, only: [] do
|
|
735
710
|
resources :homepage_sections, only: [:index]
|
|
736
711
|
resource :homepage_background, controller: :homepage_background, only: [:show]
|
|
737
|
-
resources :preview_sections, only: %i[index]
|
|
738
712
|
end
|
|
739
713
|
resources :active_homepage_events, only: [:index]
|
|
740
714
|
|
|
@@ -758,8 +732,6 @@ Spree::Core::Engine.add_routes do
|
|
|
758
732
|
resources :inventory_items, only: %i[index]
|
|
759
733
|
resources :event_matches, only: %i[index]
|
|
760
734
|
resources :invite_guests, only: %i[show update]
|
|
761
|
-
resources :preview_taxons, only: %i[index show], id: /.+/
|
|
762
|
-
resources :preview_products, only: %i[index show]
|
|
763
735
|
resources :ticket_transfers do
|
|
764
736
|
collection do
|
|
765
737
|
get :preview_rule
|
|
@@ -69,22 +69,16 @@ require 'byebug' if Rails.env.development? || Rails.env.test?
|
|
|
69
69
|
module SpreeCmCommissioner
|
|
70
70
|
class << self
|
|
71
71
|
# Allows overriding the default Redis connection pools with custom ones
|
|
72
|
-
attr_writer :inventory_redis_pool
|
|
72
|
+
attr_writer :inventory_redis_pool
|
|
73
73
|
|
|
74
74
|
# Inventory Redis pool for inventory management
|
|
75
75
|
def inventory_redis_pool
|
|
76
76
|
@inventory_redis_pool ||= default_redis_pool
|
|
77
77
|
end
|
|
78
78
|
|
|
79
|
-
# Voting Redis pool for voting system counters
|
|
80
|
-
def voting_redis_pool
|
|
81
|
-
@voting_redis_pool ||= default_redis_pool
|
|
82
|
-
end
|
|
83
|
-
|
|
84
79
|
# Resets all Redis pools, useful for testing or reinitialization
|
|
85
80
|
def reset_redis_pools
|
|
86
81
|
@inventory_redis_pool = nil
|
|
87
|
-
@voting_redis_pool = nil
|
|
88
82
|
end
|
|
89
83
|
|
|
90
84
|
private
|