Class: SpreeCmCommissioner::VotingSession

Inherits:
Base
  • Object
show all
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

Instance Method Summary collapse

Class Method Details

.current_or_next_upcomingObject

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

Returns:

  • (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

Returns:

  • (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_configObject



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_nObject



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_configObject



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_urlObject



163
164
165
166
167
168
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 163

def embedded_live_stream_url
  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

Returns:

  • (Boolean)


139
140
141
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 139

def first_in_episode?
  position == 1
end

#max_votes_per_userObject



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_contestantsObject

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_episodeObject

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

Returns:

  • (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

Returns:

  • (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_votesObject



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_windowObject



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

Returns:

  • (Boolean)


48
49
50
# File 'app/models/spree_cm_commissioner/voting_session.rb', line 48

def upcoming?
  enabled? && Time.current < opens_at
end