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,223 +0,0 @@
|
|
|
1
|
-
module SpreeCmCommissioner
|
|
2
|
-
class VotingSession < SpreeCmCommissioner::Base
|
|
3
|
-
include SpreeCmCommissioner::StoreMetadata
|
|
4
|
-
|
|
5
|
-
belongs_to :vendor, class_name: 'Spree::Vendor', optional: false
|
|
6
|
-
belongs_to :show, class_name: 'SpreeCmCommissioner::Show', optional: false
|
|
7
|
-
belongs_to :episode, class_name: 'Spree::Product', optional: false
|
|
8
|
-
|
|
9
|
-
has_many :voting_credits, class_name: 'SpreeCmCommissioner::VotingCredit', as: :votable, dependent: :destroy
|
|
10
|
-
has_many :voting_contestants, class_name: 'SpreeCmCommissioner::VotingContestant', dependent: :destroy
|
|
11
|
-
has_many :eliminated_voting_contestants, lambda {
|
|
12
|
-
where(eliminated: true)
|
|
13
|
-
}, class_name: 'SpreeCmCommissioner::VotingContestant', foreign_key: 'voting_session_id'
|
|
14
|
-
has_many :show_contestants, through: :voting_contestants
|
|
15
|
-
has_many :contestants, through: :show, source: :show_contestants
|
|
16
|
-
has_many :votes, class_name: 'SpreeCmCommissioner::Vote', dependent: :destroy
|
|
17
|
-
has_one :stat, class_name: 'SpreeCmCommissioner::VotingSessionStat', dependent: :destroy
|
|
18
|
-
|
|
19
|
-
acts_as_list scope: :episode
|
|
20
|
-
|
|
21
|
-
enum status: { disabled: 0, enabled: 1, closed: 2, finalized: 3 }
|
|
22
|
-
enum scoring_model: { manual: 0, geometric: 1, harmonic: 2, weighted_sum: 3, arithmetic: 4 }
|
|
23
|
-
|
|
24
|
-
self.whitelisted_ransackable_attributes = %w[name status]
|
|
25
|
-
|
|
26
|
-
validates :session_key, presence: true, uniqueness: true
|
|
27
|
-
validates :name, :opens_at, :closes_at, :status, presence: true
|
|
28
|
-
validate :closes_after_opens
|
|
29
|
-
validate :validate_live_stream_url, if: :live_stream_url_changed?
|
|
30
|
-
|
|
31
|
-
before_validation :generate_session_key, on: :create
|
|
32
|
-
before_save :update_live_stream_thumbnail
|
|
33
|
-
after_update :schedule_counter_reconciliation, if: -> { saved_change_to_status?(from: 'enabled', to: 'closed') }
|
|
34
|
-
# Scopes
|
|
35
|
-
# Uses the database clock (CURRENT_TIMESTAMP) for consistency and to avoid application server clock drift.
|
|
36
|
-
scope :current, -> { where(status: %i[enabled closed]).where('opens_at <= CURRENT_TIMESTAMP AND closes_at >= CURRENT_TIMESTAMP') }
|
|
37
|
-
scope :upcoming, -> { where(status: :enabled).where('opens_at > CURRENT_TIMESTAMP') }
|
|
38
|
-
scope :past, -> { where(status: :closed).or(where('closes_at < CURRENT_TIMESTAMP')) }
|
|
39
|
-
|
|
40
|
-
def active?
|
|
41
|
-
enabled? && Time.current.between?(opens_at, closes_at)
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def upcoming?
|
|
45
|
-
enabled? && Time.current < opens_at
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def past?
|
|
49
|
-
closed? || (closes_at.present? && Time.current > closes_at)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def paused?
|
|
53
|
-
disabled? && Time.current.between?(opens_at, closes_at)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# Priority 1: Current session wins over Upcoming session.
|
|
57
|
-
# Priority 2: Follow manual position (Managed by acts_as_list).
|
|
58
|
-
def self.current_or_next_upcoming
|
|
59
|
-
current.or(upcoming).order(
|
|
60
|
-
Arel.sql('CASE WHEN opens_at <= CURRENT_TIMESTAMP AND closes_at >= CURRENT_TIMESTAMP THEN 0 ELSE 1 END'),
|
|
61
|
-
:position
|
|
62
|
-
)
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Define standard fraud configuration keys
|
|
66
|
-
store_accessor :fraud_config,
|
|
67
|
-
:max_votes_per_minute_per_user,
|
|
68
|
-
:max_votes_per_minute_per_ip,
|
|
69
|
-
:max_accounts_per_device,
|
|
70
|
-
:block_vpn
|
|
71
|
-
|
|
72
|
-
# Define standard voting configuration keys
|
|
73
|
-
store_accessor :voting_config,
|
|
74
|
-
:free_vote_limit,
|
|
75
|
-
:free_vote_limit_type,
|
|
76
|
-
:paid_vote_enabled,
|
|
77
|
-
:max_paid_votes_per_session,
|
|
78
|
-
:sms_vote_enabled,
|
|
79
|
-
:sms_vote_cost_usd,
|
|
80
|
-
:operator_vote_enabled,
|
|
81
|
-
:votes_weight,
|
|
82
|
-
:voters_weight,
|
|
83
|
-
:suggestion_top_n
|
|
84
|
-
|
|
85
|
-
DEFAULT_SUGGESTION_TOP_N = 1
|
|
86
|
-
|
|
87
|
-
validate :weights_present_for_weighted_sum
|
|
88
|
-
|
|
89
|
-
def effective_suggestion_top_n
|
|
90
|
-
suggestion_top_n&.to_i&.positive? ? suggestion_top_n.to_i : DEFAULT_SUGGESTION_TOP_N
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
# Define public metadata keys (customer-facing data)
|
|
94
|
-
store_public_metadata :live_stream_url, :string
|
|
95
|
-
store_public_metadata :live_stream_enabled, :boolean
|
|
96
|
-
store_public_metadata :live_stream_thumbnail, :string
|
|
97
|
-
store_public_metadata :live_stream_title, :string
|
|
98
|
-
store_public_metadata :live_stream_description, :text
|
|
99
|
-
|
|
100
|
-
def find_or_create_voting_contestant(show_contestant)
|
|
101
|
-
voting_contestants.find_or_create_by!(show_contestant: show_contestant) do |vc|
|
|
102
|
-
vc.show_id = show.id
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def effective_voting_config
|
|
107
|
-
return {} unless show
|
|
108
|
-
|
|
109
|
-
config = parse_json_config(voting_config)
|
|
110
|
-
show_config = show.effective_voting_config
|
|
111
|
-
config.reverse_merge(show_config || {})
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def effective_fraud_config
|
|
115
|
-
return {} unless show
|
|
116
|
-
|
|
117
|
-
config = parse_json_config(fraud_config)
|
|
118
|
-
show_config = show.effective_fraud_config
|
|
119
|
-
config.reverse_merge(show_config || {})
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
def can_vote?
|
|
123
|
-
enabled? && Time.zone.now.between?(opens_at, closes_at)
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# Returns the next session within the same episode (by position).
|
|
127
|
-
# e.g. current session position=1 → returns session at position=2; last session → nil
|
|
128
|
-
def next_in_episode
|
|
129
|
-
episode.voting_sessions.where('position > ?', position).order(:position).first
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
# True when this session is the first in its episode.
|
|
133
|
-
# e.g. position=1 → true; position=2 → false
|
|
134
|
-
def first_in_episode?
|
|
135
|
-
position == 1
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# Show contestants expected in this session but not yet assigned.
|
|
139
|
-
# episode.season.show_contestants → all contestants on the season this episode belongs to.
|
|
140
|
-
# show_contestants → already assigned to this voting session.
|
|
141
|
-
# e.g. season has [Alice, Bob, Carol]; session only has [Alice] → returns [Bob, Carol]
|
|
142
|
-
def missing_show_contestants
|
|
143
|
-
episode.season.show_contestants.where.not(id: show_contestants.select(:id)).ordered
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
def max_votes_per_user
|
|
147
|
-
effective_voting_config['max_votes_per_user'] || 10
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
def rate_limit_window
|
|
151
|
-
effective_voting_config['rate_limit_window'] || 60
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
def rate_limit_max_votes
|
|
155
|
-
effective_voting_config['rate_limit_max_votes'] || 5
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
def embedded_live_stream_url
|
|
159
|
-
return nil if live_stream_url.blank?
|
|
160
|
-
|
|
161
|
-
result = SpreeCmCommissioner::UrlEmbed::YoutubeEmbed.call(url: live_stream_url)
|
|
162
|
-
result.success? ? result.value : nil
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
private
|
|
166
|
-
|
|
167
|
-
def weights_present_for_weighted_sum
|
|
168
|
-
return unless weighted_sum?
|
|
169
|
-
|
|
170
|
-
config = effective_voting_config
|
|
171
|
-
errors.add(:votes_weight, :blank) if config['votes_weight'].blank?
|
|
172
|
-
errors.add(:voters_weight, :blank) if config['voters_weight'].blank?
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
# Enqueues a MaintenanceTasks::VotingSession to reconcile Redis counters after
|
|
176
|
-
# a session state change (e.g. closed). find_or_create_by(pending) is idempotent —
|
|
177
|
-
# multiple triggers won't queue duplicate jobs.
|
|
178
|
-
# Unlike VoteProcessor's Redis-down rescue path, it's safe to call async_execute
|
|
179
|
-
# here because this runs from an after_* callback inside the normal request cycle,
|
|
180
|
-
# not from a Redis error handler where Sidekiq is also unavailable.
|
|
181
|
-
def schedule_counter_reconciliation
|
|
182
|
-
SpreeCmCommissioner::MaintenanceTasks::VotingSession.pending.find_or_create_by(
|
|
183
|
-
maintainable_type: self.class.name,
|
|
184
|
-
maintainable_id: id
|
|
185
|
-
).async_execute
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
def validate_live_stream_url
|
|
189
|
-
return if live_stream_url.blank?
|
|
190
|
-
|
|
191
|
-
result = SpreeCmCommissioner::UrlEmbed::YoutubeEmbed.call(url: live_stream_url)
|
|
192
|
-
return if result.success?
|
|
193
|
-
|
|
194
|
-
errors.add(:live_stream_url, result.error)
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
def update_live_stream_thumbnail
|
|
198
|
-
return if live_stream_url.blank?
|
|
199
|
-
|
|
200
|
-
video_id = SpreeCmCommissioner::UrlEmbed::YoutubeEmbed.extract_video_id(live_stream_url)
|
|
201
|
-
self.live_stream_thumbnail = "https://img.youtube.com/vi/#{video_id}/hqdefault.jpg" if video_id
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
def generate_session_key
|
|
205
|
-
self.session_key ||= "#{episode.slug}-#{Time.current.to_i}-#{SecureRandom.hex(8)}"
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
def closes_after_opens
|
|
209
|
-
return unless opens_at && closes_at
|
|
210
|
-
|
|
211
|
-
errors.add(:closes_at, 'must be after opens_at') if closes_at <= opens_at
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
def parse_json_config(value)
|
|
215
|
-
return {} if value.nil? || value == ''
|
|
216
|
-
return value if value.is_a?(Hash)
|
|
217
|
-
|
|
218
|
-
JSON.parse(value)
|
|
219
|
-
rescue JSON::ParserError
|
|
220
|
-
{}
|
|
221
|
-
end
|
|
222
|
-
end
|
|
223
|
-
end
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
module SpreeCmCommissioner
|
|
2
|
-
class VotingSessionStat < SpreeCmCommissioner::Base
|
|
3
|
-
belongs_to :voting_session, class_name: 'SpreeCmCommissioner::VotingSession', optional: false
|
|
4
|
-
belongs_to :leading_contestant, class_name: 'SpreeCmCommissioner::VotingContestant', optional: true
|
|
5
|
-
|
|
6
|
-
validates :unique_voter_count, :total_vote_count, presence: true
|
|
7
|
-
end
|
|
8
|
-
end
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
<!-- insert_after "[data-hook='admin_product_form_promotionable']" -->
|
|
2
|
-
|
|
3
|
-
<div data-hook="admin_product_form_preview">
|
|
4
|
-
<%= f.field_container :preview do %>
|
|
5
|
-
<%= f.check_box :preview %>
|
|
6
|
-
<%= f.label :preview, 'Preview (internal team only)' %>
|
|
7
|
-
<%= f.error_message_on :preview %>
|
|
8
|
-
<% end %>
|
|
9
|
-
</div>
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
<!-- insert_before "erb[loud]:contains('field_container :hide_from_nav')" -->
|
|
2
|
-
|
|
3
|
-
<%= f.field_container :preview, class: ['custom-control', 'custom-checkbox', 'my-4'] do %>
|
|
4
|
-
<%= f.check_box :preview, class: 'custom-control-input' %>
|
|
5
|
-
<%= f.label :preview, 'Preview (internal team only)', class: 'custom-control-label' %>
|
|
6
|
-
<%= f.error_message_on :preview %>
|
|
7
|
-
<% end %>
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module V2
|
|
3
|
-
module Tenant
|
|
4
|
-
class ShowContestantSerializer < BaseSerializer
|
|
5
|
-
set_type :show_contestant
|
|
6
|
-
|
|
7
|
-
attributes :name, :age, :origin, :category, :bio, :gender, :status, :contestant_number, :show_id, :eliminated_at
|
|
8
|
-
|
|
9
|
-
attribute :video_highlights do |contestant|
|
|
10
|
-
contestant.video_highlights || []
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
has_one :current_voting_session, serializer: ::Spree::V2::Tenant::VotingSessionSerializer
|
|
14
|
-
has_many :show_contestant_images, serializer: ::Spree::V2::Tenant::AssetSerializer
|
|
15
|
-
has_many :show_contestant_videos, serializer: ::Spree::V2::Tenant::VideoSerializer
|
|
16
|
-
has_many :voting_contestants, serializer: ::Spree::V2::Tenant::VotingContestantSerializer
|
|
17
|
-
has_one :assigned_show_person, serializer: ::Spree::V2::Tenant::ShowPersonSerializer
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module V2
|
|
3
|
-
module Tenant
|
|
4
|
-
class ShowEpisodeSerializer < BaseSerializer
|
|
5
|
-
attributes :episode_number, :name, :scheduled_at, :ends_at
|
|
6
|
-
|
|
7
|
-
attribute :status do |episode|
|
|
8
|
-
if episode.current?
|
|
9
|
-
'current'
|
|
10
|
-
elsif episode.upcoming?
|
|
11
|
-
'upcoming'
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module V2
|
|
3
|
-
module Tenant
|
|
4
|
-
class ShowPersonAssignmentSerializer < BaseSerializer
|
|
5
|
-
set_type :show_person_assignment
|
|
6
|
-
|
|
7
|
-
attribute :role
|
|
8
|
-
|
|
9
|
-
has_many :assigned_contestants, serializer: ::Spree::V2::Tenant::ShowContestantSerializer, &:assigned_contestants
|
|
10
|
-
|
|
11
|
-
has_one :show_person, serializer: ::Spree::V2::Tenant::ShowPersonSerializer
|
|
12
|
-
has_one :show, serializer: ::Spree::V2::Tenant::ShowSerializer
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module V2
|
|
3
|
-
module Tenant
|
|
4
|
-
class ShowPersonSerializer < BaseSerializer
|
|
5
|
-
set_type :show_person
|
|
6
|
-
|
|
7
|
-
attributes :name, :bio, :social_links
|
|
8
|
-
|
|
9
|
-
has_many :show_person_images, serializer: ::Spree::V2::Tenant::AssetSerializer
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module V2
|
|
3
|
-
module Tenant
|
|
4
|
-
class ShowSerializer < BaseSerializer
|
|
5
|
-
set_type :show
|
|
6
|
-
|
|
7
|
-
attributes :slug, :description, :permalink, :from_date, :to_date, :preview, :created_at, :updated_at,
|
|
8
|
-
:free_vote_limit, :free_vote_limit_type
|
|
9
|
-
|
|
10
|
-
attribute :name, &:display_name
|
|
11
|
-
|
|
12
|
-
attribute :show_type do |show|
|
|
13
|
-
if show.show?
|
|
14
|
-
'franchise'
|
|
15
|
-
elsif show.season?
|
|
16
|
-
'season'
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
has_one :current_episode, serializer: Spree::V2::Tenant::ShowEpisodeSerializer
|
|
21
|
-
has_one :current_voting_session, serializer: Spree::V2::Tenant::VotingSessionSerializer
|
|
22
|
-
has_one :app_banner, serializer: Spree::V2::Tenant::AssetSerializer
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module V2
|
|
3
|
-
module Tenant
|
|
4
|
-
class VoteSerializer < BaseSerializer
|
|
5
|
-
attributes :voting_session_id, :contestant_id, :quantity, :channel,
|
|
6
|
-
:voter_identifier, :public_metadata, :created_at
|
|
7
|
-
|
|
8
|
-
has_one :contestant, serializer: Spree::V2::Tenant::VotingContestantSerializer
|
|
9
|
-
has_one :voting_session, serializer: Spree::V2::Tenant::VotingSessionSerializer
|
|
10
|
-
has_one :vote_credit, serializer: Spree::V2::Tenant::VotingCreditSerializer
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module V2
|
|
3
|
-
module Tenant
|
|
4
|
-
class VotingContestantSerializer < BaseSerializer
|
|
5
|
-
set_type :voting_contestant
|
|
6
|
-
|
|
7
|
-
attributes :show_id, :show_contestant_id, :name, :contestant_number, :vote_number, :category, :gender,
|
|
8
|
-
:vote_count, :eliminated, :eliminated_via, :eliminated_at, :advanced_to_type, :advanced_to_id, :special_rules,
|
|
9
|
-
:created_at, :updated_at, :advanced_from_type, :advanced_from_id, :unique_voter_count, :preferences
|
|
10
|
-
|
|
11
|
-
attribute :voting_session_id, &:voting_session_id
|
|
12
|
-
|
|
13
|
-
attribute :can_vote, &:can_vote?
|
|
14
|
-
|
|
15
|
-
belongs_to :voting_session, serializer: ::Spree::V2::Tenant::VotingSessionSerializer
|
|
16
|
-
|
|
17
|
-
has_many :show_contestant_images, serializer: ::Spree::V2::Tenant::AssetSerializer
|
|
18
|
-
has_many :show_contestant_videos, serializer: ::Spree::V2::Tenant::VideoSerializer
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module V2
|
|
3
|
-
module Tenant
|
|
4
|
-
class VotingCreditSerializer < BaseSerializer
|
|
5
|
-
attributes :category, :votable_type, :votable_id, :free_votes_amount, :free_votes_used,
|
|
6
|
-
:paid_votes_amount, :paid_votes_used, :available_votes, :created_at, :updated_at
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module V2
|
|
3
|
-
module Tenant
|
|
4
|
-
class VotingCreditTransactionSerializer < BaseSerializer
|
|
5
|
-
attributes :amount, :user_total_amount, :memo, :created_at
|
|
6
|
-
|
|
7
|
-
attribute :action, &:action # we want to return the string value of the enum
|
|
8
|
-
|
|
9
|
-
has_one :vote_credit, serializer: Spree::V2::Tenant::VotingCreditSerializer
|
|
10
|
-
has_one :originator, polymorphic: true, serializer: Spree::V2::Tenant::OrderSerializer
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module V2
|
|
3
|
-
module Tenant
|
|
4
|
-
class VotingSessionSerializer < BaseSerializer
|
|
5
|
-
attributes :name, :opens_at, :closes_at, :status, :live_stream_enabled, :live_stream_thumbnail, :live_stream_title, :live_stream_description,
|
|
6
|
-
:created_at
|
|
7
|
-
|
|
8
|
-
attribute :live_stream_url, &:embedded_live_stream_url
|
|
9
|
-
attribute :can_vote, &:can_vote?
|
|
10
|
-
|
|
11
|
-
belongs_to :episode, serializer: Spree::V2::Tenant::ShowEpisodeSerializer
|
|
12
|
-
belongs_to :show, serializer: Spree::V2::Tenant::ShowSerializer
|
|
13
|
-
|
|
14
|
-
has_many :eliminated_voting_contestants, serializer: ::Spree::V2::Tenant::VotingContestantSerializer
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|