Diffuser/lib/diffuser/accounts.ex

206 lines
3.4 KiB
Elixir

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