defmodule Diffuser.Accounts do @moduledoc """ The Accounts context. """ import Ecto.Query, warn: false alias Diffuser.Repo alias Diffuser.Accounts.User alias Diffuser.Generator.PromptRequest @doc """ Returns the list of users. ## Examples iex> list_users() [%User{}, ...] """ def list_users do Repo.all(User) end @doc """ Gets a single user. Raises `Ecto.NoResultsError` if the User does not exist. ## Examples iex> get_user!(123) %User{} iex> get_user!(456) ** (Ecto.NoResultsError) """ def get_user!(id), do: Repo.get!(User, id) |> Repo.preload(votes: [:prompt_request]) @doc """ Creates a user. ## Examples iex> create_user(%{field: value}) {:ok, %User{}} iex> create_user(%{field: bad_value}) {:error, %Ecto.Changeset{}} """ def create_user(attrs \\ %{}) do %User{} |> User.changeset(attrs) |> Repo.insert() end @doc """ Updates a user. ## Examples iex> update_user(user, %{field: new_value}) {:ok, %User{}} iex> update_user(user, %{field: bad_value}) {:error, %Ecto.Changeset{}} """ def update_user(%User{} = user, attrs) do user |> User.changeset(attrs) |> Repo.update() end @doc """ Deletes a user. ## Examples iex> delete_user(user) {:ok, %User{}} iex> delete_user(user) {:error, %Ecto.Changeset{}} """ def delete_user(%User{} = user) do Repo.delete(user) end @doc """ Returns an `%Ecto.Changeset{}` for tracking user changes. ## Examples iex> change_user(user) %Ecto.Changeset{data: %User{}} """ def change_user(%User{} = user, attrs \\ %{}) do User.changeset(user, attrs) end alias Diffuser.Accounts.Vote @doc """ Returns the list of votes. ## Examples iex> list_votes() [%Vote{}, ...] """ def list_votes do Repo.all(Vote) end @doc """ Gets a single vote. Raises `Ecto.NoResultsError` if the Vote does not exist. ## Examples iex> get_vote!(123) %Vote{} iex> get_vote!(456) ** (Ecto.NoResultsError) """ def get_vote!(id), do: Repo.get!(Vote, id) @doc """ Creates a vote. ## Examples iex> create_vote(%{field: value}) {:ok, %Vote{}} iex> create_vote(%{field: bad_value}) {:error, %Ecto.Changeset{}} """ def create_vote(%{user: user} = attrs) do %Vote{} |> Vote.changeset(attrs) |> Ecto.Changeset.put_assoc(:user, user) |> Repo.insert() end @doc """ Updates a vote. ## Examples iex> update_vote(vote, %{field: new_value}) {:ok, %Vote{}} iex> update_vote(vote, %{field: bad_value}) {:error, %Ecto.Changeset{}} """ def update_vote(%Vote{} = vote, attrs) do vote |> Vote.changeset(attrs) |> Repo.update() end @doc """ Deletes a vote. ## Examples iex> delete_vote(vote) {:ok, %Vote{}} iex> delete_vote(vote) {:error, %Ecto.Changeset{}} """ def delete_vote(%Vote{} = vote) do Repo.delete(vote) end @doc """ Returns an `%Ecto.Changeset{}` for tracking vote changes. ## Examples iex> change_vote(vote) %Ecto.Changeset{data: %Vote{}} """ def change_vote(%Vote{} = vote, attrs \\ %{}) do Vote.changeset(vote, attrs) end def upvote(user, %PromptRequest{id: pr}), do: create_vote(%{prompt_request_id: pr, user: user}) end