diff --git a/assets/css/application.css b/assets/css/application.css
index 2f6aea6d..63fc3783 100644
--- a/assets/css/application.css
+++ b/assets/css/application.css
@@ -42,6 +42,7 @@
@import "views/comments";
@import "views/commissions";
@import "views/communications";
+@import "views/deactivations";
@import "views/duplicates";
@import "views/filters";
@import "views/galleries";
@@ -55,4 +56,4 @@
@import "views/search";
@import "views/staff";
@import "views/stats";
-@import "views/tags";
+@import "views/tags";
\ No newline at end of file
diff --git a/assets/css/views/deactivations.css b/assets/css/views/deactivations.css
new file mode 100644
index 00000000..d9c6ad47
--- /dev/null
+++ b/assets/css/views/deactivations.css
@@ -0,0 +1,4 @@
+.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 7c002257..82e708f1 100644
--- a/lib/philomena/users.ex
+++ b/lib/philomena/users.ex
@@ -479,6 +479,13 @@ defmodule Philomena.Users do
UserNotifier.deliver_reset_password_instructions(user, reset_password_url_fun.(encoded_token))
end
+ def deliver_user_reactivation_instructions(%User{} = user, reactivation_url_fun)
+ when is_function(reactivation_url_fun, 1) do
+ {encoded_token, user_token} = UserToken.build_email_token(user, "reactivate")
+ Repo.insert!(user_token)
+ UserNotifier.deliver_reactivation_instructions(user, reactivation_url_fun.(encoded_token))
+ end
+
@doc """
Gets the user by reset password token.
@@ -811,6 +818,21 @@ defmodule Philomena.Users do
|> Repo.update()
end
+ @doc """
+ Deactivates a user account with the user recorded performing the deactivation.
+
+ ## Examples
+
+ iex> deactivate_user(user)
+ {:ok, %User{}}
+
+ """
+ def deactivate_user(%User{} = user) do
+ user
+ |> User.deactivate_changeset(user)
+ |> Repo.update()
+ end
+
@doc """
Generates a new API key for the user.
diff --git a/lib/philomena/users/user.ex b/lib/philomena/users/user.ex
index 35fd14e3..1c84fbfa 100644
--- a/lib/philomena/users/user.ex
+++ b/lib/philomena/users/user.ex
@@ -419,10 +419,10 @@ defmodule Philomena.Users.User do
change(user, deleted_at: nil, deleted_by_user_id: nil)
end
- def deactivate_changeset(user, moderator) do
+ def deactivate_changeset(user, deactivator) do
now = DateTime.utc_now(:second)
- change(user, deleted_at: now, deleted_by_user_id: moderator.id)
+ change(user, deleted_at: now, deleted_by_user_id: deactivator.id)
end
def api_key_changeset(user) do
diff --git a/lib/philomena/users/user_notifier.ex b/lib/philomena/users/user_notifier.ex
index 81f5329b..a9abded2 100644
--- a/lib/philomena/users/user_notifier.ex
+++ b/lib/philomena/users/user_notifier.ex
@@ -52,6 +52,27 @@ defmodule Philomena.Users.UserNotifier do
""")
end
+ @doc """
+ Deliver instructions to reactivate a deactivated account.
+ """
+ def deliver_reactivation_instructions(user, url) do
+ deliver(user.email, "Reactivation instructions for your account", """
+
+ ==============================
+
+ Hi,
+
+ Your account has been deactivated. If you wish to re-activate it, please click the following link:
+
+ #{url}
+
+ Sincerely,
+ The Derpibooru team.
+
+ ==============================
+ """)
+ end
+
@doc """
Deliver instructions to update an account email.
"""
diff --git a/lib/philomena_web/controllers/deactivation_controller.ex b/lib/philomena_web/controllers/deactivation_controller.ex
index e018f381..88dc9fa0 100644
--- a/lib/philomena_web/controllers/deactivation_controller.ex
+++ b/lib/philomena_web/controllers/deactivation_controller.ex
@@ -1,7 +1,19 @@
defmodule PhilomenaWeb.DeactivationController do
use PhilomenaWeb, :controller
+ alias PhilomenaWeb.UserAuth
+ alias Philomena.Users
def show(conn, _params) do
render(conn, "index.html", title: "Deactivate Account")
end
+
+ def delete(conn, _params) do
+ user = conn.assigns.current_user
+
+ Users.deactivate_user(user)
+ Users.deliver_user_reactivation_instructions(user, &url(~p"/reactivations/#{&1}"))
+ UserAuth.log_out_user(conn)
+
+ conn |> redirect(to: "/")
+ end
end
diff --git a/lib/philomena_web/controllers/reactivation_controller.ex b/lib/philomena_web/controllers/reactivation_controller.ex
new file mode 100644
index 00000000..c0ab82f2
--- /dev/null
+++ b/lib/philomena_web/controllers/reactivation_controller.ex
@@ -0,0 +1,7 @@
+defmodule PhilomenaWeb.ReactivationController do
+ use PhilomenaWeb, :controller
+
+ def index(conn, _params) do
+ text(conn, "hello world")
+ end
+end
diff --git a/lib/philomena_web/router.ex b/lib/philomena_web/router.ex
index 8753418d..d3777a6a 100644
--- a/lib/philomena_web/router.ex
+++ b/lib/philomena_web/router.ex
@@ -104,6 +104,7 @@ 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 82078ab2..ceb3e4b0 100644
--- a/lib/philomena_web/templates/deactivation/index.html.slime
+++ b/lib/philomena_web/templates/deactivation/index.html.slime
@@ -1,7 +1,9 @@
h1 Deactivate Account
+- contact_email = "ops@derpibooru.org"
.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 per GDPR law, please contact ops@derpibooru.org
-= button_to "Back", ~p"/registrations/edit", class: "button"
-= button_to "Confirm", ~p"/deactivations", class: "button", method: :delete, data: [confirm: "Are you sure you want to deactivate your account?"]
\ No newline at end of file
+ ' 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
diff --git a/lib/philomena_web/templates/registration/edit.html.slime b/lib/philomena_web/templates/registration/edit.html.slime
index 45133ee6..d72f7910 100644
--- a/lib/philomena_web/templates/registration/edit.html.slime
+++ b/lib/philomena_web/templates/registration/edit.html.slime
@@ -71,6 +71,6 @@ h3 Change password
= submit "Change password", class: "button"
h3 Deactivate Account
-= button_to "Deactivate account", ~p"/deactivations"
-p
- ' Navigate to the account deactivation page
\ No newline at end of file
+p
+ ' Navigate to the account deactivation page.
+= button_to "Deactivate account", ~p"/deactivations", class: "button"
\ No newline at end of file