# 设计:RoleHandler 请求验证 ## 上下文 项目中已有标准的请求验证模式: - 使用 `github.com/go-playground/validator/v10` 库 - 在 bootstrap 层创建全局 validator 实例 - Handler 构造函数接收 validator - 请求解析后立即调用 `validator.Struct()` 验证 AuthHandler 已正确实现此模式(参考 `internal/handler/admin/auth.go:34`),RoleHandler 需要遵循相同模式。 ## 目标 / 非目标 **目标:** - RoleHandler 遵循项目验证标准模式 - 所有请求在到达 Service 层前完成验证 - 取消被跳过的集成测试 **非目标:** - 不修改 DTO 的 validate 标签(已正确定义) - 不改变错误响应格式(使用现有 CodeInvalidParam) - 不引入新的验证库或模式 ## 决策 ### 决策 1:遵循 AuthHandler 模式 **方法:** 完全复制 AuthHandler 的验证模式到 RoleHandler **理由:** - 保持代码库一致性 - AuthHandler 模式已验证有效 - 无需重新设计验证流程 **实现细节:** ```go // 1. RoleHandler 结构体添加 validator 字段 type RoleHandler struct { service *roleService.Service validator *validator.Validate // 新增 } // 2. 构造函数接收 validator func NewRoleHandler(service *roleService.Service, validator *validator.Validate) *RoleHandler { return &RoleHandler{ service: service, validator: validator, } } // 3. Create 方法中验证 func (h *RoleHandler) Create(c *fiber.Ctx) error { var req dto.CreateRoleRequest if err := c.BodyParser(&req); err != nil { return errors.New(errors.CodeInvalidParam, "请求参数解析失败") } // 新增验证逻辑 if err := h.validator.Struct(&req); err != nil { return errors.New(errors.CodeInvalidParam, "参数验证失败: "+err.Error()) } // ... 现有逻辑 } ``` ### 决策 2:验证所有接受 body 的方法 **需要验证的方法:** - `Create()` - CreateRoleRequest - `Update()` - UpdateRoleRequest - `AssignPermissions()` - AssignPermissionsRequest - `UpdateStatus()` - UpdateRoleStatusRequest **不需要验证的方法:** - `Get()` - 只有路径参数,已有 ParseUint 检查 - `List()` - Query 参数,已有 QueryParser - `GetPermissions()` - 只有路径参数 - `RemovePermission()` - 只有路径参数 - `Delete()` - 只有路径参数 ### 决策 3:错误消息格式 **使用现有格式:** ```go errors.New(errors.CodeInvalidParam, "参数验证失败: "+err.Error()) ``` **理由:** - 与 AuthHandler 保持一致 - validator 库的错误消息已足够清晰 - 前端可以解析错误码和消息 ## 测试策略 - 取消 `tests/integration/role_test.go:51` 的 TODO 跳过 - 运行现有测试验证"缺少必填字段返回错误"场景 - 无需添加新测试(现有被跳过的测试已覆盖验证逻辑)