Skip to content

Commit

Permalink
feat: add remove attendee tokens by day (#533)
Browse files Browse the repository at this point in the history
  • Loading branch information
nunom27 authored Feb 13, 2025
1 parent 2d0ae3c commit 8524a2f
Showing 1 changed file with 40 additions and 2 deletions.
42 changes: 40 additions & 2 deletions lib/safira/contest.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit 8524a2f

Please sign in to comment.