From 438c5707387df33a693a346da8e4127c8a51e0a1 Mon Sep 17 00:00:00 2001 From: Dan Schultzer Date: Fri, 15 Mar 2019 08:51:13 -0700 Subject: [PATCH 1/3] Refactor messages in extensions to use `extension_messages/1` rather than overriding `messages/1` --- CHANGELOG.md | 4 ++++ .../phoenix/controllers/confirmation_controller.ex | 4 ++-- .../phoenix/controllers/controller_callbacks.ex | 11 +++++++---- .../phoenix/controllers/invitation_controller.ex | 8 ++++---- .../phoenix/controllers/reset_password_controller.ex | 6 +++--- .../extension/phoenix/controllers/controller/base.ex | 2 +- 6 files changed, 21 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c36eaee0..bd9b28ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v1.0.5 (TBA) + +* Added `extension_messages/1` to extension controllers and callbacks + ## v1.0.4 (2019-03-13) * Added `PowInvitation` to the `mix pow.extension.phoenix.gen.templates` and `mix pow.extension.phoenix.mailer.gen.templates` tasks diff --git a/lib/extensions/email_confirmation/phoenix/controllers/confirmation_controller.ex b/lib/extensions/email_confirmation/phoenix/controllers/confirmation_controller.ex index 97a6d7ad..0a14248c 100644 --- a/lib/extensions/email_confirmation/phoenix/controllers/confirmation_controller.ex +++ b/lib/extensions/email_confirmation/phoenix/controllers/confirmation_controller.ex @@ -11,12 +11,12 @@ defmodule PowEmailConfirmation.Phoenix.ConfirmationController do @spec respond_show({:ok | :error, map(), Conn.t()}) :: Conn.t() def respond_show({:ok, _user, conn}) do conn - |> put_flash(:info, messages(conn).email_has_been_confirmed(conn)) + |> put_flash(:info, extension_messages(conn).email_has_been_confirmed(conn)) |> redirect(to: redirect_to(conn)) end def respond_show({:error, _changeset, conn}) do conn - |> put_flash(:error, messages(conn).email_confirmation_failed(conn)) + |> put_flash(:error, extension_messages(conn).email_confirmation_failed(conn)) |> redirect(to: redirect_to(conn)) end diff --git a/lib/extensions/email_confirmation/phoenix/controllers/controller_callbacks.ex b/lib/extensions/email_confirmation/phoenix/controllers/controller_callbacks.ex index 49eb3e40..62461e06 100644 --- a/lib/extensions/email_confirmation/phoenix/controllers/controller_callbacks.ex +++ b/lib/extensions/email_confirmation/phoenix/controllers/controller_callbacks.ex @@ -37,7 +37,7 @@ defmodule PowEmailConfirmation.Phoenix.ControllerCallbacks do defp do_warn_unconfirmed(user, conn) do send_confirmation_email(user, conn) - error = messages(conn).email_confirmation_required_for_update(conn) + error = extension_messages(conn).email_confirmation_required_for_update(conn) conn = Phoenix.Controller.put_flash(conn, :error, error) {:ok, user, conn} @@ -47,7 +47,7 @@ defmodule PowEmailConfirmation.Phoenix.ControllerCallbacks do send_confirmation_email(user, conn) {:ok, conn} = Plug.clear_authenticated_user(conn) - error = messages(conn).email_confirmation_required(conn) + error = extension_messages(conn).email_confirmation_required(conn) path = return_path(conn, type) conn = conn @@ -63,10 +63,13 @@ defmodule PowEmailConfirmation.Phoenix.ControllerCallbacks do @spec send_confirmation_email(map(), Conn.t()) :: any() def send_confirmation_email(user, conn) do - token = user.email_confirmation_token - url = routes(conn).url_for(conn, ConfirmationController, :show, [token]) + url = confirmation_url(conn, user.email_confirmation_token) email = Mailer.email_confirmation(conn, user, url) Pow.Phoenix.Mailer.deliver(conn, email) end + + defp confirmation_url(conn, token) do + routes(conn).url_for(conn, ConfirmationController, :show, [token]) + end end diff --git a/lib/extensions/invitation/phoenix/controllers/invitation_controller.ex b/lib/extensions/invitation/phoenix/controllers/invitation_controller.ex index cde163e6..8b6dbdc7 100644 --- a/lib/extensions/invitation/phoenix/controllers/invitation_controller.ex +++ b/lib/extensions/invitation/phoenix/controllers/invitation_controller.ex @@ -3,7 +3,7 @@ defmodule PowInvitation.Phoenix.InvitationController do use Pow.Extension.Phoenix.Controller.Base alias Plug.Conn - alias Pow.Phoenix.{RegistrationController, SessionController} + alias Pow.Phoenix.SessionController alias PowInvitation.{Phoenix.Mailer, Plug} plug :require_authenticated when action in [:new, :create, :show] @@ -34,7 +34,7 @@ defmodule PowInvitation.Phoenix.InvitationController do deliver_email(conn, user) conn - |> put_flash(:info, messages(conn).invitation_email_sent(conn)) + |> put_flash(:info, extension_messages(conn).invitation_email_sent(conn)) |> redirect(to: routes(conn).path_for(conn, __MODULE__, :new)) end def respond_create({:ok, user, conn}) do @@ -88,7 +88,7 @@ defmodule PowInvitation.Phoenix.InvitationController do @spec respond_update({:ok, map(), Conn.t()}) :: Conn.t() def respond_update({:ok, _user, conn}) do conn - |> put_flash(:info, RegistrationController.messages(conn).user_has_been_created(conn)) + |> put_flash(:info, messages(conn).user_has_been_created(conn)) |> redirect(to: routes(conn).after_registration_path(conn)) end def respond_update({:error, changeset, conn}) do @@ -101,7 +101,7 @@ defmodule PowInvitation.Phoenix.InvitationController do case Plug.invited_user_from_token(conn, token) do nil -> conn - |> put_flash(:error, messages(conn).invalid_invitation(conn)) + |> put_flash(:error, extension_messages(conn).invalid_invitation(conn)) |> redirect(to: routes(conn).path_for(conn, SessionController, :new)) |> halt() diff --git a/lib/extensions/reset_password/phoenix/controllers/reset_password_controller.ex b/lib/extensions/reset_password/phoenix/controllers/reset_password_controller.ex index 74d9c5d2..e2d78bab 100644 --- a/lib/extensions/reset_password/phoenix/controllers/reset_password_controller.ex +++ b/lib/extensions/reset_password/phoenix/controllers/reset_password_controller.ex @@ -38,7 +38,7 @@ defmodule PowResetPassword.Phoenix.ResetPasswordController do defp default_respond_create(conn) do conn - |> put_flash(:info, messages(conn).email_has_been_sent(conn)) + |> put_flash(:info, extension_messages(conn).email_has_been_sent(conn)) |> redirect(to: routes(conn).session_path(conn, :new)) end @@ -62,7 +62,7 @@ defmodule PowResetPassword.Phoenix.ResetPasswordController do @spec respond_update({:ok, map(), Conn.t()}) :: Conn.t() def respond_update({:ok, _user, conn}) do conn - |> put_flash(:info, messages(conn).password_has_been_reset(conn)) + |> put_flash(:info, extension_messages(conn).password_has_been_reset(conn)) |> redirect(to: routes(conn).session_path(conn, :new)) end def respond_update({:error, changeset, conn}) do @@ -75,7 +75,7 @@ defmodule PowResetPassword.Phoenix.ResetPasswordController do case Plug.user_from_token(conn, token) do nil -> conn - |> put_flash(:error, messages(conn).invalid_token(conn)) + |> put_flash(:error, extension_messages(conn).invalid_token(conn)) |> redirect(to: routes(conn).path_for(conn, __MODULE__, :new)) |> halt() diff --git a/lib/pow/extension/phoenix/controllers/controller/base.ex b/lib/pow/extension/phoenix/controllers/controller/base.ex index 461ffdf3..7d815ffd 100644 --- a/lib/pow/extension/phoenix/controllers/controller/base.ex +++ b/lib/pow/extension/phoenix/controllers/controller/base.ex @@ -27,7 +27,7 @@ defmodule Pow.Extension.Phoenix.Controller.Base do @messages_fallback unquote(__MODULE__).__messages_fallback__(unquote(config), __MODULE__, __ENV__) @doc false - def messages(conn), do: unquote(__MODULE__).__messages_module__(conn, @messages_fallback) + def extension_messages(conn), do: unquote(__MODULE__).__messages_module__(conn, @messages_fallback) @doc false def routes(conn), do: Controller.routes(conn, Routes) From 3d84a6ba9f9bb0d5c2fad00331e8884adfbe63d9 Mon Sep 17 00:00:00 2001 From: Dan Schultzer Date: Fri, 15 Mar 2019 09:08:07 -0700 Subject: [PATCH 2/3] Add messages documentation --- .../email_confirmation/phoenix/messages.ex | 17 +++++++++++++++++ lib/extensions/invitation/phoenix/messages.ex | 7 +++++++ .../reset_password/phoenix/messages.ex | 13 +++++++++++++ 3 files changed, 37 insertions(+) diff --git a/lib/extensions/email_confirmation/phoenix/messages.ex b/lib/extensions/email_confirmation/phoenix/messages.ex index cf388540..d84a54d5 100644 --- a/lib/extensions/email_confirmation/phoenix/messages.ex +++ b/lib/extensions/email_confirmation/phoenix/messages.ex @@ -1,8 +1,25 @@ defmodule PowEmailConfirmation.Phoenix.Messages do @moduledoc false + + @doc """ + Flash message to show when email has been confirmed. + """ def email_has_been_confirmed(_conn), do: "The email address has been confirmed." + + @doc """ + Flash message to show when email couldn't be confirmed. + """ def email_confirmation_failed(_conn), do: "The email address couldn't be confirmed." + + @doc """ + Flash message to show when user is signs in or registers but e-mail is yet + to be confirmed. + """ def email_confirmation_required(_conn), do: "You'll need to confirm your e-mail before you can sign in. An e-mail confirmation link has been sent to you." + @doc """ + Flash message to show when user updates their e-mail and requires + confirmation. + """ def email_confirmation_required_for_update(_conn), do: "You'll need to confirm the e-mail before it's updated. An e-mail confirmation link has been sent to you." end diff --git a/lib/extensions/invitation/phoenix/messages.ex b/lib/extensions/invitation/phoenix/messages.ex index f495a9cb..29d70fb9 100644 --- a/lib/extensions/invitation/phoenix/messages.ex +++ b/lib/extensions/invitation/phoenix/messages.ex @@ -1,6 +1,13 @@ defmodule PowInvitation.Phoenix.Messages do @moduledoc false + @doc """ + Flash message to show when an invalid or expired invitation url is used. + """ def invalid_invitation(_conn), do: "The invitation doesn't exist." + + @doc """ + Flash message to show when user has been invited and e-mail has been sent. + """ def invitation_email_sent(_conn), do: "An e-mail with invitation link has been sent." end diff --git a/lib/extensions/reset_password/phoenix/messages.ex b/lib/extensions/reset_password/phoenix/messages.ex index d7a64dc3..1859e92e 100644 --- a/lib/extensions/reset_password/phoenix/messages.ex +++ b/lib/extensions/reset_password/phoenix/messages.ex @@ -1,6 +1,19 @@ defmodule PowResetPassword.Phoenix.Messages do @moduledoc false + + @doc """ + Flash message to show when a reset password e-mail has been sent. + """ def email_has_been_sent(_conn), do: "An email with reset instructions has been sent to you. Please check your inbox." + + @doc """ + Flash message to show when a an invalid or expired reset password link is + used. + """ def invalid_token(_conn), do: "The reset token has expired." + + @doc """ + Flash message to show when password has been updated. + """ def password_has_been_reset(_conn), do: "The password has been updated." end From 1e6eb873ac24b663b9608cbc175f38a98ee9863a Mon Sep 17 00:00:00 2001 From: Dan Schultzer Date: Fri, 15 Mar 2019 10:06:44 -0700 Subject: [PATCH 3/3] Include default pow controller routes and messsages in extension controllers --- .../phoenix/controllers/controller_callbacks/base.ex | 8 +++++--- lib/pow/phoenix/controllers/controller.ex | 7 +++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/pow/extension/phoenix/controllers/controller_callbacks/base.ex b/lib/pow/extension/phoenix/controllers/controller_callbacks/base.ex index d19e4639..a5ed3d7d 100644 --- a/lib/pow/extension/phoenix/controllers/controller_callbacks/base.ex +++ b/lib/pow/extension/phoenix/controllers/controller_callbacks/base.ex @@ -13,7 +13,7 @@ defmodule Pow.Extension.Phoenix.ControllerCallbacks.Base do end end """ - alias Pow.{Config, Extension.Phoenix.Controller.Base} + alias Pow.{Config, Extension.Phoenix.Controller.Base, Phoenix.Controller} @callback before_process(atom(), atom(), any(), Config.t()) :: any() @callback before_respond(atom(), atom(), any(), Config.t()) :: any() @@ -23,9 +23,11 @@ defmodule Pow.Extension.Phoenix.ControllerCallbacks.Base do quote do @behaviour unquote(__MODULE__) - import Base, only: [__define_helper_methods__: 1] + require Base + require Controller - __define_helper_methods__(unquote(config)) + Base.__define_helper_methods__(unquote(config)) + Controller.__define_helper_methods__() @before_compile unquote(__MODULE__) end diff --git a/lib/pow/phoenix/controllers/controller.ex b/lib/pow/phoenix/controllers/controller.ex index 4dfe4935..6e710774 100644 --- a/lib/pow/phoenix/controllers/controller.ex +++ b/lib/pow/phoenix/controllers/controller.ex @@ -58,6 +58,13 @@ defmodule Pow.Phoenix.Controller do defp pow_layout(conn, _config), do: ViewHelpers.layout(conn) + unquote(__MODULE__).__define_helper_methods__() + end + end + + @doc false + defmacro __define_helper_methods__() do + quote do @doc """ See `Pow.Phoenix.Controller.messages/2` for more.