3.4 KiB
3.4 KiB
name, overview, todos, isProject
| name | overview | todos | isProject | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| wallet-bet-win-api-split | 评估并规划将 bet/win 从统一 update 入口中显式拆分为独立 API,同时保留兼容性与幂等语义。 |
|
false |
Bet/Win API 拆分评估与迁移计划
结论
- 对资金域来说,对外 API 语义上拆分
bet/win会更好:可读性、接入防错、风控审计与权限隔离都会更清晰。 - 但不建议直接废弃
update;建议采用“新增独立接口 +update兼容转发 + 渐进下线”的迁移路线,避免影响现有上游与历史幂等键。
现状依据
- 当前只有一个入口
app/api/controller/WalletController.php的update(),通过type分发。 - 分发逻辑在
app/api/logic/WalletLogic.php的ACTION_METHOD_MAP,bet/win已是独立业务方法。 - 入参模型
app/api/dto/request/wallet/WalletUpdateRequestDTO.php同时承载多类交易,round_id、is_end仅对 bet/win 有意义。 - 校验器
app/validator/Wallet2Validator.php也是“单场景 + 按 type 条件校验”,存在语义混杂。
目标形态
- 提供显式 API:
wallet/bet、wallet/win(自动路由下对应 Controller 方法)。 wallet/update保留为兼容入口:内部仅做 DTO 转换与分发,不承载新能力。- 资金与幂等规则保持不变:仍以
biz_id+type(必要时叠加round_id)确保可追溯与幂等。
实施步骤
- 在
app/api/controller/WalletController.php新增bet()与win()方法,复用统一返回封装。 - 拆分请求 DTO 与校验场景:
- 新增 bet/win 专用 DTO(从
WalletUpdateRequestDTO中抽取必要字段)。 - 在
app/validator/Wallet2Validator.php增加SCENE_BET、SCENE_WIN,去掉“按 type 再二次判断”的耦合。
- 新增 bet/win 专用 DTO(从
- 在 Logic 层保持复用:
- Controller 仍调用
app/api/logic/WalletLogic.php现有bet()/win()实现,避免资金路径重写。 update()对 bet/win 请求改为调用新入口共享流程(或内部代理),确保行为一致。
- Controller 仍调用
- 文档与对接迁移:
- 在
README.md与doc/wallet.md补充“新接口 + 兼容期 + 下线节奏”。 - 给上游约定迁移窗口,监控
update(type=bet|win)调用量后再决定是否下线。
- 在
验证要点
- 幂等:重复
biz_id命中行为与现状一致。 - Round:
win的is_end=0/1中间派奖与最终结算语义不变。 - 资金正确性:下注扣款顺序、派奖分配、流水字段不变。
- 可回滚:任一阶段可回退为仅使用
update入口。