Packages

A flexible authentication (and more) solution for Phoenix

Current section

Files

Jump to
haytni lib haytni_web controllers recoverable password_controller.ex
Raw

lib/haytni_web/controllers/recoverable/password_controller.ex

defmodule HaytniWeb.Recoverable.PasswordController do
@moduledoc false
use HaytniWeb, :controller
use HaytniWeb.Helpers, Haytni.RecoverablePlugin
import Haytni.Gettext
defp render_new(conn, changeset = %Ecto.Changeset{}) do
conn
|> assign(:changeset, changeset)
|> render("new.html")
end
# GET /password/new
# To request a new key, sent by mail, in order to change its password
def new(conn, _params, _module, config) do
conn
|> render_new(Haytni.RecoverablePlugin.recovering_changeset(config))
end
@spec recovery_token_sent_message() :: String.t
def recovery_token_sent_message do
if Application.get_env(:haytni, :mode) == :strict do
dgettext("haytni", "If the provided informations match our database, you will shortly receive in your mailbox the instructions to allow you to reset your password.")
else
dgettext("haytni", "To reset your password we sent you an email containing a link you will need to follow.")
end
|> Haytni.Helpers.concat_spam_check_hint_message()
end
# POST /password
# Send by email a new token to reset password
def create(conn, %{"password" => password_params}, module, config) do
case Haytni.RecoverablePlugin.send_reset_password_instructions(module, config, password_params) do
{:ok, _user} ->
conn
|> HaytniWeb.Shared.render_message(module, recovery_token_sent_message())
{:error, changeset = %Ecto.Changeset{}} ->
render_new(conn, changeset)
end
end
defp render_edit(conn, changeset = %Ecto.Changeset{}) do
conn
|> assign(:changeset, changeset)
|> render("edit.html")
end
# GET /password/edit?reset_password_token=<reset_password_token>
# Request a new password
def edit(conn, params = %{"reset_password_token" => _reset_password_token}, module, _config) do
conn
|> render_edit(Haytni.Recoverable.PasswordChange.change_password(module, params))
end
@spec password_changed_message() :: String.t
def password_changed_message do
dgettext("haytni", "Your password has been successfully changed.")
end
# PATCH /password
# Redefine the password of the targeted account
def update(conn, %{"password" => password_params}, module, config) do
case Haytni.RecoverablePlugin.recover(module, config, password_params) do
{:ok, _user} ->
conn
|> HaytniWeb.Shared.next_step_link(HaytniWeb.Shared.session_path(conn, module), dgettext("haytni", "Password changed, continue to sign in"))
|> HaytniWeb.Shared.render_message(module, password_changed_message())
{:error, changeset = %Ecto.Changeset{}} ->
render_edit(conn, changeset)
end
end
end