package handlers import ( "errors" "strconv" "strings" "polar/internal/user" "polar/internal/web/middleware" "github.com/gofiber/fiber/v2" ) func (h *Handler) AdminApproveUserSubmit(c *fiber.Ctx) error { id, err := strconv.ParseInt(c.Params("id"), 10, 64) if err != nil { return c.Redirect("/admin", fiber.StatusSeeOther) } target, err := h.userSvc.GetByID(c.UserContext(), id) if err != nil { h.setFlashT(c, "flash.admin_user_missing") return c.Redirect("/admin", fiber.StatusSeeOther) } if err := h.userSvc.SetApproved(c.UserContext(), target.ID, true); err != nil { h.logger.Error("approve account failed", "user_id", target.ID, "err", err) h.setFlashT(c, "flash.admin_user_update_failed") return c.Redirect("/admin", fiber.StatusSeeOther) } h.setFlashT(c, "flash.admin_user_approved", target.Username) return c.Redirect("/admin", fiber.StatusSeeOther) } func (h *Handler) AdminToggleUserAdminSubmit(c *fiber.Ctx) error { id, err := strconv.ParseInt(c.Params("id"), 10, 64) if err != nil { return c.Redirect("/admin", fiber.StatusSeeOther) } current := middleware.CurrentUser(c) target, err := h.userSvc.GetByID(c.UserContext(), id) if err != nil { h.setFlashT(c, "flash.admin_user_missing") return c.Redirect("/admin", fiber.StatusSeeOther) } if current != nil && target.ID == current.ID { h.setFlashT(c, "flash.admin_self_role") return c.Redirect("/admin", fiber.StatusSeeOther) } if err := h.userSvc.SetAdmin(c.UserContext(), target.ID, !target.IsAdmin); err != nil { if errors.Is(err, user.ErrLastAdmin) { h.setFlashT(c, "flash.admin_last_admin") } else { h.logger.Error("update administrator role failed", "user_id", target.ID, "err", err) h.setFlashT(c, "flash.admin_user_update_failed") } return c.Redirect("/admin", fiber.StatusSeeOther) } h.setFlashT(c, "flash.admin_role_updated", target.Username) return c.Redirect("/admin", fiber.StatusSeeOther) } func (h *Handler) AdminDeleteUserSubmit(c *fiber.Ctx) error { id, err := strconv.ParseInt(c.Params("id"), 10, 64) if err != nil { return c.Redirect("/admin", fiber.StatusSeeOther) } current := middleware.CurrentUser(c) target, err := h.userSvc.GetByID(c.UserContext(), id) if err != nil { h.setFlashT(c, "flash.admin_user_missing") return c.Redirect("/admin", fiber.StatusSeeOther) } if current != nil && target.ID == current.ID { h.setFlashT(c, "flash.admin_delete_self") return c.Redirect("/admin", fiber.StatusSeeOther) } if !strings.EqualFold(strings.TrimSpace(c.FormValue("confirm_username")), target.Username) { h.setFlashT(c, "flash.admin_delete_mismatch") return c.Redirect("/admin", fiber.StatusSeeOther) } if err := h.deleteAccount(c.UserContext(), target); err != nil { h.logger.Error("admin delete account failed", "user_id", target.ID, "err", err) if errors.Is(err, user.ErrLastAdmin) { h.setFlashT(c, "flash.admin_last_admin") } else { h.setFlashT(c, "flash.admin_user_delete_failed") } return c.Redirect("/admin", fiber.StatusSeeOther) } h.setFlashT(c, "flash.admin_user_deleted", target.Username) return c.Redirect("/admin", fiber.StatusSeeOther) } func (h *Handler) AdminDeleteRepoSubmit(c *fiber.Ctx) error { id, err := strconv.ParseInt(c.Params("id"), 10, 64) if err != nil { return c.Redirect("/admin", fiber.StatusSeeOther) } r, err := h.repoSvc.GetByID(c.UserContext(), id) if err != nil { h.setFlashT(c, "flash.admin_repo_missing") return c.Redirect("/admin", fiber.StatusSeeOther) } if !strings.EqualFold(strings.TrimSpace(c.FormValue("confirm_name")), r.Name) { h.setFlashT(c, "flash.admin_delete_mismatch") return c.Redirect("/admin", fiber.StatusSeeOther) } if err := h.repoSvc.Delete(c.UserContext(), r); err != nil { h.logger.Error("admin delete repository failed", "repo_id", r.ID, "err", err) h.setFlashT(c, "flash.admin_repo_delete_failed") return c.Redirect("/admin", fiber.StatusSeeOther) } h.setFlashT(c, "flash.admin_repo_deleted", r.OwnerUsername, r.Name) return c.Redirect("/admin", fiber.StatusSeeOther) }