Class: SpreeCmCommissioner::VotingSession
- Includes:
- StoreMetadata
- Defined in:
- app/models/spree_cm_commissioner/voting_session.rb
Overview
rubocop:disable Metrics/ClassLength
Constant Summary collapse
- DEFAULT_SUGGESTION_TOP_N =
1
Class Method Summary collapse
-
.current_or_next_upcoming ⇒ Object
Priority 1: Current session wins over Upcoming session.
Instance Method Summary collapse
- #active? ⇒ Boolean
- #can_vote? ⇒ Boolean
- #effective_fraud_config ⇒ Object
- #effective_suggestion_top_n ⇒ Object
- #effective_voting_config ⇒ Object
- #embedded_live_stream_url ⇒ Object
- #find_or_create_voting_contestant(show_contestant) ⇒ Object
-
#first_in_episode? ⇒ Boolean
True when this session is the first in its episode.
- #max_votes_per_user ⇒ Object
-
#missing_show_contestants ⇒ Object
Show contestants expected in this session but not yet assigned.
-
#next_in_episode ⇒ Object
Returns the next session within the same episode (by position).
- #past? ⇒ Boolean
- #paused? ⇒ Boolean
- #rate_limit_max_votes ⇒ Object
- #rate_limit_window ⇒ Object
- #upcoming? ⇒ Boolean
Class Method Details
.current_or_next_upcoming ⇒ Object
Priority 1: Current session wins over Upcoming session. Priority 2: Follow manual position (Managed by acts_as_list).
62 63 64 65 66 67 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 62 def self.current_or_next_upcoming current.or(upcoming).order( Arel.sql('CASE WHEN opens_at <= CURRENT_TIMESTAMP AND closes_at >= CURRENT_TIMESTAMP THEN 0 ELSE 1 END'), :position ) end |
Instance Method Details
#active? ⇒ Boolean
44 45 46 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 44 def active? enabled? && Time.current.between?(opens_at, closes_at) end |
#can_vote? ⇒ Boolean
127 128 129 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 127 def can_vote? enabled? && Time.zone.now.between?(opens_at, closes_at) end |
#effective_fraud_config ⇒ Object
119 120 121 122 123 124 125 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 119 def effective_fraud_config return {} unless show config = parse_json_config(fraud_config) show_config = show.effective_fraud_config config.reverse_merge(show_config || {}) end |
#effective_suggestion_top_n ⇒ Object
94 95 96 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 94 def effective_suggestion_top_n suggestion_top_n&.to_i&.positive? ? suggestion_top_n.to_i : DEFAULT_SUGGESTION_TOP_N end |
#effective_voting_config ⇒ Object
111 112 113 114 115 116 117 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 111 def effective_voting_config return {} unless show config = parse_json_config(voting_config) show_config = show.effective_voting_config config.reverse_merge(show_config || {}) end |
#embedded_live_stream_url ⇒ Object
163 164 165 166 167 168 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 163 def return nil if live_stream_url.blank? result = SpreeCmCommissioner::UrlEmbed::YoutubeEmbed.call(url: live_stream_url) result.success? ? result.value : nil end |
#find_or_create_voting_contestant(show_contestant) ⇒ Object
105 106 107 108 109 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 105 def find_or_create_voting_contestant(show_contestant) voting_contestants.find_or_create_by!(show_contestant: show_contestant) do |vc| vc.show_id = show.id end end |
#first_in_episode? ⇒ Boolean
True when this session is the first in its episode. e.g. position=1 → true; position=2 → false
139 140 141 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 139 def first_in_episode? position == 1 end |
#max_votes_per_user ⇒ Object
151 152 153 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 151 def max_votes_per_user effective_voting_config['max_votes_per_user'] || 10 end |
#missing_show_contestants ⇒ Object
Show contestants expected in this session but not yet assigned. episode.season.show_contestants → all contestants on the season this episode belongs to. show_contestants → already assigned to this voting session. e.g. season has [Alice(active), Bob(active), Carol(eliminated)]; session only has [Alice] → returns [Bob]
147 148 149 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 147 def missing_show_contestants episode.season.show_contestants.active.where.not(id: show_contestants.select(:id)).ordered end |
#next_in_episode ⇒ Object
Returns the next session within the same episode (by position). e.g. current session position=1 → returns session at position=2; last session → nil
133 134 135 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 133 def next_in_episode episode.voting_sessions.where('position > ?', position).order(:position).first end |
#past? ⇒ Boolean
52 53 54 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 52 def past? closed? || (closes_at.present? && Time.current > closes_at) end |
#paused? ⇒ Boolean
56 57 58 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 56 def paused? disabled? && Time.current.between?(opens_at, closes_at) end |
#rate_limit_max_votes ⇒ Object
159 160 161 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 159 def rate_limit_max_votes effective_voting_config['rate_limit_max_votes'] || 5 end |
#rate_limit_window ⇒ Object
155 156 157 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 155 def rate_limit_window effective_voting_config['rate_limit_window'] || 60 end |
#upcoming? ⇒ Boolean
48 49 50 |
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 48 def upcoming? enabled? && Time.current < opens_at end |