From 367cc6cb005a4d257a7f0a625798f1d859b3f6d7 Mon Sep 17 00:00:00 2001 From: May Tusek Date: Thu, 13 Feb 2025 22:02:02 -0800 Subject: [PATCH] Finishes adding reactivation functionality. --- assets/css/application.css | 1 - assets/css/views/deactivations.css | 4 ---- lib/philomena/users.ex | 21 +++++++++++++++++++ lib/philomena/users/user_token.ex | 2 ++ .../controllers/reactivation_controller.ex | 19 +++++++++++++++-- lib/philomena_web/router.ex | 3 ++- .../templates/deactivation/index.html.slime | 4 ++-- .../templates/reactivation/show.html.slime | 3 +++ lib/philomena_web/views/reactivation_view.ex | 3 +++ 9 files changed, 50 insertions(+), 10 deletions(-) delete mode 100644 assets/css/views/deactivations.css create mode 100644 lib/philomena_web/templates/reactivation/show.html.slime create mode 100644 lib/philomena_web/views/reactivation_view.ex diff --git a/assets/css/application.css b/assets/css/application.css index 63fc3783..18f4df31 100644 --- a/assets/css/application.css +++ b/assets/css/application.css @@ -42,7 +42,6 @@ @import "views/comments"; @import "views/commissions"; @import "views/communications"; -@import "views/deactivations"; @import "views/duplicates"; @import "views/filters"; @import "views/galleries"; diff --git a/assets/css/views/deactivations.css b/assets/css/views/deactivations.css deleted file mode 100644 index d9c6ad47..00000000 --- a/assets/css/views/deactivations.css +++ /dev/null @@ -1,4 +0,0 @@ -.deactivations__button-container { - display: flex; - gap: 8px; -} \ No newline at end of file diff --git a/lib/philomena/users.ex b/lib/philomena/users.ex index 82e708f1..25c76478 100644 --- a/lib/philomena/users.ex +++ b/lib/philomena/users.ex @@ -833,6 +833,27 @@ defmodule Philomena.Users do |> Repo.update() end + @doc """ + Gets the user by reactivation token. + + ## Examples + + iex> get_user_by_reactivation_token("validtoken") + %User{} + + iex> get_user_by_reactivation_token("invalidtoken") + nil + + """ + def get_user_by_reactivation_token(token) do + with {:ok, query} <- UserToken.verify_email_token_query(token, "reactivate"), + %User{} = user <- Repo.one(query) do + user + else + _ -> nil + end + end + @doc """ Generates a new API key for the user. diff --git a/lib/philomena/users/user_token.ex b/lib/philomena/users/user_token.ex index 7a8b484f..21e22b4b 100644 --- a/lib/philomena/users/user_token.ex +++ b/lib/philomena/users/user_token.ex @@ -12,6 +12,7 @@ defmodule Philomena.Users.UserToken do @change_email_validity_in_days 7 @unlock_email_validity_in_days 7 @session_validity_in_days 365 + @reactivate_validity_in_days 365 * 100 schema "user_tokens" do field :token, :binary @@ -121,6 +122,7 @@ defmodule Philomena.Users.UserToken do defp days_for_context("confirm"), do: @confirm_validity_in_days defp days_for_context("reset_password"), do: @reset_password_validity_in_days defp days_for_context("unlock"), do: @unlock_email_validity_in_days + defp days_for_context("reactivate"), do: @reactivate_validity_in_days @doc """ Checks if the token is valid and returns its underlying lookup query. diff --git a/lib/philomena_web/controllers/reactivation_controller.ex b/lib/philomena_web/controllers/reactivation_controller.ex index c0ab82f2..4e1bc4dd 100644 --- a/lib/philomena_web/controllers/reactivation_controller.ex +++ b/lib/philomena_web/controllers/reactivation_controller.ex @@ -1,7 +1,22 @@ defmodule PhilomenaWeb.ReactivationController do use PhilomenaWeb, :controller + alias Philomena.Users.{User} - def index(conn, _params) do - text(conn, "hello world") + def show(conn, %{"token" => _}) do + conn + |> render("show.html") + end + + def post(conn, %{"token" => token}) do + with user = %User{} <- Users.get_user_by_reactivation_token(token) do + Users.reactivate_user(user) + else + nil -> + nil + end + + conn + |> put_flash(:info, "If the token provided was valid, your account has been reactivated.") + |> redirect(to: "/") end end diff --git a/lib/philomena_web/router.ex b/lib/philomena_web/router.ex index d3777a6a..376f85bc 100644 --- a/lib/philomena_web/router.ex +++ b/lib/philomena_web/router.ex @@ -78,6 +78,8 @@ defmodule PhilomenaWeb.Router do :redirect_if_user_is_authenticated ] + get "/reactivations/:token", ReactivationController, :show + post "/reactivations/:token", ReactivationController, :post resources "/registrations", RegistrationController, only: [:new, :create], singleton: true end @@ -104,7 +106,6 @@ defmodule PhilomenaWeb.Router do resources "/registrations", RegistrationController, only: [:edit, :update], singleton: true resources "/sessions", SessionController, only: [:delete], singleton: true resources "/deactivations", DeactivationController, only: [:show, :delete], singleton: true - get "/deactivations/:id/reactivate", DeactivationController, :index scope "/registrations", Registration, as: :registration do resources "/totp", TotpController, only: [:edit, :update], singleton: true diff --git a/lib/philomena_web/templates/deactivation/index.html.slime b/lib/philomena_web/templates/deactivation/index.html.slime index ceb3e4b0..b52f0a70 100644 --- a/lib/philomena_web/templates/deactivation/index.html.slime +++ b/lib/philomena_web/templates/deactivation/index.html.slime @@ -3,7 +3,7 @@ h1 Deactivate Account .block .block__content.warning p.walloftext - ' Deactivating your account will prevent you from logging into your account. If you ever wish to re-activate your account later on, you may do so at any time. If you wish to wipe your personally identifiable data as well, please contact #{contact_email} + ' Deactivating your account will prevent you from logging into your account. If you ever wish to re-activate your account later on, you may do so at any time. If you wish to wipe your personally identifiable data as well, please contact #{contact_email} .deactivations__button-container = button_to "Back", ~p"/registrations/edit", class: "button" - = button_to "Confirm", ~p"/deactivations", class: ["button", "button--state-danger"], method: :delete, data: [confirm: "Are you sure you want to deactivate your account?"] \ No newline at end of file + = button_to "Confirm", ~p"/deactivations", class: ["button", "button--state-danger", "button--separate-left"], method: :delete, data: [confirm: "Are you sure you want to deactivate your account?"] \ No newline at end of file diff --git a/lib/philomena_web/templates/reactivation/show.html.slime b/lib/philomena_web/templates/reactivation/show.html.slime new file mode 100644 index 00000000..ba9f9462 --- /dev/null +++ b/lib/philomena_web/templates/reactivation/show.html.slime @@ -0,0 +1,3 @@ +h1 Rectivate Account += button_to "Cancel", ~p"/", class: "button" += button_to "Reactivate", "", class: ["button", "button--state-success", "button--separate-left"], method: "post", data: [confirm: "Are you sure you want to reactivate your account?"] \ No newline at end of file diff --git a/lib/philomena_web/views/reactivation_view.ex b/lib/philomena_web/views/reactivation_view.ex new file mode 100644 index 00000000..1676e598 --- /dev/null +++ b/lib/philomena_web/views/reactivation_view.ex @@ -0,0 +1,3 @@ +defmodule PhilomenaWeb.ReactivationView do + use PhilomenaWeb, :view +end