feat(onboarding): 新增重置新手引导端点 /api/v1/user/onboarding/reset #114

Merged
marco merged 3 commits from feat/compare-record-backend-harvest into main 2026-07-04 02:39:12 +08:00
Owner
No description provided.
marco added 2 commits 2026-07-04 02:17:39 +08:00
- user.py:新增 reset_onboarding 端点(需登录),删当前账号+该设备的引导完成标记,
  与 /onboarding/complete 互逆;幂等(无记录也返回 ok),只删自己不影响他人
- repositories/onboarding.py:新增 delete_completion(user_id, device_id),
  device_id 为空忽略,返回删除行数
- tests:补 test_onboarding_reset_makes_relogin_reonboard,覆盖
  完成 → 重置 → 再登录变未完成 + 重复重置幂等

配合客户端「开发设置 → 重置新手引导」:先删后端行再退登录重开,复现全新用户。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
compare.py 透传壳新增后端 harvest(不再依赖客户端 POST /compare/record):
- 帧0(客户端首帧不带 trace_id)由 app-server 用 uuid 签发 trace_id、注入转发 body、
  回填响应顶层,并按 trace_id 建 running 行(harvest_running)
- done 帧(command=done 且 continue=false)更新为 success/failed 终态,并对本次新落成
  success 幂等发一次邀请奖(harvest_done + try_reward_on_compare)
- /trace/finalize(用户终止/Phase1 未识别,无 done)更新为 cancelled/failed,
  不降级已 success(harvest_abort)
- 软鉴权 OptionalUser(deps.py 新增 get_current_user_optional):新客户端带 JWT 绑
  user_id,老客户端匿名建行、user_id 暂空,由其后续 POST /compare/record 按 trace_id
  reconcile;新版覆盖够高后可收紧成硬鉴权
- 结构化日志(logging.py 加 trace_id_ctx ContextVar):请求级 trace_id 贯穿 harvest 各阶段

comparison_record 表结构调整(迁移 comparison_record_trace_unique):
- 唯一键 (user_id,trace_id) → trace_id 单列(harvest 帧0 建行时 user_id 可能暂缺)
- user_id 改可空

repositories/comparison.py 加 harvest_running/harvest_done/harvest_abort;
compare_record.py 的 POST /record 降级为灰度期老客户端兼容(按 trace_id 幂等、不降级 success);
补 tests/test_compare_harvest.py,test_compare_proxy/milestone 适配。

文档同步: docs/database/comparison_record.md 更新表结构(唯一键/user_id 可空/status 取值)
与写入模型; docs/api/compare/compare-record-report.md 标注 POST /record 灰度定位。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
marco added 1 commit 2026-07-04 02:28:48 +08:00
解决 compare.py 冲突 + 对齐 #113 邀请发奖口径:
- compare.py 冲突(#112 新增 /trace/epilogue vs 本分支 harvest 重写):保留 harvest
  全套,把 #112 的 /trace/epilogue 端点从已删除的 _passthrough 改写到 _forward
  (harvest_first_frame=False 纯透传,不建行/不落库——该 trace 记录已由 done/finalize 落终态)
- 对齐 #113(发奖从「比价」改「实际下单」):从 harvest_done 移除 try_reward_on_compare
  调用 + 其 import,发奖只保留在 order.py(#113 加)。否则比价先于下单 + try_reward
  幂等闸会把奖落在「比价」这步,架空 #113 的「下单才发奖」防刷。同步清理相关
  docstring/summary(price_step「+发奖」措辞、模块头「幂等发一次邀请奖」)

验证:本分支 harvest/proxy/milestone 测试全绿(44 passed);py_compile 通过;无残留冲突标记。
注:tests/test_invite.py::test_bind_flow_no_coins_either_side 在 pristine origin/main 上
即已红(#113 改 invite 行为但未随附测试更新),非本次合并引入,不在本分支职责内。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
marco merged commit 3eb439b5ae into main 2026-07-04 02:39:12 +08:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WonderableAI/shaguabijia-app-server#114