lib/bbox/candidates.ex

defmodule Bbox.Candidates do
  @moduledoc """
  Candidates module.
  """
  alias Bbox.Repo
  alias Bbox.Candidates.Candidate
  alias Bbox.Parties.Party

  @doc """
  Create a new candidate.
  """
  @spec insert(%Party{}, map()) :: {:ok, %Candidate{}} | {:error, charlist()}
  def insert(party, params \\ %{}) do
    candidate = Ecto.build_assoc(party, :candidates, params)
    candidate = Candidate.changeset(candidate, params)

    {:ok, candidate} = Repo.insert(candidate)
    :telemetry.execute([:bbox, :candidates, :insert], %{candidate: candidate})

    {:ok, candidate}
  end

  @doc """
  List all candidates.
  """
  @spec list!() :: [%Candidate{}]
  def list!() do
    candidates =
      Candidate
      |> Repo.all()

    :telemetry.execute([:bbox, :candidates, :list!], %{candidates: candidates})

    candidates
  end

  @doc """
  Get candidate by code.
  """
  @spec get_by_code!(charlist()) :: %Candidate{}
  def get_by_code!(code) do
    Candidate
    |> Repo.get_by!(code: code)
  end
end