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