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