package handlers import ( "context" "errors" "strings" "polar/internal/user" "polar/internal/web/middleware" "github.com/gofiber/fiber/v2" ) func (h *Handler) deleteAccount(ctx context.Context, account *user.User) error { if account == nil { return user.ErrUserNotFound } if err := h.repoSvc.DeleteAllByOwner(ctx, account); err != nil { return err } return h.userSvc.Delete(ctx, account.ID) } func (h *Handler) DeleteAccountSubmit(c *fiber.Ctx) error { current := middleware.CurrentUser(c) if current == nil { return c.Redirect("/login", fiber.StatusSeeOther) } confirm := strings.TrimSpace(c.FormValue("confirm_username")) password := c.FormValue("password") if !strings.EqualFold(confirm, current.Username) { h.setFlashT(c, "settings.delete_mismatch") return c.Redirect("/settings#danger", fiber.StatusSeeOther) } if _, err := h.userSvc.Authenticate(c.UserContext(), current.Username, password); err != nil { h.setFlashT(c, "auth.invalid_creds") return c.Redirect("/settings#danger", fiber.StatusSeeOther) } if err := h.deleteAccount(c.UserContext(), current); err != nil { h.logger.Error("delete account failed", "user_id", current.ID, "err", err) if errors.Is(err, user.ErrLastAdmin) { h.setFlashT(c, "settings.delete_last_admin") } else { h.setFlashT(c, "flash.account_delete_failed") } return c.Redirect("/settings#danger", fiber.StatusSeeOther) } c.ClearCookie(middleware.SessionCookieName) h.setFlashT(c, "flash.account_deleted") return c.Redirect("/", fiber.StatusSeeOther) }