Adds deaction page and begins working on reactivation.

This commit is contained in:
May Tusek 2025-02-13 19:26:22 -08:00
parent abfab90cfe
commit 94abf230d3
10 changed files with 79 additions and 9 deletions

View file

@ -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";

View file

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

View file

@ -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.

View file

@ -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

View file

@ -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.
"""

View file

@ -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

View file

@ -0,0 +1,7 @@
defmodule PhilomenaWeb.ReactivationController do
use PhilomenaWeb, :controller
def index(conn, _params) do
text(conn, "hello world")
end
end

View file

@ -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

View file

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

View file

@ -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
' Navigate to the account deactivation page.
= button_to "Deactivate account", ~p"/deactivations", class: "button"