Introduce architettura multi-sport con catalogo, engine scoring e overlay.

Catalogo sport in YAML, board implicito, engine per volley/basket/timed/racket/timer/generic, regia e app Android allineate.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-09 20:11:21 +02:00
parent 53f9a6a884
commit e727069d43
56 changed files with 1783 additions and 223 deletions

View File

@@ -1,27 +1,13 @@
module Scoring
# Sincronizza lo stato completo del tabellone (app mobile / Action Cable).
class SyncState
SCORE_KEYS = %w[home_sets away_sets home_points away_points current_set].freeze
def initialize(session:, payload:)
@session = session
@payload = payload.stringify_keys
end
def call
score = @session.score_state || @session.create_score_state!(
home_sets: 0, away_sets: 0, home_points: 0, away_points: 0, current_set: 1, set_partials: []
)
attrs = {}
SCORE_KEYS.each do |key|
attrs[key] = @payload[key] if @payload.key?(key)
end
attrs[:set_partials] = @payload["set_partials"] if @payload.key?("set_partials")
score.update!(attrs)
SessionChannel.broadcast_message(@session, score.as_cable_payload)
score
Engine.for(@session.match).sync(session: @session, payload: @payload)
end
end
end