package controller import ( "net/http" "gofaster/internal/auth/model" "gofaster/internal/auth/service" "gofaster/internal/shared/middleware" "gofaster/internal/shared/response" "github.com/gin-gonic/gin" ) type PasswordController struct { passwordService *service.PasswordService userService *service.UserService } func NewPasswordController( passwordService *service.PasswordService, userService *service.UserService, ) *PasswordController { return &PasswordController{ passwordService: passwordService, userService: userService, } } // ChangePassword 修改密码 // @Summary 修改密码 // @Description 用户修改自己的密码 // @Tags 密码管理 // @Accept json // @Produce json // @Param request body object{current_password=string,new_password=string,confirm_password=string} true "密码修改请求" // @Success 200 {object} response.Response // @Failure 400 {object} response.Response // @Failure 500 {object} response.Response // @Router /api/auth/change-password [post] func (c *PasswordController) ChangePassword(ctx *gin.Context) { var req struct { CurrentPassword string `json:"current_password" binding:"required"` NewPassword string `json:"new_password" binding:"required"` ConfirmPassword string `json:"confirm_password" binding:"required"` } if err := ctx.ShouldBindJSON(&req); err != nil { response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error()) return } // 验证确认密码 if req.NewPassword != req.ConfirmPassword { response.Error(ctx, http.StatusBadRequest, "新密码与确认密码不一致", "") return } // 获取当前用户ID userID := middleware.GetUserID(ctx) // 调用服务层修改密码 err := c.passwordService.ChangePassword(ctx, userID, req.CurrentPassword, req.NewPassword) if err != nil { response.Error(ctx, http.StatusInternalServerError, "修改密码失败", err.Error()) return } response.Success(ctx, "密码修改成功", nil) } // ResetPassword 重置密码 // @Summary 重置密码 // @Description 管理员重置用户密码 // @Tags 密码管理 // @Accept json // @Produce json // @Param id path int true "用户ID" // @Param request body object{new_password=string} true "新密码" // @Success 200 {object} response.Response // @Failure 400 {object} response.Response // @Failure 500 {object} response.Response // @Router /api/auth/admin/users/{id}/reset-password [post] func (c *PasswordController) ResetPassword(ctx *gin.Context) { var req struct { UserID uint `json:"user_id" binding:"required"` } if err := ctx.ShouldBindJSON(&req); err != nil { response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error()) return } // 调用服务层重置密码 err := c.passwordService.ResetPassword(ctx, req.UserID) if err != nil { response.Error(ctx, http.StatusInternalServerError, "重置密码失败", err.Error()) return } response.Success(ctx, "密码重置成功", nil) } // GetPasswordPolicy 获取密码策略 // @Summary 获取密码策略 // @Description 获取系统密码策略配置 // @Tags 密码管理 // @Accept json // @Produce json // @Success 200 {object} response.Response{data=model.PasswordPolicy} // @Failure 500 {object} response.Response // @Router /api/auth/password-policy [get] func (c *PasswordController) GetPasswordPolicy(ctx *gin.Context) { policy, err := c.passwordService.GetPasswordPolicy() if err != nil { response.Error(ctx, http.StatusInternalServerError, "获取密码策略失败", err.Error()) return } response.Success(ctx, "获取密码策略成功", policy) } // ValidatePassword 验证密码 // @Summary 验证密码 // @Description 验证密码是否符合策略要求 // @Tags 密码管理 // @Accept json // @Produce json // @Param request body object{password=string} true "密码" // @Success 200 {object} response.Response{data=object{valid=bool,message=string}} // @Failure 400 {object} response.Response // @Router /api/auth/validate-password [post] func (c *PasswordController) ValidatePassword(ctx *gin.Context) { var req struct { Password string `json:"password" binding:"required"` } if err := ctx.ShouldBindJSON(&req); err != nil { response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error()) return } // 获取当前用户ID userID := middleware.GetUserID(ctx) result, err := c.passwordService.ValidatePassword(ctx, userID, req.Password) if err != nil { response.Error(ctx, http.StatusInternalServerError, "密码验证失败", err.Error()) return } response.Success(ctx, "密码验证完成", result) } // CheckPasswordStatus 检查密码状态 // @Summary 检查密码状态 // @Description 检查当前用户密码状态(是否需要修改) // @Tags 密码管理 // @Accept json // @Produce json // @Success 200 {object} response.Response{data=object{need_change=bool,days_remaining=int}} // @Failure 500 {object} response.Response // @Router /api/auth/password-status [get] func (c *PasswordController) CheckPasswordStatus(ctx *gin.Context) { userID := middleware.GetUserID(ctx) status, err := c.passwordService.CheckPasswordStatus(ctx, userID) if err != nil { response.Error(ctx, http.StatusInternalServerError, "检查密码状态失败", err.Error()) return } response.Success(ctx, "检查密码状态成功", status) } // UpdatePasswordPolicy 更新密码策略 // @Summary 更新密码策略 // @Description 管理员更新系统密码策略配置 // @Tags 密码管理 // @Accept json // @Produce json // @Param policy body model.PasswordPolicy true "密码策略" // @Success 200 {object} response.Response{data=model.PasswordPolicy} // @Failure 400 {object} response.Response // @Failure 500 {object} response.Response // @Router /api/auth/admin/password-policy [put] func (c *PasswordController) UpdatePasswordPolicy(ctx *gin.Context) { var policy model.PasswordPolicy if err := ctx.ShouldBindJSON(&policy); err != nil { response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error()) return } err := c.passwordService.UpdatePasswordPolicy(&policy) if err != nil { response.Error(ctx, http.StatusInternalServerError, "更新密码策略失败", err.Error()) return } response.Success(ctx, "密码策略更新成功", nil) }