f0c80e51b9
- user 加 debug_trace_enabled、comparison_record 加 trace_url
- 迁移 f8d3b1e60a27:加两列,down_revision 用 tuple 顺带合并既存双 head(invite_fingerprint_table + 044dce6e9b1f)
- UserOut 加 debug_trace_enabled → /me 与登录响应带出
- ComparisonRecordIn/Out 加 trace_url;upsert 落库
- /compare/records 列表与详情按 user.debug_trace_enabled 下发;详情连 raw_payload 里那份一并抹掉,防权限绕过
- admin 加 POST /users/{id}/debug-trace(operator + 审计),列表带该字段
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
"""admin 写操作 repo(状态改写)。
|
|
|
|
涉钱的金币/提现复用 app.repositories.wallet(grant_coins / refresh_withdraw_status /
|
|
reconcile_pending_withdraws),不在这里重写——重写涉钱逻辑就是给自己埋雷。
|
|
|
|
set_user_status / update_feedback_status 支持 commit=False,让 router 把"业务写 + 审计写"
|
|
放进同一事务一起 commit(原子:改了就有审计、有审计就真改了,见 plan 风险点 1)。
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.models.feedback import Feedback
|
|
from app.models.user import User
|
|
|
|
|
|
def set_user_status(db: Session, user: User, *, status: str, commit: bool = True) -> User:
|
|
user.status = status
|
|
if commit:
|
|
db.commit()
|
|
db.refresh(user)
|
|
else:
|
|
db.flush()
|
|
return user
|
|
|
|
|
|
def set_user_debug_trace(
|
|
db: Session, user: User, *, enabled: bool, commit: bool = True
|
|
) -> User:
|
|
"""开关用户「复制调试链接」权限。同 set_user_status:支持 commit=False 让 router 把
|
|
业务写 + 审计写放进同一事务。"""
|
|
user.debug_trace_enabled = enabled
|
|
if commit:
|
|
db.commit()
|
|
db.refresh(user)
|
|
else:
|
|
db.flush()
|
|
return user
|
|
|
|
|
|
def update_feedback_status(
|
|
db: Session, feedback: Feedback, *, status: str, commit: bool = True
|
|
) -> Feedback:
|
|
feedback.status = status
|
|
if commit:
|
|
db.commit()
|
|
db.refresh(feedback)
|
|
else:
|
|
db.flush()
|
|
return feedback
|