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

- 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>
This commit is contained in:
2026-07-03 18:30:09 +08:00
parent 93f052535e
commit ea60dc391b
3 changed files with 53 additions and 1 deletions
+12
View File
@@ -69,6 +69,18 @@ def complete_onboarding(
return OkResponse()
@router.post("/onboarding/reset", response_model=OkResponse, summary="重置新手引导(删该 设备+账号 完成标记,下次登录重走)")
def reset_onboarding(
req: OnboardingCompleteRequest, user: CurrentUser, db: DbSession
) -> OkResponse:
"""删该 (当前账号, device_id) 的引导完成标记 → 下次登录 onboarding_completed=false,客户端重走。
与 /onboarding/complete 互逆。device_id 取客户端硬件级 ANDROID_ID(与登录/complete 一致)。
幂等:无记录也返回 ok。仅删自己(当前 JWT 用户)这台设备的记录,不影响别的账号/设备。"""
deleted = onboarding_repo.delete_completion(db, user_id=user.id, device_id=req.device_id)
logger.info("onboarding reset user_id=%d device_len=%d deleted=%d", user.id, len(req.device_id), deleted)
return OkResponse()
@router.get(
"/onboarding/status",
response_model=OnboardingStatusResponse,