Archived
refactor: 两个「数据泥团」收成 dataclass / 字典
为什么:上一轮报告「11 个参数 > 6」的清单实测只有 7 个 ≥7 参数,其中真正 该改的是 2 个(另 5 个是 HTTP/下载原语的参数透传,合并反而降低清晰度,有意 保留)。 1) auth_system.create_user(11 参 → 6 参) 前 5 个是账号属性(username/password/email/credits/role,同属一个概念), 后 6 个才是泥团——它们是「注册风控上下文」(同 IP 频率闸 + 设备赠送闸)。 收成 frozen dataclass RegistrationGuard,默认值等价于「不做任何风控」,故 老调用点语义不变。 2) web/routers/download.py._single_task(11 参 → 2 参) 11 个位置参数改成一个 params 字典 + device_id,字典原样透传给 worker。 顺带删掉原本就**未被使用**的 data 参数(11 个里有 1 个是死的)。 理由不是「参数多」而是这 11 个位置参数没有名字,调用点极易错序。 教训:create_user 签名重构时漏改 web/routers/admin_site.py:155,pytest 189 例 全绿(该端点无测试覆盖)但 pyright 报出 2 errors —— 两道门禁互补的实证, 说明类型检查不是冗余。
This commit is contained in:
1 parent
0569b50737
commit
3de75f7479
5 files changed
+53
-27
No files matched your search
+14
-10
@@ -169,8 +169,12 @@ async def download(user: Annotated[SiteUser | None, Depends(current_user)], requ
|
||||
# file 模式:注册后台任务
|
||||
device_id = str(data.get('device_id') or '').strip()[:64]
|
||||
await asyncio.to_thread(services_tasks._touch_device, device_id)
|
||||
task = _single_task(data, music_id, quality, filename_format, write_meta,
|
||||
meta_fields, lyric_format, need_zip, cookies, ip, device_id)
|
||||
task = _single_task({
|
||||
'music_id': music_id, 'quality': quality,
|
||||
'filename_format': filename_format, 'write_meta': write_meta,
|
||||
'meta_fields': meta_fields, 'lyric_format': lyric_format,
|
||||
'need_zip': need_zip, 'cookies': cookies, 'remote_ip': ip,
|
||||
}, device_id)
|
||||
reg_err = await register_download_task(billing, task, str(data.get('task_id') or '').strip())
|
||||
if reg_err:
|
||||
await billing.refund_open('rejected')
|
||||
@@ -189,20 +193,20 @@ async def download(user: Annotated[SiteUser | None, Depends(current_user)], requ
|
||||
return error('服务暂时不可用,请稍后再试', 500)
|
||||
|
||||
|
||||
def _single_task(data, music_id, quality, filename_format, write_meta, meta_fields,
|
||||
lyric_format, need_zip, cookies, ip, device_id) -> dict[str, Any]:
|
||||
def _single_task(params: dict[str, Any], device_id: str) -> dict[str, Any]:
|
||||
"""组装单曲下载任务记录(params 原样透传给 worker)。
|
||||
|
||||
改成「一个字典 + device_id」而非 11 个位置参数:原先调用点要按固定顺序
|
||||
传 11 个几乎全是字符串的参数,错位不报错却会静默串味(quality 与
|
||||
filename_format 互换这类),而本函数只是把它们原样放进 params。
|
||||
"""
|
||||
return {
|
||||
'type': 'single',
|
||||
'total': 1, 'done': 0, 'failed': 0,
|
||||
'status': 'queued', 'start': time.time(), 'msg': '排队中...',
|
||||
'cancel': threading.Event(), 'pause': threading.Event(),
|
||||
'device_id': device_id, 'result': None,
|
||||
'params': {
|
||||
'music_id': music_id, 'quality': quality,
|
||||
'filename_format': filename_format, 'write_meta': write_meta,
|
||||
'meta_fields': meta_fields, 'lyric_format': lyric_format,
|
||||
'need_zip': need_zip, 'cookies': cookies, 'remote_ip': ip,
|
||||
},
|
||||
'params': params,
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user