修复店铺列表参数校验与企业权限

This commit is contained in:
2026-07-22 13:13:38 +09:00
parent d4d6e91256
commit 751cb46079
10 changed files with 545 additions and 58 deletions

View File

@@ -4,19 +4,19 @@
**Blocked by:** None — can start immediately.
**Status:** ready-for-agent
**Status:** completed
**架构通道:** 主通道为现有读取链路 `Handler → Service → Store → GORM/DTO`;不迁移到新的 Query 或 DDD 模块。
**完整业务边界:** 仅收口店铺列表请求参数校验、错误脱敏和分页一致性。明确不修改其他 Handler 的校验方式,不迁移店铺模块,不改变列表响应结构、已有筛选语义、排序或数据权限。
- [ ] 店铺列表在查询参数解析后对整个请求 DTO 执行校验,覆盖分页、名称、编号、上级店铺、层级和状态的既有约束。
- [ ] 查询参数解析失败或任一字段校验失败时,不执行店铺查询;客户端收到 HTTP 400、`code=1001``msg=参数验证失败``data=null` 和时间戳,响应不包含解析器或 Validator 的具体错误文本。
- [ ] 服务端日志保留请求上下文和具体失败原因但不记录数据库密码、JWT 密钥或其他敏感配置。
- [ ] 未传 `page``page_size` 时,查询前归一化为第 1 页、每页 20 条,并在响应中返回 `page=1``size=20`
- [ ] 显式提供的合法页码和每页数量原样生效,不因任何筛选条件被后端重置。
- [ ] HTTP 集成测试通过进程内 Fiber App、真实后台认证中间件、真实 PostgreSQL、Redis 和 JWT 配置验证成功及失败响应;测试数据和 Token 状态使用唯一标识并严格清理。
- [ ] 集成测试覆盖非法分页、非法层级、非法状态、超长名称或编号、默认分页、显式分页、未认证及无效 Token 等关键行为。
- [ ] OpenAPI 准确描述店铺列表已有字段的校验限制和分页契约,生成结果中不出现与本切片无关的漂移。
- [ ] UR#60 中文总结及 README 索引记录本切片的参数错误协议、默认分页行为、验证证据和明确不迁移的旧代码范围。
- [ ] 运行本切片目标测试、格式化、静态检查和相关构建,确认该行为可独立交付且不破坏原店铺列表语义。
- [x] 店铺列表在查询参数解析后对整个请求 DTO 执行校验,覆盖分页、名称、编号、上级店铺、层级和状态的既有约束。
- [x] 查询参数解析失败或任一字段校验失败时,不执行店铺查询;客户端收到 HTTP 400、`code=1001``msg=参数验证失败``data=null` 和时间戳,响应不包含解析器或 Validator 的具体错误文本。
- [x] 服务端日志保留请求上下文和具体失败原因但不记录数据库密码、JWT 密钥或其他敏感配置。
- [x] 未传 `page``page_size` 时,查询前归一化为第 1 页、每页 20 条,并在响应中返回 `page=1``size=20`
- [x] 显式提供的合法页码和每页数量原样生效,不因任何筛选条件被后端重置。
- [x] HTTP 集成测试通过进程内 Fiber App、真实后台认证中间件、真实 PostgreSQL、Redis 和 JWT 配置验证成功及失败响应;测试数据和 Token 状态使用唯一标识并严格清理。
- [x] 集成测试覆盖非法分页、非法层级、非法状态、超长名称或编号、默认分页、显式分页、未认证及无效 Token 等关键行为。
- [x] OpenAPI 准确描述店铺列表已有字段的校验限制和分页契约,生成结果中不出现与本切片无关的漂移。
- [x] UR#60 中文总结及 README 索引记录本切片的参数错误协议、默认分页行为、验证证据和明确不迁移的旧代码范围。
- [x] 运行本切片目标测试、格式化、静态检查和相关构建,确认该行为可独立交付且不破坏原店铺列表语义。

View File

@@ -4,19 +4,19 @@
**Blocked by:** None — can start immediately.
**Status:** ready-for-agent
**Status:** completed
**架构通道:** 路由与中间件权限通道;列表读取仍沿用现有读取链路。
**完整业务边界:** 只收口五个核心店铺管理路由的企业账号访问限制。明确不重新设计店铺角色、代理商资金概况、提现、佣金、钱包流水等独立路由的权限,也不改变认证机制或其他账号类型的数据范围。
- [ ] 企业账号访问店铺列表、创建、更新、删除或联级查询时,统一收到 HTTP 403、`code=1005``msg=无权限访问店铺管理功能``data=null` 和时间戳。
- [ ] 企业账号在进入核心 Handler 和业务查询前被拒绝,不能因没有代理店铺范围而获得全局店铺数据。
- [ ] 超级管理员和平台账号继续拥有原有核心店铺管理能力;代理账号继续遵循本店铺及全部下级店铺的数据范围。
- [ ] 访问限制只作用于五个核心店铺管理路由,不误拦截店铺角色、代理商资金概况、提现、佣金、钱包流水等独立路由。
- [ ] 真实 HTTP 集成测试覆盖四类账号的核心列表行为,以及企业账号访问其余四个核心路由的 403 行为。
- [ ] 回归测试证明独立 `/shops` 前缀路由仍由各自已有权限规则处理,未因路由分组调整产生权限漂移。
- [ ] 成功和拒绝响应均保持统一 `code``msg``data``timestamp` 外层结构,认证失败仍沿用既有认证错误契约。
- [ ] OpenAPI 或对应接口说明准确记录核心店铺管理的账号权限边界,不改变店铺角色、资金、佣金、提现和钱包流水的既有契约。
- [ ] UR#60 中文总结及 README 索引记录本切片的五个受限入口、未受影响路由、四类账号验证证据和明确不重新设计的授权范围。
- [ ] 运行本切片目标测试、格式化、静态检查和相关构建,确认权限切片能够独立发布和回滚。
- [x] 企业账号访问店铺列表、创建、更新、删除或联级查询时,统一收到 HTTP 403、`code=1005``msg=无权限访问店铺管理功能``data=null` 和时间戳。
- [x] 企业账号在进入核心 Handler 和业务查询前被拒绝,不能因没有代理店铺范围而获得全局店铺数据。
- [x] 超级管理员和平台账号继续拥有原有核心店铺管理能力;代理账号继续遵循本店铺及全部下级店铺的数据范围。
- [x] 访问限制只作用于五个核心店铺管理路由,不误拦截店铺角色、代理商资金概况、提现、佣金、钱包流水等独立路由。
- [x] 真实 HTTP 集成测试覆盖四类账号的核心列表行为,以及企业账号访问其余四个核心路由的 403 行为。
- [x] 回归测试证明独立 `/shops` 前缀路由仍由各自已有权限规则处理,未因路由分组调整产生权限漂移。
- [x] 成功和拒绝响应均保持统一 `code``msg``data``timestamp` 外层结构,认证失败仍沿用既有认证错误契约。
- [x] OpenAPI 或对应接口说明准确记录核心店铺管理的账号权限边界,不改变店铺角色、资金、佣金、提现和钱包流水的既有契约。
- [x] UR#60 中文总结及 README 索引记录本切片的五个受限入口、未受影响路由、四类账号验证证据和明确不重新设计的授权范围。
- [x] 运行本切片目标测试、格式化、静态检查和相关构建,确认权限切片能够独立发布和回滚。