Files
MatchLiveTv/backend/app/models/match.rb
Emiliano Frascaro 2b8f842752 Dirette: nasconde partite programmate nel passato.
La pagina /live mostrava tutte le partite da inizio giornata; ora solo con orario futuro.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-02 19:10:07 +02:00

59 lines
1.6 KiB
Ruby

class Match < ApplicationRecord
belongs_to :team
has_many :stream_sessions, dependent: :destroy
ACTIVE_SESSION_STATUSES = %w[live connecting reconnecting paused].freeze
validates :opponent_name, presence: true
validates :sets_to_win, numericality: { greater_than: 0, less_than: 6 }
# Partite ancora da giocare in diretta (orario nel futuro).
scope :scheduled_for_live, -> {
where.not(scheduled_at: nil).where("scheduled_at >= ?", Time.zone.now)
}
scope :scheduled_upcoming, -> { scheduled_for_live }
def scheduled_upcoming?
scheduled_at.present? && scheduled_at >= Time.zone.now
end
def scheduled_on_calendar?
scheduled_at.present? && scheduled_at >= Time.zone.now.beginning_of_day
end
def active_stream_session
stream_sessions.sort_by { |s| s.created_at }.reverse
.find { |s| !%w[ended error].include?(s.status) }
end
def deletable?
session = active_stream_session
session.nil? || !session.resumable?
end
def public_status_label
active = active_stream_session
return "In corso / da riprendere" if active
return "Programmata" if scheduled_upcoming?
return "Pronta" if scheduled_at.present?
"Senza orario"
end
scope :search_teams_or_opponents, lambda { |query|
q = query.to_s.strip
return all if q.blank?
term = "%#{sanitize_sql_like(q)}%"
joins(team: :club).where(
"teams.name ILIKE :term OR matches.opponent_name ILIKE :term OR clubs.name ILIKE :term OR matches.location ILIKE :term",
term: term
)
}
def broadcast_active?
stream_sessions.where(status: ACTIVE_SESSION_STATUSES).exists?
end
end