diff --git a/lib/cannery/accounts.ex b/lib/cannery/accounts.ex index 0a8ee8aa..b1294fb4 100644 --- a/lib/cannery/accounts.ex +++ b/lib/cannery/accounts.ex @@ -244,6 +244,11 @@ defmodule Cannery.Accounts do end end + @spec delete_user!(User.t()) :: User.t() + def delete_user!(%User{} = user) do + user |> Repo.delete!() + end + ## Session @doc """ diff --git a/lib/cannery_web/controllers/user_settings_controller.ex b/lib/cannery_web/controllers/user_settings_controller.ex index 0fd6477c..eb709d70 100644 --- a/lib/cannery_web/controllers/user_settings_controller.ex +++ b/lib/cannery_web/controllers/user_settings_controller.ex @@ -64,6 +64,20 @@ defmodule CanneryWeb.UserSettingsController do end end + def delete(conn, %{"id" => user_id}) do + if user_id == conn.assigns.current_user.id do + Accounts.delete_user!(conn.assigns.current_user) + + conn + |> put_flash(:error, "Your account has been deleted") + |> redirect(to: Routes.home_path(conn, :index)) + else + conn + |> put_flash(:error, "Unable to delete user") + |> redirect(to: Routes.user_settings_path(conn, :edit)) + end + end + defp assign_email_and_password_changesets(conn, _opts) do user = conn.assigns.current_user diff --git a/lib/cannery_web/router.ex b/lib/cannery_web/router.ex index 4d78e865..a14aa2b3 100644 --- a/lib/cannery_web/router.ex +++ b/lib/cannery_web/router.ex @@ -12,7 +12,7 @@ defmodule CanneryWeb.Router do plug :put_secure_browser_headers plug :fetch_current_user end - + pipeline :require_admin do plug :require_role, role: :admin end @@ -26,7 +26,7 @@ defmodule CanneryWeb.Router do live "/", HomeLive, :index end - + ## Authentication routes scope "/", CanneryWeb do @@ -47,6 +47,7 @@ defmodule CanneryWeb.Router do get "/users/settings", UserSettingsController, :edit put "/users/settings", UserSettingsController, :update + delete "/users/settings/:id", UserSettingsController, :delete get "/users/settings/confirm_email/:token", UserSettingsController, :confirm_email live "/tags", TagLive.Index, :index @@ -80,7 +81,7 @@ defmodule CanneryWeb.Router do scope "/", CanneryWeb do pipe_through [:browser, :require_authenticated_user, :require_admin] - + live_dashboard "/dashboard", metrics: CanneryWeb.Telemetry, ecto_repos: [Cannery.Repo] live "/invites", InviteLive.Index, :index diff --git a/lib/cannery_web/templates/user_settings/edit.html.eex b/lib/cannery_web/templates/user_settings/edit.html.eex index c01db3a9..c17956a8 100644 --- a/lib/cannery_web/templates/user_settings/edit.html.eex +++ b/lib/cannery_web/templates/user_settings/edit.html.eex @@ -1,4 +1,4 @@ -
+

Settings

@@ -22,7 +22,7 @@ <%= email_input f, :email, required: true, class: "input input-primary col-span-2" %>
<%= error_tag f, :email %> - +
<%= label f, :current_password, for: "current_password_for_email", class: "title text-lg text-primary-500" %> <%= password_input f, :current_password, @@ -58,7 +58,7 @@ class: "input input-primary col-span-2" %>
<%= error_tag f, :password %> - +
<%= label f, :password_confirmation, "Confirm new password", class: "title text-lg text-primary-500" %> @@ -67,7 +67,7 @@ class: "input input-primary col-span-2" %>
<%= error_tag f, :password_confirmation %> - +
<%= label f, :current_password, for: "current_password_for_password", @@ -82,4 +82,8 @@ <%= submit "Change password", class: "btn btn-primary" %> <% end %> -
\ No newline at end of file + + <%= link "Delete User", to: Routes.user_settings_path(@conn, :delete, @current_user), + method: :delete, class: "btn btn-alert", + data: [confirm: "Are you sure you want to delete your account?"] %> +