lib/baz/collection_events.ex

defmodule Baz.CollectionEvents do
  alias Baz.Repo
  alias Baz.CollectionEvents.CollectionEvent
  alias Baz.CollectionEvents.Queries

  @type collection_event :: CollectionEvent.t()
  @type filter_and_order_opts :: Queries.FilterAndOrder.opts()

  @doc """
  Gets collection_events that match the where clause sorted by the order clause.

  ## Examples

      iex> filter_and_order(where: [venue: "open_sea"], order: [desc: :venue])
      [%CollectionEvent{}]

  """
  @spec filter_and_order(filter_and_order_opts) :: [collection_event]
  def filter_and_order(opts) do
    opts
    |> Queries.FilterAndOrder.new()
    |> Repo.all()
  end

  @doc """
  Gets a single collection_event.

  Raises `Ecto.NoResultsError` if the CollectionEvent does not exist.

  ## Examples

      iex> get_collection_event!("open_sea")
      %CollectionEvent{}

      iex> get_collection_event!("open_zea")
      ** (Ecto.NoResultsError)

  """
  @spec get_collection_event!(non_neg_integer) :: collection_event
  def get_collection_event!(id), do: Repo.get_by!(CollectionEvent, id: id)

  @doc """
  Returns an `%Ecto.Changeset{}` for tracking collection_event changes.

  ## Examples

      iex> collection_event_changeset(%{})
      %CollectionEvent{}

  """
  @spec collection_event_changeset(map) :: Ecto.Changeset.t() | {:error, term}
  def collection_event_changeset(attrs) do
    CollectionEvent.changeset(%CollectionEvent{}, attrs)
  end

  @spec create_collection_event(map) :: {:ok, collection_event} | {:error, term}
  def create_collection_event(attrs) do
    %CollectionEvent{}
    |> CollectionEvent.changeset(attrs)
    |> Repo.insert()
  end

  @doc """
  Deletes a collection_event.

  ## Examples

      iex> delete_collection_event(collection_event)
      {:ok, %CollectionEvent{}}

      iex> delete_collection_event(collection_event)
      {:error, %Ecto.Changeset{}}

  """
  def delete_collection_event(%CollectionEvent{} = collection_event) do
    Repo.delete(collection_event)
  end
end