Files
MatchLiveTv/backend/app/services/sessions/regia_access.rb
Emiliano Frascaro ae36d17adb Stabilizza regia, live web e sync punteggi app nativa.
Corregge scadenza token regia oltre le 8h, tabellone HTML sulla pagina live,
pulsanti pausa/ripresa in regia, link admin e broadcast ActionCable diretto.
App Android: overlay branding, sync score da regia via WebSocket con reconnect e poll.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-08 09:30:43 +02:00

68 lines
1.5 KiB
Ruby

module Sessions
class RegiaAccess
DEFAULT_TTL = 12.hours
def initialize(session)
@session = session
end
# Genera un nuovo link (invalida quello precedente).
def issue_token!
rotate!
end
def rotate!
token = SecureRandom.urlsafe_base64(24)
expires = DEFAULT_TTL.from_now
cap = session_end_cap
expires = [expires, cap].min if cap&.future?
@session.update!(
regia_token_digest: digest(token),
regia_token_expires_at: expires
)
token
end
def url(token)
"#{MatchLiveTv.app_public_url.chomp('/')}/regia/#{token}"
end
def self.find_session_by_token(token)
return if token.blank?
session = StreamSession.find_by(regia_token_digest: digest(token))
return unless session
return if session.regia_token_expires_at.blank? || session.regia_token_expires_at.past?
return if session.terminal?
session
end
def self.revoke!(session)
session.update!(regia_token_digest: nil, regia_token_expires_at: nil)
end
def self.digest(token)
Digest::SHA256.hexdigest(token.to_s)
end
private
def token_valid?
@session.regia_token_digest.present? &&
@session.regia_token_expires_at&.future? &&
!@session.terminal?
end
def session_end_cap
return nil unless @session.started_at
@session.started_at + 8.hours
end
def digest(token)
self.class.digest(token)
end
end
end