@@ -104,6 +104,15 @@ defmodule Safira.Contest do
104104 |> Repo . all ( )
105105 end
106106
107+ def list_attendee_redeems_meta ( attendee_id , params ) do
108+ BadgeRedeem
109+ |> join ( :inner , [ br ] , b in Badge , on: b . id == br . badge_id , as: :badge )
110+ |> where ( [ br , b ] , br . attendee_id == ^ attendee_id )
111+ |> preload ( [ :badge , attendee: [ :user ] , redeemed_by: [ :user ] ] )
112+ |> order_by ( [ br ] , desc: br . inserted_at )
113+ |> Flop . validate_and_run ( params , for: BadgeRedeem )
114+ end
115+
107116 @ doc """
108117 Lists all badge redeems belonging to a badge.
109118
@@ -168,7 +177,7 @@ defmodule Safira.Contest do
168177 |> where ( [ br ] , br . badge_id == ^ badge_id )
169178 |> join ( :inner , [ br ] , a in assoc ( br , :attendee ) , as: :attendee )
170179 |> join ( :inner , [ br , a ] , u in assoc ( a , :user ) , as: :user )
171- |> preload ( attendee: [ :user ] )
180+ |> preload ( attendee: [ :user ] , redeemed_by: [ :user ] )
172181 |> apply_filters ( opts )
173182 |> Flop . validate_and_run ( params , for: BadgeRedeem )
174183 end
@@ -376,6 +385,32 @@ defmodule Safira.Contest do
376385 Repo . get! ( DailyPrize , id )
377386 end
378387
388+ def revoke_badge_redeem_from_attendee ( badge_redeem_id ) do
389+ revoke_badge_redeem_transaction ( badge_redeem_id )
390+ end
391+
392+ defp revoke_badge_redeem_transaction ( badge_redeem_id ) do
393+ Multi . new ( )
394+ |> Multi . run ( :badge_redeem , fn _repo , _changes ->
395+ { :ok , get_badge_redeem! ( badge_redeem_id , preloads: [ :badge , :attendee ] ) }
396+ end )
397+ |> Multi . delete ( :remove_badge_from_attendee , fn % { badge_redeem: badge_redeem } ->
398+ badge_redeem
399+ end )
400+ |> Multi . update ( :attendee_update_entries , fn % { badge_redeem: badge_redeem } ->
401+ Attendee . changeset ( badge_redeem . attendee , % {
402+ entries: max ( badge_redeem . attendee . entries - badge_redeem . badge . entries , 0 )
403+ } )
404+ end )
405+ |> Multi . merge ( fn % { badge_redeem: badge_redeem } ->
406+ change_attendee_tokens_transaction (
407+ badge_redeem . attendee ,
408+ max ( badge_redeem . attendee . tokens - badge_redeem . badge . tokens , 0 )
409+ )
410+ end )
411+ |> Repo . transaction ( )
412+ end
413+
379414 @ doc """
380415 Creates a daily prize.
381416
0 commit comments