58 lines
1.6 KiB
Ruby
58 lines
1.6 KiB
Ruby
module Tournaments
|
|
class SyncAssignments
|
|
def self.call(invitation:)
|
|
new(invitation).sync_invitation!
|
|
end
|
|
|
|
def self.sync_match!(match)
|
|
return unless match.tournament_id.present?
|
|
|
|
match.tournament.broadcast_invitations.accepted.find_each do |invitation|
|
|
new(invitation).sync_invitation!
|
|
end
|
|
end
|
|
|
|
def initialize(invitation)
|
|
@invitation = invitation
|
|
end
|
|
|
|
def sync_invitation!
|
|
return unless @invitation.accepted_at.present?
|
|
return unless @invitation.accepted_by_id.present?
|
|
|
|
desired_ids = resolve_match_ids
|
|
existing = @invitation.assignments.index_by(&:match_id)
|
|
|
|
desired_ids.each do |match_id|
|
|
next if existing[match_id]
|
|
|
|
TournamentBroadcastAssignment.find_or_create_by!(
|
|
tournament_id: @invitation.tournament_id,
|
|
match_id: match_id,
|
|
user_id: @invitation.accepted_by_id
|
|
) do |row|
|
|
row.invitation = @invitation
|
|
end
|
|
end
|
|
|
|
stale = existing.keys - desired_ids
|
|
@invitation.assignments.where(match_id: stale).delete_all if stale.any?
|
|
end
|
|
|
|
private
|
|
|
|
def resolve_match_ids
|
|
matches = @invitation.tournament.matches
|
|
case @invitation.scope_kind
|
|
when "court_day"
|
|
matches
|
|
.where(court: @invitation.court)
|
|
.where("scheduled_at >= ? AND scheduled_at < ?", @invitation.on_date.beginning_of_day, @invitation.on_date.end_of_day)
|
|
.pluck(:id)
|
|
else
|
|
Array(@invitation.match_ids).map(&:to_s).intersection(matches.pluck(:id).map(&:to_s))
|
|
end
|
|
end
|
|
end
|
|
end
|