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>
68 lines
1.5 KiB
Ruby
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
|