Files
ft/CodexOutput/upserver/F1-F2-F3实施方案.md

35 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# F1/F2/F3实施方案与评审
2026-09-21,用户已要求继续执行。先核对审查意见与服务端CreateClub/QuitClub实现及客户端调用者,再记录以下裁决。
## F3 退出入口
通过:QuitAct在第一个await及UI/配置清理之前,若QuitStage.Logout=true,消费该标记并调用Logout。无需注销路径不调用Logout。AggUserService先base.Logout使认证代际/HTTP失效,再退出渠道SDK;QuitAct捕获注销/Hub释放异常并继续必要清理。OnStarted不再重复注销。测试实际QuitAct在Hub释放阻塞、释放异常、非注销及重复启动路径上的顺序;HTTP/API迟到仍由既有版本保护测试覆盖,SDK真实回调另列限制。
文件边界:QuitAct、AggUserService,必要时UserService退出字段顺序以保证立即失效。
## F1 身份清单
以下本人字段统一取已授权的ApiPlayerId并固定请求时会话版本:GetClubDetails、CreateClub、ApplyClub、GetApplyList、QuitClub、Demote、Promote、Kickout、ReadClubEvent、ClubSingin、GetServiceEvent。GetSelfClub已有修复保留。
CreateClub的internalIdToPlayerId自身缓存及ClubSingin系统消息改为同一数字ID。UserService.UserId与PlayFab存档命名空间不改。
目标字段保持目标含义:HandleApply.applyId来自申请列表GetApplyList.userIDList;Demote/Promote/Kickout目标来自GetClubDetails.clubPlayerProfiles.playerId;QuitClub.appointId来自成员列表选择。服务端GetPlayerID使用十进制PlayerIdUtil.ToString。旧DTO/UI名称playFabId暂保留,但不能将目标替成本人;提交目标前验证十进制正数。HandleApply空字符串批量拒绝、QuitClub的0/空为不指定继任者保留。
未认证、目标非法不发请求。每个受改方法await返回后检查会话仍有效,二次聊天await也检查。副作用尽量在成功响应之后执行;不宣称其他服务所有跨账号调用已完成隔离。
## F2 响应成功语义
CreateClub本地契约code0新建、1已有俱乐部、2失败。调用UI见非null会扣创建消耗,因此仅code0且clubInfo非空/有效ID返回成功;code1不伪装创建成功、不重复扣减、不覆盖现有状态,用户随后可GetSelfClub同步。错误/空/非法JSON/缺失code/业务失败/过期响应返回null且不改状态,不发成功事件。
QuitClub仅显式code0或1(已不在俱乐部)确认不再有会员身份后清理;code2/网络失败/非法响应保留原状态。明确解析code整数,不能把{}默认code0当成功。成功才退出聊天、清状态、提示、发事件。
同批触及的Kickout/HandleApply移除原预先修改成员计数/申请列表行为,显式code0后处理;签到不在失败前写本地时间,其他code语义保持服务端合同。
文件边界:ClubService;必要测试宿主提取原方法/实际源文件,不改服务器、不做正式服会员/资产操作。
## 验收与风险
实际生产源编译、受改方法隔离测试(模拟传输/引擎)覆盖缺失授权、本人/目标区分、成功/业务失败/网络空结果/HTTP映射失败、旧响应无副作用;实际QuitAct顺序测试。生成脚本/测试命令/结果均存盘。独立review发现阻塞项修复后复审。
不会执行真实创建/退出俱乐部;本地契约不等同线上版本保证。原有ClubService其他外围功能以及渠道SDK全局内部状态仍须专项验收,不扩大本批结论。
裁决:上述方案与开发边界完整评审通过,允许按F3→F1/F2顺序实施。每个小任务完成记录日志。
### 调用链补充评审
成员操作UI仍用旧UserId判断本人,会把本人展示为可踢/可指定继任者。补充通过:ClubChooseHeirPopupPanel、ClubInfoPopupPanel、ClubApplyPopupPanel的服务器成员ID与本人比较改ApiPlayerId;服务方法拒绝以自己作为继任者/升降职/踢人目标。ClubService.SendSystemMessage2的本人消息前缀同步改数字ID并检查授权。其他聊天渲染/体力捐赠仍是后续清单,不借此宣称整个社交模块已迁移。
### 独立review反馈补充裁决
服务器HandleApply空playerId批量拒绝返回code4;通过补充仅在!isAgree且applyId为空时接受4,不把空ID同意作为合法操作。签到原先预设时间隐式抑制连点,现改为成功后写时间,需加入按会话的在途防重与当天成功判断;失败释放在途状态允许重试,不提前写存档。相应回归必须补齐后再验收。
### 签到调用者补充
review确认SocialClubJoined.OnSign原先依赖同步更新signTime立即刷新按钮。补充通过文件边界:ClubSingin改Task,OnSign等待完成,期间禁用按钮,finally在同会话且UI仍存活时刷新CD并恢复交互;非同会话不刷新。使用完整Date而非DayOfYear比较,避免跨年同日误判。模拟测试覆盖并发/失败重试/旧会话不发奖。