forked from shibao/cannery
		
	improve changesets and typespecs
This commit is contained in:
		@@ -23,7 +23,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      nil
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec get_user_by_email(String.t()) :: User.t() | nil
 | 
			
		||||
  @spec get_user_by_email(email :: String.t()) :: User.t() | nil
 | 
			
		||||
  def get_user_by_email(email) when is_binary(email), do: Repo.get_by(User, email: email)
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
@@ -38,7 +38,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      nil
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec get_user_by_email_and_password(String.t(), String.t()) ::
 | 
			
		||||
  @spec get_user_by_email_and_password(email :: String.t(), password :: String.t()) ::
 | 
			
		||||
          User.t() | nil
 | 
			
		||||
  def get_user_by_email_and_password(email, password)
 | 
			
		||||
      when is_binary(email) and is_binary(password) do
 | 
			
		||||
@@ -86,7 +86,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      [%User{}]
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec list_users_by_role(:admin | :user) :: [User.t()]
 | 
			
		||||
  @spec list_users_by_role(User.role()) :: [User.t()]
 | 
			
		||||
  def list_users_by_role(role) do
 | 
			
		||||
    role = role |> to_string()
 | 
			
		||||
    Repo.all(from u in User, where: u.role == ^role, order_by: u.email)
 | 
			
		||||
@@ -106,15 +106,21 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      {:error, %Changeset{}}
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec register_user(map()) :: {:ok, User.t()} | {:error, Changeset.t(User.new_user())}
 | 
			
		||||
  @spec register_user(attrs :: map()) :: {:ok, User.t()} | {:error, User.changeset()}
 | 
			
		||||
  def register_user(attrs) do
 | 
			
		||||
    # if no registered users, make first user an admin
 | 
			
		||||
    role =
 | 
			
		||||
      if Repo.one!(from u in User, select: count(u.id), distinct: true) == 0,
 | 
			
		||||
        do: "admin",
 | 
			
		||||
        else: "user"
 | 
			
		||||
    Multi.new()
 | 
			
		||||
    |> Multi.one(:users_count, from(u in User, select: count(u.id), distinct: true))
 | 
			
		||||
    |> Multi.insert(:add_user, fn %{users_count: count} ->
 | 
			
		||||
      # if no registered users, make first user an admin
 | 
			
		||||
      role = if count == 0, do: "admin", else: "user"
 | 
			
		||||
 | 
			
		||||
    %User{} |> User.registration_changeset(attrs |> Map.put("role", role)) |> Repo.insert()
 | 
			
		||||
      User.registration_changeset(attrs) |> User.role_changeset(role)
 | 
			
		||||
    end)
 | 
			
		||||
    |> Repo.transaction()
 | 
			
		||||
    |> case do
 | 
			
		||||
      {:ok, %{add_user: user}} -> {:ok, user}
 | 
			
		||||
      {:error, :add_user, changeset, _changes_so_far} -> {:error, changeset}
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
@@ -126,12 +132,10 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      %Changeset{data: %User{}}
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec change_user_registration(User.t() | User.new_user()) ::
 | 
			
		||||
          Changeset.t(User.t() | User.new_user())
 | 
			
		||||
  @spec change_user_registration(User.t() | User.new_user(), map()) ::
 | 
			
		||||
          Changeset.t(User.t() | User.new_user())
 | 
			
		||||
  def change_user_registration(user, attrs \\ %{}),
 | 
			
		||||
    do: User.registration_changeset(user, attrs, hash_password: false)
 | 
			
		||||
  @spec change_user_registration() :: User.changeset()
 | 
			
		||||
  @spec change_user_registration(attrs :: map()) :: User.changeset()
 | 
			
		||||
  def change_user_registration(attrs \\ %{}),
 | 
			
		||||
    do: User.registration_changeset(attrs, hash_password: false)
 | 
			
		||||
 | 
			
		||||
  ## Settings
 | 
			
		||||
 | 
			
		||||
@@ -144,7 +148,8 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      %Changeset{data: %User{}}
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec change_user_email(User.t(), map()) :: Changeset.t(User.t())
 | 
			
		||||
  @spec change_user_email(User.t()) :: User.changeset()
 | 
			
		||||
  @spec change_user_email(User.t(), attrs :: map()) :: User.changeset()
 | 
			
		||||
  def change_user_email(user, attrs \\ %{}), do: User.email_changeset(user, attrs)
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
@@ -156,7 +161,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      %Changeset{data: %User{}}
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec change_user_role(User.t(), atom()) :: Changeset.t(User.t())
 | 
			
		||||
  @spec change_user_role(User.t(), User.role()) :: User.changeset()
 | 
			
		||||
  def change_user_role(user, role), do: User.role_changeset(user, role)
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
@@ -172,8 +177,8 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      {:error, %Changeset{}}
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec apply_user_email(User.t(), String.t(), map()) ::
 | 
			
		||||
          {:ok, User.t()} | {:error, Changeset.t(User.t())}
 | 
			
		||||
  @spec apply_user_email(User.t(), email :: String.t(), attrs :: map()) ::
 | 
			
		||||
          {:ok, User.t()} | {:error, User.changeset()}
 | 
			
		||||
  def apply_user_email(user, password, attrs) do
 | 
			
		||||
    user
 | 
			
		||||
    |> User.email_changeset(attrs)
 | 
			
		||||
@@ -187,7 +192,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
  If the token matches, the user email is updated and the token is deleted.
 | 
			
		||||
  The confirmed_at date is also updated to the current time.
 | 
			
		||||
  """
 | 
			
		||||
  @spec update_user_email(User.t(), String.t()) :: :ok | :error
 | 
			
		||||
  @spec update_user_email(User.t(), token :: String.t()) :: :ok | :error
 | 
			
		||||
  def update_user_email(user, token) do
 | 
			
		||||
    context = "change:#{user.email}"
 | 
			
		||||
 | 
			
		||||
@@ -200,7 +205,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @spec user_email_multi(User.t(), String.t(), String.t()) :: Multi.t()
 | 
			
		||||
  @spec user_email_multi(User.t(), email :: String.t(), context :: String.t()) :: Multi.t()
 | 
			
		||||
  defp user_email_multi(user, email, context) do
 | 
			
		||||
    changeset = user |> User.email_changeset(%{email: email}) |> User.confirm_changeset()
 | 
			
		||||
 | 
			
		||||
@@ -218,7 +223,8 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      {:ok, %{to: ..., body: ...}}
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec deliver_update_email_instructions(User.t(), String.t(), function) :: Job.t()
 | 
			
		||||
  @spec deliver_update_email_instructions(User.t(), current_email :: String.t(), function) ::
 | 
			
		||||
          Job.t()
 | 
			
		||||
  def deliver_update_email_instructions(user, current_email, update_email_url_fun)
 | 
			
		||||
      when is_function(update_email_url_fun, 1) do
 | 
			
		||||
    {encoded_token, user_token} = UserToken.build_email_token(user, "change:#{current_email}")
 | 
			
		||||
@@ -235,7 +241,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      %Changeset{data: %User{}}
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec change_user_password(User.t(), map()) :: Changeset.t(User.t())
 | 
			
		||||
  @spec change_user_password(User.t(), attrs :: map()) :: User.changeset()
 | 
			
		||||
  def change_user_password(user, attrs \\ %{}),
 | 
			
		||||
    do: User.password_changeset(user, attrs, hash_password: false)
 | 
			
		||||
 | 
			
		||||
@@ -251,8 +257,8 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      {:error, %Changeset{}}
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec update_user_password(User.t(), String.t(), map()) ::
 | 
			
		||||
          {:ok, User.t()} | {:error, Changeset.t(User.t())}
 | 
			
		||||
  @spec update_user_password(User.t(), String.t(), attrs :: map()) ::
 | 
			
		||||
          {:ok, User.t()} | {:error, User.changeset()}
 | 
			
		||||
  def update_user_password(user, password, attrs) do
 | 
			
		||||
    changeset =
 | 
			
		||||
      user
 | 
			
		||||
@@ -278,7 +284,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      %Changeset{data: %User{}}
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec change_user_locale(User.t()) :: Changeset.t(User.t())
 | 
			
		||||
  @spec change_user_locale(User.t()) :: User.changeset()
 | 
			
		||||
  def change_user_locale(%{locale: locale} = user), do: User.locale_changeset(user, locale)
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
@@ -294,7 +300,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec update_user_locale(User.t(), locale :: String.t()) ::
 | 
			
		||||
          {:ok, User.t()} | {:error, Changeset.t(User.t())}
 | 
			
		||||
          {:ok, User.t()} | {:error, User.changeset()}
 | 
			
		||||
  def update_user_locale(user, locale),
 | 
			
		||||
    do: user |> User.locale_changeset(locale) |> Repo.update()
 | 
			
		||||
 | 
			
		||||
@@ -310,7 +316,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      %User{}
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec delete_user!(User.t(), User.t()) :: User.t()
 | 
			
		||||
  @spec delete_user!(user_to_delete :: User.t(), User.t()) :: User.t()
 | 
			
		||||
  def delete_user!(user, %User{role: :admin}), do: user |> Repo.delete!()
 | 
			
		||||
  def delete_user!(%User{id: user_id} = user, %User{id: user_id}), do: user |> Repo.delete!()
 | 
			
		||||
 | 
			
		||||
@@ -329,7 +335,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
  @doc """
 | 
			
		||||
  Gets the user with the given signed token.
 | 
			
		||||
  """
 | 
			
		||||
  @spec get_user_by_session_token(String.t()) :: User.t()
 | 
			
		||||
  @spec get_user_by_session_token(token :: String.t()) :: User.t()
 | 
			
		||||
  def get_user_by_session_token(token) do
 | 
			
		||||
    {:ok, query} = UserToken.verify_session_token_query(token)
 | 
			
		||||
    Repo.one(query)
 | 
			
		||||
@@ -338,7 +344,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
  @doc """
 | 
			
		||||
  Deletes the signed token with the given context.
 | 
			
		||||
  """
 | 
			
		||||
  @spec delete_session_token(String.t()) :: :ok
 | 
			
		||||
  @spec delete_session_token(token :: String.t()) :: :ok
 | 
			
		||||
  def delete_session_token(token) do
 | 
			
		||||
    Repo.delete_all(UserToken.token_and_context_query(token, "session"))
 | 
			
		||||
    :ok
 | 
			
		||||
@@ -394,7 +400,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
  If the token matches, the user account is marked as confirmed
 | 
			
		||||
  and the token is deleted.
 | 
			
		||||
  """
 | 
			
		||||
  @spec confirm_user(String.t()) :: {:ok, User.t()} | atom()
 | 
			
		||||
  @spec confirm_user(token :: String.t()) :: {:ok, User.t()} | :error
 | 
			
		||||
  def confirm_user(token) do
 | 
			
		||||
    with {:ok, query} <- UserToken.verify_email_token_query(token, "confirm"),
 | 
			
		||||
         %User{} = user <- Repo.one(query),
 | 
			
		||||
@@ -443,7 +449,7 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      nil
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec get_user_by_reset_password_token(String.t()) :: User.t() | nil
 | 
			
		||||
  @spec get_user_by_reset_password_token(token :: String.t()) :: User.t() | nil
 | 
			
		||||
  def get_user_by_reset_password_token(token) do
 | 
			
		||||
    with {:ok, query} <- UserToken.verify_email_token_query(token, "reset_password"),
 | 
			
		||||
         %User{} = user <- Repo.one(query) do
 | 
			
		||||
@@ -465,7 +471,8 @@ defmodule Cannery.Accounts do
 | 
			
		||||
      {:error, %Changeset{}}
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec reset_user_password(User.t(), map()) :: {:ok, User.t()} | {:error, Changeset.t(User.t())}
 | 
			
		||||
  @spec reset_user_password(User.t(), attrs :: map()) ::
 | 
			
		||||
          {:ok, User.t()} | {:error, User.changeset()}
 | 
			
		||||
  def reset_user_password(user, attrs) do
 | 
			
		||||
    Multi.new()
 | 
			
		||||
    |> Multi.update(:user, User.password_changeset(user, attrs))
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ defmodule Cannery.Accounts.User do
 | 
			
		||||
          password: String.t(),
 | 
			
		||||
          hashed_password: String.t(),
 | 
			
		||||
          confirmed_at: NaiveDateTime.t(),
 | 
			
		||||
          role: atom(),
 | 
			
		||||
          role: role(),
 | 
			
		||||
          locale: String.t() | nil,
 | 
			
		||||
          invites: [Invite.t()],
 | 
			
		||||
          inserted_at: NaiveDateTime.t(),
 | 
			
		||||
@@ -47,6 +47,8 @@ defmodule Cannery.Accounts.User do
 | 
			
		||||
        }
 | 
			
		||||
  @type new_user :: %User{}
 | 
			
		||||
  @type id :: UUID.t()
 | 
			
		||||
  @type changeset :: Changeset.t(t() | new_user())
 | 
			
		||||
  @type role :: :admin | :user | String.t()
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
  A user changeset for registration.
 | 
			
		||||
@@ -65,26 +67,24 @@ defmodule Cannery.Accounts.User do
 | 
			
		||||
      validations on a LiveView form), this option can be set to `false`.
 | 
			
		||||
      Defaults to `true`.
 | 
			
		||||
  """
 | 
			
		||||
  @spec registration_changeset(t() | new_user(), attrs :: map()) :: Changeset.t(t() | new_user())
 | 
			
		||||
  @spec registration_changeset(t() | new_user(), attrs :: map(), opts :: keyword()) ::
 | 
			
		||||
          Changeset.t(t() | new_user())
 | 
			
		||||
  def registration_changeset(user, attrs, opts \\ []) do
 | 
			
		||||
    user
 | 
			
		||||
    |> cast(attrs, [:email, :password, :role, :locale])
 | 
			
		||||
  @spec registration_changeset(attrs :: map()) :: changeset()
 | 
			
		||||
  @spec registration_changeset(attrs :: map(), opts :: keyword()) :: changeset()
 | 
			
		||||
  def registration_changeset(attrs, opts \\ []) do
 | 
			
		||||
    %User{}
 | 
			
		||||
    |> cast(attrs, [:email, :password, :locale])
 | 
			
		||||
    |> validate_email()
 | 
			
		||||
    |> validate_password(opts)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
  A user changeset for role.
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec role_changeset(t(), role :: atom()) :: Changeset.t(t())
 | 
			
		||||
  @spec role_changeset(t() | new_user() | changeset(), role()) :: changeset()
 | 
			
		||||
  def role_changeset(user, role) do
 | 
			
		||||
    user |> cast(%{"role" => role}, [:role])
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @spec validate_email(Changeset.t(t() | new_user())) :: Changeset.t(t() | new_user())
 | 
			
		||||
  @spec validate_email(changeset()) :: changeset()
 | 
			
		||||
  defp validate_email(changeset) do
 | 
			
		||||
    changeset
 | 
			
		||||
    |> validate_required([:email])
 | 
			
		||||
@@ -96,8 +96,8 @@ defmodule Cannery.Accounts.User do
 | 
			
		||||
    |> unique_constraint(:email)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @spec validate_password(Changeset.t(t() | new_user()), opts :: keyword()) ::
 | 
			
		||||
          Changeset.t(t() | new_user())
 | 
			
		||||
  @spec validate_password(changeset(), opts :: keyword()) ::
 | 
			
		||||
          changeset()
 | 
			
		||||
  defp validate_password(changeset, opts) do
 | 
			
		||||
    changeset
 | 
			
		||||
    |> validate_required([:password])
 | 
			
		||||
@@ -108,8 +108,7 @@ defmodule Cannery.Accounts.User do
 | 
			
		||||
    |> maybe_hash_password(opts)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @spec maybe_hash_password(Changeset.t(t() | new_user()), opts :: keyword()) ::
 | 
			
		||||
          Changeset.t(t() | new_user())
 | 
			
		||||
  @spec maybe_hash_password(changeset(), opts :: keyword()) :: changeset()
 | 
			
		||||
  defp maybe_hash_password(changeset, opts) do
 | 
			
		||||
    hash_password? = Keyword.get(opts, :hash_password, true)
 | 
			
		||||
    password = get_change(changeset, :password)
 | 
			
		||||
@@ -128,7 +127,7 @@ defmodule Cannery.Accounts.User do
 | 
			
		||||
 | 
			
		||||
  It requires the email to change otherwise an error is added.
 | 
			
		||||
  """
 | 
			
		||||
  @spec email_changeset(t(), attrs :: map()) :: Changeset.t(t())
 | 
			
		||||
  @spec email_changeset(t(), attrs :: map()) :: changeset()
 | 
			
		||||
  def email_changeset(user, attrs) do
 | 
			
		||||
    user
 | 
			
		||||
    |> cast(attrs, [:email])
 | 
			
		||||
@@ -151,8 +150,8 @@ defmodule Cannery.Accounts.User do
 | 
			
		||||
      validations on a LiveView form), this option can be set to `false`.
 | 
			
		||||
      Defaults to `true`.
 | 
			
		||||
  """
 | 
			
		||||
  @spec password_changeset(t(), attrs :: map()) :: Changeset.t(t())
 | 
			
		||||
  @spec password_changeset(t(), attrs :: map(), opts :: keyword()) :: Changeset.t(t())
 | 
			
		||||
  @spec password_changeset(t(), attrs :: map()) :: changeset()
 | 
			
		||||
  @spec password_changeset(t(), attrs :: map(), opts :: keyword()) :: changeset()
 | 
			
		||||
  def password_changeset(user, attrs, opts \\ []) do
 | 
			
		||||
    user
 | 
			
		||||
    |> cast(attrs, [:password])
 | 
			
		||||
@@ -163,7 +162,7 @@ defmodule Cannery.Accounts.User do
 | 
			
		||||
  @doc """
 | 
			
		||||
  Confirms the account by setting `confirmed_at`.
 | 
			
		||||
  """
 | 
			
		||||
  @spec confirm_changeset(t() | Changeset.t(t())) :: Changeset.t(t())
 | 
			
		||||
  @spec confirm_changeset(t() | changeset()) :: changeset()
 | 
			
		||||
  def confirm_changeset(user_or_changeset) do
 | 
			
		||||
    now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second)
 | 
			
		||||
    user_or_changeset |> change(confirmed_at: now)
 | 
			
		||||
@@ -189,7 +188,7 @@ defmodule Cannery.Accounts.User do
 | 
			
		||||
  @doc """
 | 
			
		||||
  Validates the current password otherwise adds an error to the changeset.
 | 
			
		||||
  """
 | 
			
		||||
  @spec validate_current_password(Changeset.t(t()), String.t()) :: Changeset.t(t())
 | 
			
		||||
  @spec validate_current_password(changeset(), String.t()) :: changeset()
 | 
			
		||||
  def validate_current_password(changeset, password) do
 | 
			
		||||
    if valid_password?(changeset.data, password),
 | 
			
		||||
      do: changeset,
 | 
			
		||||
@@ -199,7 +198,7 @@ defmodule Cannery.Accounts.User do
 | 
			
		||||
  @doc """
 | 
			
		||||
  A changeset for changing the user's locale
 | 
			
		||||
  """
 | 
			
		||||
  @spec locale_changeset(t() | Changeset.t(t()), locale :: String.t() | nil) :: Changeset.t(t())
 | 
			
		||||
  @spec locale_changeset(t() | changeset(), locale :: String.t() | nil) :: changeset()
 | 
			
		||||
  def locale_changeset(user_or_changeset, locale) do
 | 
			
		||||
    user_or_changeset
 | 
			
		||||
    |> cast(%{"locale" => locale}, [:locale])
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ defmodule Cannery.ActivityLog do
 | 
			
		||||
 | 
			
		||||
  import Ecto.Query, warn: false
 | 
			
		||||
  alias Cannery.{Accounts.User, ActivityLog.ShotGroup, Ammo.AmmoGroup, Repo}
 | 
			
		||||
  alias Ecto.{Changeset, Multi}
 | 
			
		||||
  alias Ecto.Multi
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
  Returns the list of shot_groups.
 | 
			
		||||
@@ -58,7 +58,7 @@ defmodule Cannery.ActivityLog do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec create_shot_group(attrs :: map(), User.t(), AmmoGroup.t()) ::
 | 
			
		||||
          {:ok, ShotGroup.t()} | {:error, Changeset.t(ShotGroup.t()) | nil}
 | 
			
		||||
          {:ok, ShotGroup.t()} | {:error, ShotGroup.changeset() | nil}
 | 
			
		||||
  def create_shot_group(attrs, user, ammo_group) do
 | 
			
		||||
    Multi.new()
 | 
			
		||||
    |> Multi.insert(
 | 
			
		||||
@@ -99,7 +99,7 @@ defmodule Cannery.ActivityLog do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec update_shot_group(ShotGroup.t(), attrs :: map(), User.t()) ::
 | 
			
		||||
          {:ok, ShotGroup.t()} | {:error, Changeset.t(ShotGroup.t()) | nil}
 | 
			
		||||
          {:ok, ShotGroup.t()} | {:error, ShotGroup.changeset() | nil}
 | 
			
		||||
  def update_shot_group(
 | 
			
		||||
        %ShotGroup{count: count, user_id: user_id} = shot_group,
 | 
			
		||||
        attrs,
 | 
			
		||||
@@ -149,7 +149,7 @@ defmodule Cannery.ActivityLog do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec delete_shot_group(ShotGroup.t(), User.t()) ::
 | 
			
		||||
          {:ok, ShotGroup.t()} | {:error, Changeset.t(ShotGroup.t())}
 | 
			
		||||
          {:ok, ShotGroup.t()} | {:error, ShotGroup.changeset()}
 | 
			
		||||
  def delete_shot_group(
 | 
			
		||||
        %ShotGroup{user_id: user_id} = shot_group,
 | 
			
		||||
        %User{id: user_id}
 | 
			
		||||
 
 | 
			
		||||
@@ -44,6 +44,7 @@ defmodule Cannery.ActivityLog.ShotGroup do
 | 
			
		||||
        }
 | 
			
		||||
  @type new_shot_group :: %ShotGroup{}
 | 
			
		||||
  @type id :: UUID.t()
 | 
			
		||||
  @type changeset :: Changeset.t(t() | new_shot_group())
 | 
			
		||||
 | 
			
		||||
  @doc false
 | 
			
		||||
  @spec create_changeset(
 | 
			
		||||
@@ -51,8 +52,7 @@ defmodule Cannery.ActivityLog.ShotGroup do
 | 
			
		||||
          User.t() | any(),
 | 
			
		||||
          AmmoGroup.t() | any(),
 | 
			
		||||
          attrs :: map()
 | 
			
		||||
        ) ::
 | 
			
		||||
          Changeset.t(new_shot_group())
 | 
			
		||||
        ) :: changeset()
 | 
			
		||||
  def create_changeset(
 | 
			
		||||
        shot_group,
 | 
			
		||||
        %User{id: user_id},
 | 
			
		||||
@@ -87,8 +87,7 @@ defmodule Cannery.ActivityLog.ShotGroup do
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @doc false
 | 
			
		||||
  @spec update_changeset(t() | new_shot_group(), User.t(), attrs :: map()) ::
 | 
			
		||||
          Changeset.t(t() | new_shot_group())
 | 
			
		||||
  @spec update_changeset(t() | new_shot_group(), User.t(), attrs :: map()) :: changeset()
 | 
			
		||||
  def update_changeset(
 | 
			
		||||
        %ShotGroup{user_id: user_id} = shot_group,
 | 
			
		||||
        %User{id: user_id} = user,
 | 
			
		||||
 
 | 
			
		||||
@@ -182,7 +182,7 @@ defmodule Cannery.Ammo do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec create_ammo_type(attrs :: map(), User.t()) ::
 | 
			
		||||
          {:ok, AmmoType.t()} | {:error, Changeset.t(AmmoType.new_ammo_type())}
 | 
			
		||||
          {:ok, AmmoType.t()} | {:error, AmmoType.changeset()}
 | 
			
		||||
  def create_ammo_type(attrs \\ %{}, %User{} = user),
 | 
			
		||||
    do: %AmmoType{} |> AmmoType.create_changeset(user, attrs) |> Repo.insert()
 | 
			
		||||
 | 
			
		||||
@@ -199,7 +199,7 @@ defmodule Cannery.Ammo do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec update_ammo_type(AmmoType.t(), attrs :: map(), User.t()) ::
 | 
			
		||||
          {:ok, AmmoType.t()} | {:error, Changeset.t(AmmoType.t())}
 | 
			
		||||
          {:ok, AmmoType.t()} | {:error, AmmoType.changeset()}
 | 
			
		||||
  def update_ammo_type(%AmmoType{user_id: user_id} = ammo_type, attrs, %User{id: user_id}),
 | 
			
		||||
    do: ammo_type |> AmmoType.update_changeset(attrs) |> Repo.update()
 | 
			
		||||
 | 
			
		||||
@@ -216,7 +216,7 @@ defmodule Cannery.Ammo do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec delete_ammo_type(AmmoType.t(), User.t()) ::
 | 
			
		||||
          {:ok, AmmoType.t()} | {:error, Changeset.t(AmmoType.t())}
 | 
			
		||||
          {:ok, AmmoType.t()} | {:error, AmmoType.changeset()}
 | 
			
		||||
  def delete_ammo_type(%AmmoType{user_id: user_id} = ammo_type, %User{id: user_id}),
 | 
			
		||||
    do: ammo_type |> Repo.delete()
 | 
			
		||||
 | 
			
		||||
@@ -549,7 +549,7 @@ defmodule Cannery.Ammo do
 | 
			
		||||
  """
 | 
			
		||||
  @spec create_ammo_groups(attrs :: map(), multiplier :: non_neg_integer(), User.t()) ::
 | 
			
		||||
          {:ok, {count :: non_neg_integer(), [AmmoGroup.t()] | nil}}
 | 
			
		||||
          | {:error, Changeset.t(AmmoGroup.new_ammo_group())}
 | 
			
		||||
          | {:error, AmmoGroup.changeset()}
 | 
			
		||||
  def create_ammo_groups(
 | 
			
		||||
        %{"ammo_type_id" => ammo_type_id, "container_id" => container_id} = attrs,
 | 
			
		||||
        multiplier,
 | 
			
		||||
@@ -628,7 +628,7 @@ defmodule Cannery.Ammo do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec update_ammo_group(AmmoGroup.t(), attrs :: map(), User.t()) ::
 | 
			
		||||
          {:ok, AmmoGroup.t()} | {:error, Changeset.t(AmmoGroup.t())}
 | 
			
		||||
          {:ok, AmmoGroup.t()} | {:error, AmmoGroup.changeset()}
 | 
			
		||||
  def update_ammo_group(
 | 
			
		||||
        %AmmoGroup{user_id: user_id} = ammo_group,
 | 
			
		||||
        attrs,
 | 
			
		||||
@@ -649,7 +649,7 @@ defmodule Cannery.Ammo do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec delete_ammo_group(AmmoGroup.t(), User.t()) ::
 | 
			
		||||
          {:ok, AmmoGroup.t()} | {:error, Changeset.t(AmmoGroup.t())}
 | 
			
		||||
          {:ok, AmmoGroup.t()} | {:error, AmmoGroup.changeset()}
 | 
			
		||||
  def delete_ammo_group(%AmmoGroup{user_id: user_id} = ammo_group, %User{id: user_id}),
 | 
			
		||||
    do: ammo_group |> Repo.delete()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -59,6 +59,7 @@ defmodule Cannery.Ammo.AmmoGroup do
 | 
			
		||||
        }
 | 
			
		||||
  @type new_ammo_group :: %AmmoGroup{}
 | 
			
		||||
  @type id :: UUID.t()
 | 
			
		||||
  @type changeset :: Changeset.t(t() | new_ammo_group())
 | 
			
		||||
 | 
			
		||||
  @doc false
 | 
			
		||||
  @spec create_changeset(
 | 
			
		||||
@@ -67,7 +68,7 @@ defmodule Cannery.Ammo.AmmoGroup do
 | 
			
		||||
          Container.t() | nil,
 | 
			
		||||
          User.t(),
 | 
			
		||||
          attrs :: map()
 | 
			
		||||
        ) :: Changeset.t(new_ammo_group())
 | 
			
		||||
        ) :: changeset()
 | 
			
		||||
  def create_changeset(
 | 
			
		||||
        ammo_group,
 | 
			
		||||
        %AmmoType{id: ammo_type_id},
 | 
			
		||||
@@ -97,8 +98,7 @@ defmodule Cannery.Ammo.AmmoGroup do
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @doc false
 | 
			
		||||
  @spec update_changeset(t() | new_ammo_group(), attrs :: map(), User.t()) ::
 | 
			
		||||
          Changeset.t(t() | new_ammo_group())
 | 
			
		||||
  @spec update_changeset(t() | new_ammo_group(), attrs :: map(), User.t()) :: changeset()
 | 
			
		||||
  def update_changeset(ammo_group, attrs, user) do
 | 
			
		||||
    ammo_group
 | 
			
		||||
    |> cast(attrs, [:count, :price_paid, :notes, :staged, :purchased_on, :container_id])
 | 
			
		||||
@@ -121,8 +121,7 @@ defmodule Cannery.Ammo.AmmoGroup do
 | 
			
		||||
  This range changeset is used when "using up" ammo groups, and allows for
 | 
			
		||||
  updating the count to 0
 | 
			
		||||
  """
 | 
			
		||||
  @spec range_changeset(t() | new_ammo_group(), attrs :: map()) ::
 | 
			
		||||
          Changeset.t(t() | new_ammo_group())
 | 
			
		||||
  @spec range_changeset(t() | new_ammo_group(), attrs :: map()) :: changeset()
 | 
			
		||||
  def range_changeset(ammo_group, attrs) do
 | 
			
		||||
    ammo_group
 | 
			
		||||
    |> cast(attrs, [:count, :staged])
 | 
			
		||||
 
 | 
			
		||||
@@ -102,6 +102,7 @@ defmodule Cannery.Ammo.AmmoType do
 | 
			
		||||
        }
 | 
			
		||||
  @type new_ammo_type :: %AmmoType{}
 | 
			
		||||
  @type id :: UUID.t()
 | 
			
		||||
  @type changeset :: Changeset.t(t() | new_ammo_type())
 | 
			
		||||
 | 
			
		||||
  @spec changeset_fields() :: [atom()]
 | 
			
		||||
  defp changeset_fields,
 | 
			
		||||
@@ -130,8 +131,7 @@ defmodule Cannery.Ammo.AmmoType do
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
  @doc false
 | 
			
		||||
  @spec create_changeset(new_ammo_type(), User.t(), attrs :: map()) ::
 | 
			
		||||
          Changeset.t(new_ammo_type())
 | 
			
		||||
  @spec create_changeset(new_ammo_type(), User.t(), attrs :: map()) :: changeset()
 | 
			
		||||
  def create_changeset(ammo_type, %User{id: user_id}, attrs) do
 | 
			
		||||
    ammo_type
 | 
			
		||||
    |> change(user_id: user_id)
 | 
			
		||||
@@ -140,8 +140,7 @@ defmodule Cannery.Ammo.AmmoType do
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @doc false
 | 
			
		||||
  @spec update_changeset(t() | new_ammo_type(), attrs :: map()) ::
 | 
			
		||||
          Changeset.t(t() | new_ammo_type())
 | 
			
		||||
  @spec update_changeset(t() | new_ammo_type(), attrs :: map()) :: changeset()
 | 
			
		||||
  def update_changeset(ammo_type, attrs) do
 | 
			
		||||
    ammo_type
 | 
			
		||||
    |> cast(attrs, changeset_fields())
 | 
			
		||||
 
 | 
			
		||||
@@ -89,7 +89,7 @@ defmodule Cannery.Containers do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec create_container(attrs :: map(), User.t()) ::
 | 
			
		||||
          {:ok, Container.t()} | {:error, Changeset.t(Container.new_container())}
 | 
			
		||||
          {:ok, Container.t()} | {:error, Container.changeset()}
 | 
			
		||||
  def create_container(attrs, %User{} = user) do
 | 
			
		||||
    %Container{} |> Container.create_changeset(user, attrs) |> Repo.insert()
 | 
			
		||||
  end
 | 
			
		||||
@@ -107,7 +107,7 @@ defmodule Cannery.Containers do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec update_container(Container.t(), User.t(), attrs :: map()) ::
 | 
			
		||||
          {:ok, Container.t()} | {:error, Changeset.t(Container.t())}
 | 
			
		||||
          {:ok, Container.t()} | {:error, Container.changeset()}
 | 
			
		||||
  def update_container(%Container{user_id: user_id} = container, %User{id: user_id}, attrs) do
 | 
			
		||||
    container |> Container.update_changeset(attrs) |> Repo.update()
 | 
			
		||||
  end
 | 
			
		||||
@@ -125,7 +125,7 @@ defmodule Cannery.Containers do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec delete_container(Container.t(), User.t()) ::
 | 
			
		||||
          {:ok, Container.t()} | {:error, Changeset.t(Container.t())}
 | 
			
		||||
          {:ok, Container.t()} | {:error, Container.changeset()}
 | 
			
		||||
  def delete_container(%Container{user_id: user_id} = container, %User{id: user_id}) do
 | 
			
		||||
    Repo.one(
 | 
			
		||||
      from ag in AmmoGroup,
 | 
			
		||||
 
 | 
			
		||||
@@ -49,10 +49,10 @@ defmodule Cannery.Containers.Container do
 | 
			
		||||
        }
 | 
			
		||||
  @type new_container :: %Container{}
 | 
			
		||||
  @type id :: UUID.t()
 | 
			
		||||
  @type changeset :: Changeset.t(t() | new_container())
 | 
			
		||||
 | 
			
		||||
  @doc false
 | 
			
		||||
  @spec create_changeset(new_container(), User.t(), attrs :: map()) ::
 | 
			
		||||
          Changeset.t(new_container())
 | 
			
		||||
  @spec create_changeset(new_container(), User.t(), attrs :: map()) :: changeset()
 | 
			
		||||
  def create_changeset(container, %User{id: user_id}, attrs) do
 | 
			
		||||
    container
 | 
			
		||||
    |> change(user_id: user_id)
 | 
			
		||||
@@ -61,8 +61,7 @@ defmodule Cannery.Containers.Container do
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @doc false
 | 
			
		||||
  @spec update_changeset(t() | new_container(), attrs :: map()) ::
 | 
			
		||||
          Changeset.t(t() | new_container())
 | 
			
		||||
  @spec update_changeset(t() | new_container(), attrs :: map()) :: changeset()
 | 
			
		||||
  def update_changeset(container, attrs) do
 | 
			
		||||
    container
 | 
			
		||||
    |> cast(attrs, [:name, :desc, :type, :location])
 | 
			
		||||
 
 | 
			
		||||
@@ -29,10 +29,10 @@ defmodule Cannery.Containers.ContainerTag do
 | 
			
		||||
        }
 | 
			
		||||
  @type new_container_tag :: %ContainerTag{}
 | 
			
		||||
  @type id :: UUID.t()
 | 
			
		||||
  @type changeset :: Changeset.t(t() | new_container_tag())
 | 
			
		||||
 | 
			
		||||
  @doc false
 | 
			
		||||
  @spec create_changeset(new_container_tag(), Tag.t(), Container.t()) ::
 | 
			
		||||
          Changeset.t(new_container_tag())
 | 
			
		||||
  @spec create_changeset(new_container_tag(), Tag.t(), Container.t()) :: changeset()
 | 
			
		||||
  def create_changeset(
 | 
			
		||||
        container_tag,
 | 
			
		||||
        %Tag{id: tag_id, user_id: user_id},
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ defmodule Cannery.Invites do
 | 
			
		||||
 | 
			
		||||
  import Ecto.Query, warn: false
 | 
			
		||||
  alias Cannery.{Accounts.User, Invites.Invite, Repo}
 | 
			
		||||
  alias Ecto.Changeset
 | 
			
		||||
 | 
			
		||||
  @invite_token_length 20
 | 
			
		||||
 | 
			
		||||
@@ -99,14 +98,14 @@ defmodule Cannery.Invites do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec create_invite(User.t(), attrs :: map()) ::
 | 
			
		||||
          {:ok, Invite.t()} | {:error, Changeset.t(Invite.new_invite())}
 | 
			
		||||
          {:ok, Invite.t()} | {:error, Invite.changeset()}
 | 
			
		||||
  def create_invite(%User{role: :admin} = user, attrs) do
 | 
			
		||||
    token =
 | 
			
		||||
      :crypto.strong_rand_bytes(@invite_token_length)
 | 
			
		||||
      |> Base.url_encode64()
 | 
			
		||||
      |> binary_part(0, @invite_token_length)
 | 
			
		||||
 | 
			
		||||
    %Invite{} |> Invite.create_changeset(user, token, attrs) |> Repo.insert()
 | 
			
		||||
    Invite.create_changeset(user, token, attrs) |> Repo.insert()
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
@@ -122,7 +121,7 @@ defmodule Cannery.Invites do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec update_invite(Invite.t(), attrs :: map(), User.t()) ::
 | 
			
		||||
          {:ok, Invite.t()} | {:error, Changeset.t(Invite.t())}
 | 
			
		||||
          {:ok, Invite.t()} | {:error, Invite.changeset()}
 | 
			
		||||
  def update_invite(invite, attrs, %User{role: :admin}),
 | 
			
		||||
    do: invite |> Invite.update_changeset(attrs) |> Repo.update()
 | 
			
		||||
 | 
			
		||||
@@ -139,7 +138,7 @@ defmodule Cannery.Invites do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec delete_invite(Invite.t(), User.t()) ::
 | 
			
		||||
          {:ok, Invite.t()} | {:error, Changeset.t(Invite.t())}
 | 
			
		||||
          {:ok, Invite.t()} | {:error, Invite.changeset()}
 | 
			
		||||
  def delete_invite(invite, %User{role: :admin}), do: invite |> Repo.delete()
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
 
 | 
			
		||||
@@ -36,12 +36,12 @@ defmodule Cannery.Invites.Invite do
 | 
			
		||||
        }
 | 
			
		||||
  @type new_invite :: %Invite{}
 | 
			
		||||
  @type id :: UUID.t()
 | 
			
		||||
  @type changeset :: Changeset.t(t() | new_invite())
 | 
			
		||||
 | 
			
		||||
  @doc false
 | 
			
		||||
  @spec create_changeset(new_invite(), User.t(), token :: binary(), attrs :: map()) ::
 | 
			
		||||
          Changeset.t(new_invite())
 | 
			
		||||
  def create_changeset(invite, %User{id: user_id}, token, attrs) do
 | 
			
		||||
    invite
 | 
			
		||||
  @spec create_changeset(User.t(), token :: binary(), attrs :: map()) :: changeset()
 | 
			
		||||
  def create_changeset(%User{id: user_id}, token, attrs) do
 | 
			
		||||
    %Invite{}
 | 
			
		||||
    |> change(token: token, user_id: user_id)
 | 
			
		||||
    |> cast(attrs, [:name, :uses_left, :disabled_at])
 | 
			
		||||
    |> validate_required([:name, :token, :user_id])
 | 
			
		||||
@@ -49,7 +49,7 @@ defmodule Cannery.Invites.Invite do
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @doc false
 | 
			
		||||
  @spec update_changeset(t() | new_invite(), attrs :: map()) :: Changeset.t(t() | new_invite())
 | 
			
		||||
  @spec update_changeset(t() | new_invite(), attrs :: map()) :: changeset()
 | 
			
		||||
  def update_changeset(invite, attrs) do
 | 
			
		||||
    invite
 | 
			
		||||
    |> cast(attrs, [:name, :uses_left, :disabled_at])
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@ defmodule Cannery.Tags do
 | 
			
		||||
  import Ecto.Query, warn: false
 | 
			
		||||
  import CanneryWeb.Gettext
 | 
			
		||||
  alias Cannery.{Accounts.User, Repo, Tags.Tag}
 | 
			
		||||
  alias Ecto.Changeset
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
  Returns the list of tags.
 | 
			
		||||
@@ -73,7 +72,7 @@ defmodule Cannery.Tags do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec create_tag(attrs :: map(), User.t()) ::
 | 
			
		||||
          {:ok, Tag.t()} | {:error, Changeset.t(Tag.new_tag())}
 | 
			
		||||
          {:ok, Tag.t()} | {:error, Tag.changeset()}
 | 
			
		||||
  def create_tag(attrs, %User{} = user),
 | 
			
		||||
    do: %Tag{} |> Tag.create_changeset(user, attrs) |> Repo.insert()
 | 
			
		||||
 | 
			
		||||
@@ -90,7 +89,7 @@ defmodule Cannery.Tags do
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec update_tag(Tag.t(), attrs :: map(), User.t()) ::
 | 
			
		||||
          {:ok, Tag.t()} | {:error, Changeset.t(Tag.t())}
 | 
			
		||||
          {:ok, Tag.t()} | {:error, Tag.changeset()}
 | 
			
		||||
  def update_tag(%Tag{user_id: user_id} = tag, attrs, %User{id: user_id}),
 | 
			
		||||
    do: tag |> Tag.update_changeset(attrs) |> Repo.update()
 | 
			
		||||
 | 
			
		||||
@@ -106,7 +105,7 @@ defmodule Cannery.Tags do
 | 
			
		||||
      {:error, %Changeset{}}
 | 
			
		||||
 | 
			
		||||
  """
 | 
			
		||||
  @spec delete_tag(Tag.t(), User.t()) :: {:ok, Tag.t()} | {:error, Changeset.t(Tag.t())}
 | 
			
		||||
  @spec delete_tag(Tag.t(), User.t()) :: {:ok, Tag.t()} | {:error, Tag.changeset()}
 | 
			
		||||
  def delete_tag(%Tag{user_id: user_id} = tag, %User{id: user_id}), do: tag |> Repo.delete()
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
 
 | 
			
		||||
@@ -40,9 +40,10 @@ defmodule Cannery.Tags.Tag do
 | 
			
		||||
        }
 | 
			
		||||
  @type new_tag() :: %Tag{}
 | 
			
		||||
  @type id() :: UUID.t()
 | 
			
		||||
  @type changeset() :: Changeset.t(t() | new_tag())
 | 
			
		||||
 | 
			
		||||
  @doc false
 | 
			
		||||
  @spec create_changeset(new_tag(), User.t(), attrs :: map()) :: Changeset.t(new_tag())
 | 
			
		||||
  @spec create_changeset(new_tag(), User.t(), attrs :: map()) :: changeset()
 | 
			
		||||
  def create_changeset(tag, %User{id: user_id}, attrs) do
 | 
			
		||||
    tag
 | 
			
		||||
    |> change(user_id: user_id)
 | 
			
		||||
@@ -51,7 +52,7 @@ defmodule Cannery.Tags.Tag do
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @doc false
 | 
			
		||||
  @spec update_changeset(t() | new_tag(), attrs :: map()) :: Changeset.t(t() | new_tag())
 | 
			
		||||
  @spec update_changeset(t() | new_tag(), attrs :: map()) :: changeset()
 | 
			
		||||
  def update_changeset(tag, attrs) do
 | 
			
		||||
    tag
 | 
			
		||||
    |> cast(attrs, [:name, :bg_color, :text_color])
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@ defmodule CanneryWeb.UserRegistrationController do
 | 
			
		||||
  use CanneryWeb, :controller
 | 
			
		||||
  import CanneryWeb.Gettext
 | 
			
		||||
  alias Cannery.{Accounts, Invites}
 | 
			
		||||
  alias Cannery.Accounts.User
 | 
			
		||||
  alias CanneryWeb.{Endpoint, HomeLive}
 | 
			
		||||
 | 
			
		||||
  def new(conn, %{"invite" => invite_token}) do
 | 
			
		||||
@@ -30,7 +29,7 @@ defmodule CanneryWeb.UserRegistrationController do
 | 
			
		||||
  # renders new user registration page
 | 
			
		||||
  defp render_new(conn, invite \\ nil) do
 | 
			
		||||
    render(conn, "new.html",
 | 
			
		||||
      changeset: Accounts.change_user_registration(%User{}),
 | 
			
		||||
      changeset: Accounts.change_user_registration(),
 | 
			
		||||
      invite: invite,
 | 
			
		||||
      page_title: gettext("Register")
 | 
			
		||||
    )
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ defmodule CanneryWeb.InviteLive.FormComponent do
 | 
			
		||||
 | 
			
		||||
    changeset =
 | 
			
		||||
      case action do
 | 
			
		||||
        :new -> invite |> Invite.create_changeset(user, "example_token", invite_params)
 | 
			
		||||
        :new -> Invite.create_changeset(user, "example_token", invite_params)
 | 
			
		||||
        :edit -> invite |> Invite.update_changeset(invite_params)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user