defmodule Localiser.Domain.Users do alias Localiser.Repo alias Localiser.Domain.Schema.User def list_users, do: Repo.all(User) def get_user!(id), do: Repo.get!(User, id) def get_user(id) do case Repo.get(User, id) do nil -> {:error, :not_found} user -> {:ok, user} end end def any?, do: Repo.exists?(User) def get_user_by_username(username) do Repo.get_by(User, username: username) end def create_user(attrs) do %User{} |> User.changeset(attrs) |> Repo.insert() end def update_user(%User{} = user, attrs) do user |> User.changeset(attrs) |> Repo.update() end def promote_to_admin(%User{} = user) do user |> Ecto.Changeset.change(is_admin: true) |> Repo.update() end def delete_user(%User{} = user), do: Repo.delete(user) def authenticate_user(username, password) do user = get_user_by_username(username) cond do user && Argon2.verify_pass(password, user.password_hash) -> {:ok, user} user -> {:error, :invalid_credentials} true -> Argon2.no_user_verify() {:error, :invalid_credentials} end end end