defmodule PowInvitation.Ecto.Context do
@moduledoc """
Handles invitation context for user.
"""
alias Pow.{Config, Ecto.Context, Operations}
@doc """
Creates an invited user.
See `PowInvitation.Ecto.Schema.invite_changeset/3`.
"""
@spec create(Context.user(), map(), Config.t()) :: {:ok, Context.user()} | {:error, Context.changeset()}
def create(inviter_user, params, config) do
user_mod = Config.user!(config)
user_mod
|> struct()
|> user_mod.invite_changeset(inviter_user, params)
|> Context.do_insert(config)
end
@doc """
Updates an invited user and accepts invitation.
See `PowInvitation.Ecto.Schema.accept_invitation_changeset/2`.
"""
@spec update(Context.user(), map(), Config.t()) :: {:ok, Context.user()} | {:error, Context.changeset()}
def update(%user_mod{} = user, params, config) do
user
|> user_mod.accept_invitation_changeset(params)
|> Context.do_update(config)
end
@doc """
Finds an invited user by the `invitation_token` column.
Ignores users with `:invitation_accepted_at` set.
"""
@spec get_by_invitation_token(binary(), Config.t()) :: Context.user() | nil
def get_by_invitation_token(token, config) do
[invitation_token: token]
|> Operations.get_by(config)
|> case do
%{invitation_accepted_at: nil} = user -> user
_ -> nil
end
end
end