package admin import ( "github.com/gofiber/fiber/v2" "github.com/break/junhong_cmp_fiber/internal/model/dto" "github.com/break/junhong_cmp_fiber/internal/service/operation_password" "github.com/break/junhong_cmp_fiber/pkg/constants" "github.com/break/junhong_cmp_fiber/pkg/errors" "github.com/break/junhong_cmp_fiber/pkg/middleware" "github.com/break/junhong_cmp_fiber/pkg/response" ) // SuperAdminHandler 超级管理员专属操作处理器 type SuperAdminHandler struct { operationPasswordService *operation_password.Service } // NewSuperAdminHandler 创建超级管理员处理器 func NewSuperAdminHandler(operationPasswordService *operation_password.Service) *SuperAdminHandler { return &SuperAdminHandler{ operationPasswordService: operationPasswordService, } } // SetOperationPassword 设置/修改全局操作密码(仅超级管理员) // POST /api/admin/super-admin/operation-password func (h *SuperAdminHandler) SetOperationPassword(c *fiber.Ctx) error { userType := middleware.GetUserTypeFromContext(c.UserContext()) if userType != constants.UserTypeSuperAdmin { return errors.New(errors.CodeForbidden, "无权限操作该资源或资源不存在") } var req dto.SetOperationPasswordRequest if err := c.BodyParser(&req); err != nil { return errors.New(errors.CodeInvalidParam, "请求参数解析失败") } if req.Password == "" || req.ConfirmPassword == "" { return errors.New(errors.CodeInvalidParam) } if req.Password != req.ConfirmPassword { return errors.New(errors.CodeInvalidParam, "两次输入的密码不一致") } if len(req.Password) < 6 || len(req.Password) > 50 { return errors.New(errors.CodeInvalidParam, "密码长度必须在 6~50 位之间") } ctx := c.UserContext() if err := h.operationPasswordService.Set(ctx, req.Password); err != nil { return err } return response.Success(c, nil) } // GetOperationPasswordStatus 查询操作密码是否已设置(仅超级管理员) // GET /api/admin/super-admin/operation-password/status func (h *SuperAdminHandler) GetOperationPasswordStatus(c *fiber.Ctx) error { userType := middleware.GetUserTypeFromContext(c.UserContext()) if userType != constants.UserTypeSuperAdmin { return errors.New(errors.CodeForbidden, "无权限操作该资源或资源不存在") } ctx := c.UserContext() isSet := h.operationPasswordService.IsSet(ctx) return response.Success(c, &dto.OperationPasswordStatusResponse{IsSet: isSet}) }