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) Streams::Overlay::Refresh.call(@session) score end end end