Files
something-erlang/lib/something_erlang/accounts.ex

115 lines
2.4 KiB
Elixir
Raw Normal View History

2022-05-23 15:57:15 +02:00
defmodule SomethingErlang.Accounts do
@moduledoc """
The Accounts context.
"""
import Ecto.Query, warn: false
alias SomethingErlang.Repo
2024-03-29 15:54:42 +01:00
alias SomethingErlang.AwfulApi.Client
2024-03-30 20:51:36 +01:00
alias SomethingErlang.Accounts.{User, UserToken}
2022-05-23 15:57:15 +02:00
## Database getters
2024-03-29 15:54:42 +01:00
def get_user_by_bbuserid(bbuserid) when is_binary(bbuserid) do
Repo.get_by(User, :bbuserid, bbuserid)
2022-05-23 15:57:15 +02:00
end
2024-03-29 15:54:42 +01:00
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
2022-05-23 15:57:15 +02:00
2024-03-29 15:54:42 +01:00
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)
2022-05-23 15:57:15 +02:00
2024-03-29 15:54:42 +01:00
_ ->
nil
end
2022-05-23 15:57:15 +02:00
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
2024-03-29 15:54:42 +01:00
User.registration_changeset(user, attrs)
2022-05-23 15:57:15 +02:00
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.
"""
2023-01-18 16:13:51 +01:00
def delete_user_session_token(token) do
2022-05-23 15:57:15 +02:00
Repo.delete_all(UserToken.token_and_context_query(token, "session"))
:ok
end
end