feat(onboarding): force_onboarding 改设备维度 + admin 设备管理 + status 查询
废弃 force_onboarding(运营按用户强制引导,客户端不认——被 onboarding_completed 压过), 改用 onboarding_completion(设备+账号 维度),admin 直接增删该表记录控制重走。 - 删 force_onboarding: User 列 + auth/admin schema + admin 接口 + mutations + repo clear + /onboarding/complete 调用 + 3 测试;新增 alembic 迁移删列 - admin 设备管理: 列设备(按 device 聚合) / 重置单设备 / 全部重置(清 onboarding_completion) - 新增 GET /api/v1/user/onboarding/status: 客户端已登录启动查"本设备是否要重走引导" Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -65,33 +65,3 @@ def test_onboarding_missing_device_id_treated_as_incomplete(client) -> None:
|
||||
phone = "13800138003"
|
||||
data = _login(client, phone, device_id=None)
|
||||
assert data["onboarding_completed"] is False
|
||||
|
||||
|
||||
def test_complete_clears_force_onboarding(client) -> None:
|
||||
"""运营「一键开启新手引导」(force_onboarding=True)后,用户走完引导即自动清除该标记,
|
||||
/me 随之回到 false——否则下次启动会被无限拉回引导。"""
|
||||
from app.db.session import SessionLocal
|
||||
from app.models.user import User
|
||||
|
||||
phone = "13800138004"
|
||||
dev = "android-id-force"
|
||||
data = _login(client, phone, dev)
|
||||
access = data["access_token"]
|
||||
uid = data["user"]["id"]
|
||||
|
||||
# 模拟运营在后台一键开启(admin 接口本身另在 test_admin_write 覆盖)
|
||||
db = SessionLocal()
|
||||
try:
|
||||
db.get(User, uid).force_onboarding = True
|
||||
db.commit()
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
def _me() -> dict:
|
||||
return client.get(
|
||||
"/api/v1/auth/me", headers={"Authorization": f"Bearer {access}"}
|
||||
).json()
|
||||
|
||||
assert _me()["force_onboarding"] is True
|
||||
assert _mark_complete(client, access, dev).status_code == 200
|
||||
assert _me()["force_onboarding"] is False
|
||||
|
||||
Reference in New Issue
Block a user