From 342e76b6c1e14785b01892837dbd95b61ac82526 Mon Sep 17 00:00:00 2001 From: Nuno Miguel Date: Thu, 13 Feb 2025 13:07:11 +0000 Subject: [PATCH] feat: add remove attendee tokens by day --- lib/safira/contest.ex | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/lib/safira/contest.ex b/lib/safira/contest.ex index 52000b8d..b6348f5d 100644 --- a/lib/safira/contest.ex +++ b/lib/safira/contest.ex @@ -403,9 +403,10 @@ defmodule Safira.Contest do }) end) |> Multi.merge(fn %{badge_redeem: badge_redeem} -> - change_attendee_tokens_transaction( + remove_attendee_tokens_by_day_transaction( badge_redeem.attendee, - max(badge_redeem.attendee.tokens - badge_redeem.badge.tokens, 0) + badge_redeem.badge.tokens, + badge_redeem.inserted_at ) end) |> Repo.transaction() @@ -846,6 +847,43 @@ defmodule Safira.Contest do end) end + @doc """ + Transaction for removing tokens from the attendee and the daily tokens by day. + """ + def remove_attendee_tokens_by_day_transaction( + attendee, + tokens, + date, + attendee_update_tokens_operation_name \\ :attendee_update_tokens, + daily_tokens_fetch_operation_name \\ :daily_tokens_fetch, + daily_tokens_update_operation_name \\ :daily_tokens_update + ) do + date = + case date do + %DateTime{} -> DateTime.to_date(date) + %Date{} -> DateTime.to_date(date) + end + + Multi.new() + |> Multi.update( + attendee_update_tokens_operation_name, + Attendee.changeset(attendee, %{tokens: max(attendee.tokens - tokens, 0)}) + ) + |> Multi.run(daily_tokens_fetch_operation_name, fn repo, _changes -> + {:ok, + repo.one( + from dt in DailyTokens, where: dt.attendee_id == ^attendee.id and dt.date == ^date + ) || %DailyTokens{date: date, attendee_id: attendee.id}} + end) + |> Multi.insert_or_update(daily_tokens_update_operation_name, fn changes -> + daily_tokens = Map.get(changes, daily_tokens_fetch_operation_name) + + DailyTokens.changeset(daily_tokens, %{ + tokens: if(daily_tokens.tokens, do: max(daily_tokens.tokens - tokens, 0), else: 0) + }) + end) + end + @doc """ Returns the list of badge_redeems.