diff --git a/lib/safira/contest.ex b/lib/safira/contest.ex index 961455ab..2b4d6a73 100644 --- a/lib/safira/contest.ex +++ b/lib/safira/contest.ex @@ -801,6 +801,20 @@ defmodule Safira.Contest do |> Repo.aggregate(:count, :id) end + def list_final_draw do + br_query = + BadgeRedeem + |> group_by([br], br.attendee_id) + |> having([br], count(br.id) >= 10) + |> select([br, at, u], %{attendee_id: br.attendee_id, count: count(br.id)}) + + Attendee + |> join(:inner, [at], br in subquery(br_query), on: br.attendee_id == at.id) + |> where([at, br], not at.ineligible) + |> preload(:user) + |> Repo.all() + end + @doc """ Gets the count of badges for a category. diff --git a/lib/safira_web/controllers/download_controller.ex b/lib/safira_web/controllers/download_controller.ex index 6f6a4058..47ada653 100644 --- a/lib/safira_web/controllers/download_controller.ex +++ b/lib/safira_web/controllers/download_controller.ex @@ -5,6 +5,7 @@ defmodule SafiraWeb.DownloadController do alias Safira.Accounts alias Safira.Companies + alias Safira.Contest def generate_credentials(conn, %{"count" => count}) do {count_int, ""} = Integer.parse(count) @@ -59,7 +60,7 @@ defmodule SafiraWeb.DownloadController do |> put_resp_header("content-disposition", "attachment; filename=\"final_draw.csv\"") |> send_chunked(200) - Accounts.list_attendees() + Contest.list_final_draw() |> Stream.flat_map(&final_draw_lines/1) |> Stream.map(&CSV.dump_to_iodata(&1)) |> Enum.reduce(conn, fn chunk, conn -> @@ -169,13 +170,9 @@ defmodule SafiraWeb.DownloadController do |> to_string() end - defp final_draw_lines(user) do - if user.attendee.entries < 10 or user.attendee.ineligible do - [] - else - for _ <- 1..user.attendee.entries do - [[user.id, user.name, user.handle]] - end + defp final_draw_lines(attendee) do + for _ <- 1..attendee.entries do + [[attendee.user.id, attendee.user.name, attendee.user.handle]] end end