Current section

Files

Jump to
ash_authentication lib ash_authentication strategies magic_link strategy.ex
Raw

lib/ash_authentication/strategies/magic_link/strategy.ex

defimpl AshAuthentication.Strategy, for: AshAuthentication.Strategy.MagicLink do
@moduledoc false
alias Ash.Resource
alias AshAuthentication.{Info, Strategy, Strategy.MagicLink}
alias Plug.Conn
@doc false
@spec name(MagicLink.t()) :: atom
def name(strategy), do: strategy.name
@doc false
@spec phases(MagicLink.t()) :: [Strategy.phase()]
def phases(_strategy), do: [:request, :sign_in]
@doc false
@spec actions(MagicLink.t()) :: [Strategy.action()]
def actions(_strategy), do: [:request, :sign_in]
@doc false
@spec method_for_phase(MagicLink.t(), atom) :: Strategy.http_method()
def method_for_phase(_strategy, :request), do: :post
def method_for_phase(_strategy, :sign_in), do: :get
@doc false
@spec routes(MagicLink.t()) :: [Strategy.route()]
def routes(strategy) do
subject_name = Info.authentication_subject_name!(strategy.resource)
[
{"/#{subject_name}/#{strategy.name}/request", :request},
{"/#{subject_name}/#{strategy.name}", :sign_in}
]
end
@doc false
@spec plug(MagicLink.t(), Strategy.phase(), Conn.t()) :: Conn.t()
def plug(strategy, :request, conn), do: MagicLink.Plug.request(conn, strategy)
def plug(strategy, :sign_in, conn), do: MagicLink.Plug.sign_in(conn, strategy)
@doc false
@spec action(MagicLink.t(), Strategy.action(), map, keyword) ::
:ok | {:ok, Resource.record()} | {:error, any}
def action(strategy, :request, params, options),
do: MagicLink.Actions.request(strategy, params, options)
def action(strategy, :sign_in, params, options),
do: MagicLink.Actions.sign_in(strategy, params, options)
end