Finishes adding reactivation functionality.

This commit is contained in:
May Tusek 2025-02-13 22:02:02 -08:00
parent 94abf230d3
commit 367cc6cb00
9 changed files with 50 additions and 10 deletions

View file

@ -42,7 +42,6 @@
@import "views/comments"; @import "views/comments";
@import "views/commissions"; @import "views/commissions";
@import "views/communications"; @import "views/communications";
@import "views/deactivations";
@import "views/duplicates"; @import "views/duplicates";
@import "views/filters"; @import "views/filters";
@import "views/galleries"; @import "views/galleries";

View file

@ -1,4 +0,0 @@
.deactivations__button-container {
display: flex;
gap: 8px;
}

View file

@ -833,6 +833,27 @@ defmodule Philomena.Users do
|> Repo.update() |> Repo.update()
end 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 """ @doc """
Generates a new API key for the user. Generates a new API key for the user.

View file

@ -12,6 +12,7 @@ defmodule Philomena.Users.UserToken do
@change_email_validity_in_days 7 @change_email_validity_in_days 7
@unlock_email_validity_in_days 7 @unlock_email_validity_in_days 7
@session_validity_in_days 365 @session_validity_in_days 365
@reactivate_validity_in_days 365 * 100
schema "user_tokens" do schema "user_tokens" do
field :token, :binary 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("confirm"), do: @confirm_validity_in_days
defp days_for_context("reset_password"), do: @reset_password_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("unlock"), do: @unlock_email_validity_in_days
defp days_for_context("reactivate"), do: @reactivate_validity_in_days
@doc """ @doc """
Checks if the token is valid and returns its underlying lookup query. Checks if the token is valid and returns its underlying lookup query.

View file

@ -1,7 +1,22 @@
defmodule PhilomenaWeb.ReactivationController do defmodule PhilomenaWeb.ReactivationController do
use PhilomenaWeb, :controller use PhilomenaWeb, :controller
alias Philomena.Users.{User}
def index(conn, _params) do def show(conn, %{"token" => _}) do
text(conn, "hello world") 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
end end

View file

@ -78,6 +78,8 @@ defmodule PhilomenaWeb.Router do
:redirect_if_user_is_authenticated :redirect_if_user_is_authenticated
] ]
get "/reactivations/:token", ReactivationController, :show
post "/reactivations/:token", ReactivationController, :post
resources "/registrations", RegistrationController, only: [:new, :create], singleton: true resources "/registrations", RegistrationController, only: [:new, :create], singleton: true
end end
@ -104,7 +106,6 @@ defmodule PhilomenaWeb.Router do
resources "/registrations", RegistrationController, only: [:edit, :update], singleton: true resources "/registrations", RegistrationController, only: [:edit, :update], singleton: true
resources "/sessions", SessionController, only: [:delete], singleton: true resources "/sessions", SessionController, only: [:delete], singleton: true
resources "/deactivations", DeactivationController, only: [:show, :delete], singleton: true resources "/deactivations", DeactivationController, only: [:show, :delete], singleton: true
get "/deactivations/:id/reactivate", DeactivationController, :index
scope "/registrations", Registration, as: :registration do scope "/registrations", Registration, as: :registration do
resources "/totp", TotpController, only: [:edit, :update], singleton: true resources "/totp", TotpController, only: [:edit, :update], singleton: true

View file

@ -3,7 +3,7 @@ h1 Deactivate Account
.block .block
.block__content.warning .block__content.warning
p.walloftext p.walloftext
' Deactivating your account will <b>prevent you from logging into your account</b>. 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 <a href="mailto:#{contact_email}">#{contact_email}</a> ' 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 <a href="mailto:#{contact_email}">#{contact_email}</a>
.deactivations__button-container .deactivations__button-container
= button_to "Back", ~p"/registrations/edit", class: "button" = 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?"] = 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?"]

View file

@ -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?"]

View file

@ -0,0 +1,3 @@
defmodule PhilomenaWeb.ReactivationView do
use PhilomenaWeb, :view
end