115 lines
2.4 KiB
Elixir
115 lines
2.4 KiB
Elixir
defmodule SomethingErlang.Accounts do
|
|
@moduledoc """
|
|
The Accounts context.
|
|
"""
|
|
|
|
import Ecto.Query, warn: false
|
|
alias SomethingErlang.Repo
|
|
|
|
alias SomethingErlang.AwfulApi.Client
|
|
alias SomethingErlang.Accounts.{User, UserToken}
|
|
|
|
## Database getters
|
|
|
|
def get_user_by_bbuserid(bbuserid) when is_binary(bbuserid) do
|
|
Repo.get_by(User, :bbuserid, bbuserid)
|
|
end
|
|
|
|
def get_or_create_user_by_bbuserid(bbuserid)
|
|
when is_binary(bbuserid) do
|
|
if user = Repo.get_by(User, bbuserid: bbuserid) do
|
|
user
|
|
else
|
|
%User{bbuserid: bbuserid} |> Repo.insert!()
|
|
end
|
|
end
|
|
|
|
def login_sa_user_and_get_cookies(username, password)
|
|
when is_binary(username) and is_binary(password) do
|
|
case Client.login(username, password) do
|
|
%{bbuserid: userid, bbpassword: _hash} = bbuser ->
|
|
user = get_or_create_user_by_bbuserid(userid)
|
|
Map.merge(user, bbuser)
|
|
|
|
_ ->
|
|
nil
|
|
end
|
|
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
|
|
|
|
@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
|
|
|
|
## Session
|
|
|
|
@doc """
|
|
Generates a session token.
|
|
"""
|
|
def generate_user_session_token(user) do
|
|
{token, user_token} = UserToken.build_session_token(user)
|
|
Repo.insert!(user_token)
|
|
token
|
|
end
|
|
|
|
@doc """
|
|
Gets the user with the given signed token.
|
|
"""
|
|
def get_user_by_session_token(token) do
|
|
{:ok, query} = UserToken.verify_session_token_query(token)
|
|
Repo.one(query)
|
|
end
|
|
|
|
@doc """
|
|
Deletes the signed token with the given context.
|
|
"""
|
|
def delete_user_session_token(token) do
|
|
Repo.delete_all(UserToken.token_and_context_query(token, "session"))
|
|
:ok
|
|
end
|
|
end
|