Skip to content

Commit 8524a2f

Browse files
authored
feat: add remove attendee tokens by day (#533)
1 parent 2d0ae3c commit 8524a2f

File tree

1 file changed

+40
-2
lines changed

1 file changed

+40
-2
lines changed

lib/safira/contest.ex

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,9 +403,10 @@ defmodule Safira.Contest do
403403
})
404404
end)
405405
|> Multi.merge(fn %{badge_redeem: badge_redeem} ->
406-
change_attendee_tokens_transaction(
406+
remove_attendee_tokens_by_day_transaction(
407407
badge_redeem.attendee,
408-
max(badge_redeem.attendee.tokens - badge_redeem.badge.tokens, 0)
408+
badge_redeem.badge.tokens,
409+
badge_redeem.inserted_at
409410
)
410411
end)
411412
|> Repo.transaction()
@@ -846,6 +847,43 @@ defmodule Safira.Contest do
846847
end)
847848
end
848849

850+
@doc """
851+
Transaction for removing tokens from the attendee and the daily tokens by day.
852+
"""
853+
def remove_attendee_tokens_by_day_transaction(
854+
attendee,
855+
tokens,
856+
date,
857+
attendee_update_tokens_operation_name \\ :attendee_update_tokens,
858+
daily_tokens_fetch_operation_name \\ :daily_tokens_fetch,
859+
daily_tokens_update_operation_name \\ :daily_tokens_update
860+
) do
861+
date =
862+
case date do
863+
%DateTime{} -> DateTime.to_date(date)
864+
%Date{} -> DateTime.to_date(date)
865+
end
866+
867+
Multi.new()
868+
|> Multi.update(
869+
attendee_update_tokens_operation_name,
870+
Attendee.changeset(attendee, %{tokens: max(attendee.tokens - tokens, 0)})
871+
)
872+
|> Multi.run(daily_tokens_fetch_operation_name, fn repo, _changes ->
873+
{:ok,
874+
repo.one(
875+
from dt in DailyTokens, where: dt.attendee_id == ^attendee.id and dt.date == ^date
876+
) || %DailyTokens{date: date, attendee_id: attendee.id}}
877+
end)
878+
|> Multi.insert_or_update(daily_tokens_update_operation_name, fn changes ->
879+
daily_tokens = Map.get(changes, daily_tokens_fetch_operation_name)
880+
881+
DailyTokens.changeset(daily_tokens, %{
882+
tokens: if(daily_tokens.tokens, do: max(daily_tokens.tokens - tokens, 0), else: 0)
883+
})
884+
end)
885+
end
886+
849887
@doc """
850888
Returns the list of badge_redeems.
851889

0 commit comments

Comments
 (0)