109 lines
2.0 KiB
Elixir
109 lines
2.0 KiB
Elixir
defmodule Bright.Users do
|
|
@moduledoc """
|
|
The Users context.
|
|
"""
|
|
|
|
import Ecto.Query, warn: false
|
|
alias Bright.Repo
|
|
|
|
alias Bright.Users.User
|
|
|
|
## Database getters
|
|
|
|
@doc """
|
|
Get a user using ueberauth data
|
|
"""
|
|
def get_by_ueberauth(%{provider: :github, uid: uid}) do
|
|
Repo.get_by(User, github_id: uid)
|
|
end
|
|
|
|
def get_by_ueberauth(%{provider: :patreon, uid: uid}) do
|
|
Repo.get_by(User, patreon_id: uid)
|
|
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 """
|
|
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)
|
|
|
|
## User registration
|
|
|
|
@spec register_user(
|
|
:invalid
|
|
| %{optional(:__struct__) => none(), optional(atom() | binary()) => any()}
|
|
) :: any()
|
|
@doc """
|
|
Registers a user.
|
|
|
|
## Examples
|
|
|
|
iex> register_user(%{field: value})
|
|
{:ok, %User{}}
|
|
|
|
iex> register_user(%{field: bad_value})
|
|
{:error, %Ecto.Changeset{}}
|
|
|
|
"""
|
|
def register_user(attrs) do
|
|
%User{}
|
|
|> User.registration_changeset(attrs)
|
|
|> Repo.insert()
|
|
end
|
|
|
|
@doc """
|
|
Returns an `%Ecto.Changeset{}` for tracking user changes.
|
|
|
|
## Examples
|
|
|
|
iex> change_user_registration(user)
|
|
%Ecto.Changeset{data: %User{}}
|
|
|
|
"""
|
|
def change_user_registration(%User{} = user, attrs \\ %{}) do
|
|
User.registration_changeset(user, attrs)
|
|
end
|
|
|
|
## Settings
|
|
|
|
## Session
|
|
|
|
def decoded_data(encoded) do
|
|
case Base.decode16(encoded) do
|
|
{:ok, decoded} -> {:ok, String.split(decoded, "|")}
|
|
:error -> {:error, ["", ""]}
|
|
end
|
|
end
|
|
|
|
def admin?(%User{id: id}) when id in [1], do: true
|
|
def admin?(_), do: false
|
|
end
|