spree_cm_commissioner 2.8.2.pre.pre.2 → 2.8.2
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 -4
- data/Gemfile.lock +1 -1
- 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/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 +0 -10
- data/app/models/concerns/spree_cm_commissioner/product_type.rb +1 -1
- data/app/models/spree_cm_commissioner/product_decorator.rb +0 -39
- data/app/models/spree_cm_commissioner/role_decorator.rb +1 -4
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +0 -15
- data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +1 -10
- 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_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 -1
- 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/views/spree/admin/homepage_section/_form.html.erb +0 -5
- data/config/initializers/spree_permitted_attributes.rb +0 -8
- data/config/locales/en.yml +0 -14
- data/config/locales/km.yml +0 -10
- data/config/routes.rb +0 -26
- 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 +4 -116
- 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/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 -34
- data/app/controllers/spree/api/v2/tenant/votes_controller.rb +0 -94
- data/app/controllers/spree/api/v2/tenant/voting_contestants_controller.rb +0 -40
- 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/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/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 -159
- 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 -135
- data/app/models/spree_cm_commissioner/show_person.rb +0 -15
- data/app/models/spree_cm_commissioner/show_person_assignment.rb +0 -20
- 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 -19
- data/app/models/spree_cm_commissioner/voting_contestant.rb +0 -46
- 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 -223
- 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/show_contestant_serializer.rb +0 -21
- data/app/serializers/spree/v2/tenant/show_episode_serializer.rb +0 -17
- 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 -26
- data/app/serializers/spree/v2/tenant/video_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 -22
- 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 -18
- data/app/services/spree_cm_commissioner/fraud_check.rb +0 -279
- data/app/services/spree_cm_commissioner/show_contestants/normalize_video_highlights.rb +0 -57
- 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 -334
- data/app/services/spree_cm_commissioner/voting_contestants/assigner.rb +0 -32
- 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 -74
- data/app/services/spree_cm_commissioner/voting_sessions/finalize.rb +0 -66
- 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/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
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
class CreateCmVotingSessionStats < ActiveRecord::Migration[7.0]
|
|
2
|
-
def change
|
|
3
|
-
create_table :cm_voting_session_stats, if_not_exists: true do |t|
|
|
4
|
-
t.bigint :voting_session_id, null: false
|
|
5
|
-
t.integer :unique_voter_count, default: 0, null: false
|
|
6
|
-
t.integer :total_vote_count, default: 0, null: false
|
|
7
|
-
t.decimal :vote_velocity, precision: 8, scale: 2
|
|
8
|
-
t.bigint :leading_contestant_id
|
|
9
|
-
|
|
10
|
-
t.timestamps
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
add_index :cm_voting_session_stats, :voting_session_id, unique: true, if_not_exists: true
|
|
14
|
-
add_foreign_key :cm_voting_session_stats, :cm_voting_sessions, column: :voting_session_id, if_not_exists: true
|
|
15
|
-
add_foreign_key :cm_voting_session_stats, :cm_voting_contestants, column: :leading_contestant_id, if_not_exists: true
|
|
16
|
-
end
|
|
17
|
-
end
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Optimizes cm_votes indexes for the leaderboard unique voter queries.
|
|
2
|
-
#
|
|
3
|
-
# Removes two unused indexes:
|
|
4
|
-
# - voter_identifier: stored on the row for audit purposes but never queried from DB
|
|
5
|
-
# (fraud detection is entirely Redis-based)
|
|
6
|
-
# - created_at: only used in ORDER BY after a user_id filter, so Postgres prefers
|
|
7
|
-
# the (user_id, voting_session_id) index over this one — never used
|
|
8
|
-
#
|
|
9
|
-
# Adds one targeted index:
|
|
10
|
-
# - (voting_session_id, user_id): used by PerContestantCounter#session_unique_voter_count
|
|
11
|
-
# which runs COUNT(DISTINCT user_id) WHERE voting_session_id = ? AND user_id IS NOT NULL
|
|
12
|
-
# for the leaderboard total unique voters display
|
|
13
|
-
#
|
|
14
|
-
# Net result: 5 → 4 indexes — fewer write penalties per vote INSERT, better read coverage.
|
|
15
|
-
class OptimizeCmVotesIndexes < ActiveRecord::Migration[7.0]
|
|
16
|
-
def change
|
|
17
|
-
remove_index :cm_votes, :voter_identifier, if_exists: true
|
|
18
|
-
remove_index :cm_votes, :created_at, if_exists: true
|
|
19
|
-
|
|
20
|
-
add_index :cm_votes, [:voting_session_id, :user_id], if_not_exists: true
|
|
21
|
-
end
|
|
22
|
-
end
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
class AddVoteNumberToCmVotingContestants < ActiveRecord::Migration[7.0]
|
|
2
|
-
def change
|
|
3
|
-
add_column :cm_voting_contestants, :vote_number, :integer, if_not_exists: true
|
|
4
|
-
add_index :cm_voting_contestants, :vote_number, if_not_exists: true, name: 'index_cm_voting_contestants_on_vote_number'
|
|
5
|
-
|
|
6
|
-
# Composite unique index: ensures vote_number is unique per contestant per session
|
|
7
|
-
add_index :cm_voting_contestants, [:show_contestant_id, :voting_session_id, :vote_number],
|
|
8
|
-
unique: true,
|
|
9
|
-
if_not_exists: true,
|
|
10
|
-
name: 'idx_voting_contestants_show_session_vote'
|
|
11
|
-
|
|
12
|
-
# Remove duplicate index on advanced_to_type, advanced_to_id
|
|
13
|
-
remove_index :cm_voting_contestants,
|
|
14
|
-
column: [:advanced_to_type, :advanced_to_id],
|
|
15
|
-
name: 'idx_voting_contestants_advanced_to',
|
|
16
|
-
if_exists: true
|
|
17
|
-
end
|
|
18
|
-
end
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
# PostgreSQL Query Guide: Double-Encoded JSONB Metadata
|
|
2
|
-
|
|
3
|
-
This document explains how to perform SQL queries on the `private_metadata` and `public_metadata` columns in the `SpreeCmCommissioner` system, addressing the double-encoded JSON issue.
|
|
4
|
-
|
|
5
|
-
## The Problem: Double-Encoding
|
|
6
|
-
|
|
7
|
-
In some models, the `jsonb` metadata columns contain data that has been double-serialized. Instead of a native JSON object, the database stores a JSON string scalar.
|
|
8
|
-
|
|
9
|
-
**Example of raw database content:**
|
|
10
|
-
```json
|
|
11
|
-
"{\"scheduled_at\":\"2026-03-25 07:40:17 UTC\",\"ends_at\":\"2026-03-27 07:40:17 UTC\"}"
|
|
12
|
-
```
|
|
13
|
-
Because this is stored as a "string" inside the `jsonb` column, standard JSON operators like `->>` will return `NULL` when attempting to access keys directly (e.g., `private_metadata ->> 'scheduled_at'`).
|
|
14
|
-
|
|
15
|
-
## The SQL Workaround: `#>> '{}'`
|
|
16
|
-
|
|
17
|
-
To query this data at the database level, you must first "unwrap" the string and cast it back to `jsonb`.
|
|
18
|
-
|
|
19
|
-
### 1. Unwrap and Cast to JSONB
|
|
20
|
-
Use the `#>> '{}'` operator to extract the top-level string content, then cast it to `::jsonb`.
|
|
21
|
-
|
|
22
|
-
```sql
|
|
23
|
-
(private_metadata #>> '{}')::jsonb
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### 2. Access Specific Keys
|
|
27
|
-
Once casted, you can use the standard `->>` operator.
|
|
28
|
-
|
|
29
|
-
```sql
|
|
30
|
-
(private_metadata #>> '{}')::jsonb ->> 'scheduled_at'
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### 3. Handle Timestamps (with Casting)
|
|
34
|
-
Since values are extracted as text, you must cast them to `timestamp` or `timestamptz` for comparison.
|
|
35
|
-
|
|
36
|
-
```sql
|
|
37
|
-
WHERE CAST((private_metadata #>> '{}')::jsonb ->> 'scheduled_at' AS timestamp) <= '2026-03-26 15:00:00'
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Example: ActiveRecord Scopes
|
|
41
|
-
|
|
42
|
-
When implementing this in Rails models, use `Arel.sql` or string fragments within your scopes:
|
|
43
|
-
|
|
44
|
-
```ruby
|
|
45
|
-
scope :current, ->(now = Time.current) {
|
|
46
|
-
where("CAST((private_metadata #>> '{}')::jsonb ->> 'scheduled_at' AS timestamp) <= ?", now)
|
|
47
|
-
.where("(private_metadata #>> '{}')::jsonb ->> 'ends_at' IS NULL OR CAST((private_metadata #>> '{}')::jsonb ->> 'ends_at' AS timestamp) >= ?", now)
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Why this happens?
|
|
52
|
-
This occurs because `ActiveRecord::Store` is used with a manual `coder` on a column that is already defined as `jsonb` in the database.
|
|
53
|
-
1. The coder converts the Hash to a JSON string.
|
|
54
|
-
2. ActiveRecord sees the `jsonb` type and encodes that string into a JSON scalar to ensure it fits the column type, resulting in the double-encoded format.
|
|
55
|
-
|
|
56
|
-
> [!TIP]
|
|
57
|
-
> This workaround is safer than a system-wide data migration as it works correctly regardless of whether the data is single-encoded or double-encoded (PostgreSQL's `#>> '{}'` is idempotent for already-correct JSONB objects).
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
FactoryBot.define do
|
|
2
|
-
factory :show_episode, class: 'SpreeCmCommissioner::ShowEpisode', parent: :cm_product do
|
|
3
|
-
sequence(:name) { |n| "episode_#{n}" }
|
|
4
|
-
|
|
5
|
-
association :event, factory: :show
|
|
6
|
-
product_type { :vote_package }
|
|
7
|
-
available_on { 1.day.ago }
|
|
8
|
-
|
|
9
|
-
shipping_category { Spree::ShippingCategory.first || create(:shipping_category) }
|
|
10
|
-
price { 10.0 }
|
|
11
|
-
end
|
|
12
|
-
end
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
FactoryBot.define do
|
|
2
|
-
factory :cm_show, class: 'SpreeCmCommissioner::Show' do
|
|
3
|
-
sequence(:name) { |n| "Show #{n}" }
|
|
4
|
-
vendor { Spree::Vendor.first || create(:cm_vendor) }
|
|
5
|
-
|
|
6
|
-
before(:create) do |show|
|
|
7
|
-
taxonomy = Spree::Taxonomy.shows
|
|
8
|
-
show.taxonomy_id ||= taxonomy.id
|
|
9
|
-
show.parent_id ||= taxonomy.root.id
|
|
10
|
-
show.type = 'SpreeCmCommissioner::Show'
|
|
11
|
-
show.kind = :event
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
factory :cm_show_with_season do
|
|
15
|
-
after(:create) do |show|
|
|
16
|
-
create(:cm_show_season, parent: show)
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
factory :cm_show_season, class: 'SpreeCmCommissioner::Show' do
|
|
22
|
-
sequence(:name) { |n| "Season #{n}" }
|
|
23
|
-
association :parent, factory: :cm_show
|
|
24
|
-
vendor { parent.vendor }
|
|
25
|
-
season_number { 1 }
|
|
26
|
-
season_year { Time.current.year }
|
|
27
|
-
|
|
28
|
-
before(:create) do |season|
|
|
29
|
-
season.taxonomy_id = season.parent.taxonomy_id
|
|
30
|
-
season.type = 'SpreeCmCommissioner::Show'
|
|
31
|
-
season.kind = :event
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
factory :cm_show_episode, class: 'SpreeCmCommissioner::ShowEpisode', parent: :cm_product do
|
|
36
|
-
sequence(:name) { |n| "Episode #{n}" }
|
|
37
|
-
event { association :cm_show }
|
|
38
|
-
vendor { event.vendor }
|
|
39
|
-
|
|
40
|
-
before(:create) do |episode|
|
|
41
|
-
episode.type = 'SpreeCmCommissioner::ShowEpisode'
|
|
42
|
-
episode.scheduled_at ||= Time.current
|
|
43
|
-
episode.ends_at ||= 1.day.from_now
|
|
44
|
-
episode.shipping_category ||= Spree::ShippingCategory.first_or_create!(name: 'Default')
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
trait :current do
|
|
48
|
-
after(:build) do |episode|
|
|
49
|
-
episode.scheduled_at = 1.day.ago
|
|
50
|
-
episode.ends_at = 1.day.from_now
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
trait :upcoming do
|
|
55
|
-
after(:build) do |episode|
|
|
56
|
-
episode.scheduled_at = 1.day.from_now
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
factory :cm_show_person, class: 'SpreeCmCommissioner::ShowPerson' do
|
|
62
|
-
sequence(:name) { |n| "Show Person #{n}" }
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
factory :cm_show_person_assignment, class: 'SpreeCmCommissioner::ShowPersonAssignment' do
|
|
66
|
-
association :show_person, factory: :cm_show_person
|
|
67
|
-
association :show, factory: :cm_show
|
|
68
|
-
role { :coach }
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
factory :cm_show_contestant, class: 'SpreeCmCommissioner::ShowContestant' do
|
|
72
|
-
sequence(:name) { |n| "Contestant #{n}" }
|
|
73
|
-
association :show, factory: :cm_show
|
|
74
|
-
sequence(:contestant_number) { |n| "CON-#{n}" }
|
|
75
|
-
status { :active }
|
|
76
|
-
position { 0 }
|
|
77
|
-
video_highlights { [] }
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
factory :cm_voting_session, class: 'SpreeCmCommissioner::VotingSession' do
|
|
81
|
-
sequence(:name) { |n| "Session #{n}" }
|
|
82
|
-
association :episode, factory: :cm_show_episode
|
|
83
|
-
show { episode.event }
|
|
84
|
-
vendor { episode.vendor }
|
|
85
|
-
opens_at { 1.hour.ago }
|
|
86
|
-
closes_at { 1.hour.from_now }
|
|
87
|
-
status { :enabled }
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
factory :cm_voting_session_stat, class: 'SpreeCmCommissioner::VotingSessionStat' do
|
|
91
|
-
association :voting_session, factory: :cm_voting_session
|
|
92
|
-
unique_voter_count { 0 }
|
|
93
|
-
total_vote_count { 0 }
|
|
94
|
-
vote_velocity { 0.0 }
|
|
95
|
-
leading_contestant { nil }
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
factory :cm_voting_contestant, class: 'SpreeCmCommissioner::VotingContestant' do
|
|
99
|
-
show { create(:cm_show) }
|
|
100
|
-
show_contestant { create(:cm_show_contestant, show: show) }
|
|
101
|
-
voting_session { create(:cm_voting_session, episode: create(:cm_show_episode, event: show), show: show, vendor: show.vendor) }
|
|
102
|
-
show_id { show.id }
|
|
103
|
-
eliminated { false }
|
|
104
|
-
|
|
105
|
-
trait :eliminated do
|
|
106
|
-
eliminated { true }
|
|
107
|
-
eliminated_via { :public_vote }
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
trait :eliminated_by_judges do
|
|
111
|
-
eliminated { true }
|
|
112
|
-
eliminated_via { :judges_deadlock }
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
trait :eliminated_by_coach do
|
|
116
|
-
eliminated { true }
|
|
117
|
-
eliminated_via { :coach_decision }
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
end
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
FactoryBot.define do
|
|
2
|
-
factory :voting_credit, class: 'SpreeCmCommissioner::VotingCredit' do
|
|
3
|
-
tenant_id { 1 }
|
|
4
|
-
association :user
|
|
5
|
-
created_by { nil }
|
|
6
|
-
|
|
7
|
-
category { :purchase }
|
|
8
|
-
credit_type { nil }
|
|
9
|
-
|
|
10
|
-
votable { nil }
|
|
11
|
-
|
|
12
|
-
free_votes_amount { 0 }
|
|
13
|
-
free_votes_used { 0 }
|
|
14
|
-
paid_votes_amount { 10 }
|
|
15
|
-
paid_votes_used { 0 }
|
|
16
|
-
last_free_reset_at { nil }
|
|
17
|
-
|
|
18
|
-
deleted_at { nil }
|
|
19
|
-
|
|
20
|
-
trait :promo do
|
|
21
|
-
category { :promo }
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
trait :bonus do
|
|
25
|
-
category { :bonus }
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
trait :soft_deleted do
|
|
29
|
-
deleted_at { Time.current }
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
trait :partially_used do
|
|
33
|
-
paid_votes_amount { 10 }
|
|
34
|
-
paid_votes_used { 3 }
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
FactoryBot.define do
|
|
2
|
-
factory :vote, class: 'SpreeCmCommissioner::Vote' do
|
|
3
|
-
tenant_id { 1 }
|
|
4
|
-
association :voting_session, factory: :cm_voting_session
|
|
5
|
-
contestant { create(:cm_voting_contestant, voting_session: voting_session) }
|
|
6
|
-
association :user
|
|
7
|
-
vote_credit { nil }
|
|
8
|
-
channel { :web }
|
|
9
|
-
quantity { 1 }
|
|
10
|
-
voter_identifier { nil }
|
|
11
|
-
device_fingerprint { nil }
|
|
12
|
-
ip_address { nil }
|
|
13
|
-
public_metadata { {} }
|
|
14
|
-
|
|
15
|
-
trait :with_credit do
|
|
16
|
-
association :vote_credit, factory: :voting_credit
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
trait :anonymous do
|
|
20
|
-
user { nil }
|
|
21
|
-
voter_identifier { SecureRandom.hex(8) }
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
trait :mobile do
|
|
25
|
-
channel { :mobile }
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
FactoryBot.define do
|
|
2
|
-
factory :voting_credit_transaction, class: 'SpreeCmCommissioner::VotingCreditTransaction' do
|
|
3
|
-
association :vote_credit, factory: :voting_credit
|
|
4
|
-
tenant_id { 1 }
|
|
5
|
-
action { :use }
|
|
6
|
-
amount { 10 }
|
|
7
|
-
user_total_amount { 0 }
|
|
8
|
-
idempotency_key { nil }
|
|
9
|
-
deleted_at { nil }
|
|
10
|
-
end
|
|
11
|
-
end
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
FactoryBot.define do
|
|
2
|
-
factory :voting_session, class: 'SpreeCmCommissioner::VotingSession' do
|
|
3
|
-
association :episode, factory: :show_episode
|
|
4
|
-
sequence(:session_key) { |n| "session_key_#{n}" }
|
|
5
|
-
opens_at { 1.hour.ago }
|
|
6
|
-
closes_at { 1.hour.from_now }
|
|
7
|
-
status { :active }
|
|
8
|
-
voting_config { {} }
|
|
9
|
-
fraud_config { {} }
|
|
10
|
-
end
|
|
11
|
-
end
|