优化任务列表性能和本地登录代理
This commit is contained in:
@@ -118,7 +118,73 @@ def _account_out(account: Account) -> DouyuTaskAccountOut:
|
||||
)
|
||||
|
||||
|
||||
def _task_out(task: DouyuTask) -> DouyuTaskOut:
|
||||
def _slim_goods(goods: object) -> object:
|
||||
"""保留兑换图片和列表展示需要的商品小字段。"""
|
||||
if not isinstance(goods, dict):
|
||||
return None
|
||||
return {
|
||||
key: value
|
||||
for key, value in goods.items()
|
||||
if key in {"commodityId", "commodity_id", "commodityName", "name", "webPic", "pic", "score", "status"}
|
||||
}
|
||||
|
||||
|
||||
def _slim_limited_goods(goods: object) -> list[dict[str, object]]:
|
||||
"""限兑列表只返回前几个商品名,避免任务列表携带完整原始数组。"""
|
||||
if not isinstance(goods, list):
|
||||
return []
|
||||
result: list[dict[str, object]] = []
|
||||
for item in goods[:5]:
|
||||
if not isinstance(item, dict):
|
||||
continue
|
||||
result.append({
|
||||
key: value
|
||||
for key, value in item.items()
|
||||
if key in {"commodityId", "commodity_id", "commodityName", "name"}
|
||||
})
|
||||
return result
|
||||
|
||||
|
||||
def _sanitize_task_result(result: dict | None, task_type: str, *, include_detail: bool = False) -> dict | None:
|
||||
"""列表接口剥离原始快照/大数组;详情接口保留完整 result。"""
|
||||
if not isinstance(result, dict):
|
||||
return result
|
||||
if include_detail:
|
||||
return result
|
||||
|
||||
data = dict(result)
|
||||
for key in (
|
||||
"raw",
|
||||
"bind_info",
|
||||
"before_bind_info",
|
||||
"bind_candidates",
|
||||
"cooldown_bind_info",
|
||||
"after_bind_info",
|
||||
"activity_bind_snapshot",
|
||||
"points_query",
|
||||
"exchange_balance_query",
|
||||
"query_act_aliases",
|
||||
"records",
|
||||
):
|
||||
data.pop(key, None)
|
||||
|
||||
goods = data.get("goods")
|
||||
if isinstance(goods, list):
|
||||
data.pop("goods", None)
|
||||
elif isinstance(goods, dict):
|
||||
data["goods"] = _slim_goods(goods)
|
||||
|
||||
if "limited_goods" in data:
|
||||
data["limited_goods"] = _slim_limited_goods(data.get("limited_goods"))
|
||||
|
||||
if task_type not in {"get_bind_qr", "prepare_esports_bind", "get_esports_bind_qr"}:
|
||||
data.pop("url", None)
|
||||
if task_type not in {"create_elite_qr", "create_esports_qr", "create_gold_qr"}:
|
||||
data.pop("pay_url", None)
|
||||
return data
|
||||
|
||||
|
||||
def _task_out(task: DouyuTask, *, include_detail: bool = False) -> DouyuTaskOut:
|
||||
account = task.account
|
||||
return DouyuTaskOut(
|
||||
id=task.id,
|
||||
@@ -130,7 +196,11 @@ def _task_out(task: DouyuTask) -> DouyuTaskOut:
|
||||
task_type=task.task_type,
|
||||
status=task.status or "",
|
||||
message=task.message or "",
|
||||
result=task.result if isinstance(task.result, dict) else None,
|
||||
result=_sanitize_task_result(
|
||||
task.result if isinstance(task.result, dict) else None,
|
||||
task.task_type or "",
|
||||
include_detail=include_detail,
|
||||
),
|
||||
created_by=task.created_by,
|
||||
created_at=task.created_at,
|
||||
finished_at=task.finished_at,
|
||||
@@ -299,6 +369,7 @@ async def create_task_batch(
|
||||
@router.get("/tasks", response_model=list[DouyuTaskOut])
|
||||
def list_tasks(
|
||||
batch_id: str | None = None,
|
||||
include_detail: bool = Query(False, description="是否返回完整任务结果(默认否,轮询请保持 false)"),
|
||||
db: Session = Depends(get_db),
|
||||
current: User = Depends(require_permission("douyu:task")),
|
||||
):
|
||||
@@ -313,7 +384,7 @@ def list_tasks(
|
||||
if batch_id:
|
||||
query = query.filter(DouyuTask.batch_id == batch_id)
|
||||
rows = query.order_by(DouyuTask.id.desc()).limit(300).all()
|
||||
return [_task_out(task) for task in rows]
|
||||
return [_task_out(task, include_detail=include_detail) for task in rows]
|
||||
|
||||
|
||||
@router.get("/tasks/{task_id}", response_model=DouyuTaskOut)
|
||||
@@ -326,7 +397,7 @@ def get_task(
|
||||
task = _visible_tasks_query(db, current).filter(DouyuTask.id == task_id).first()
|
||||
if not task:
|
||||
raise HTTPException(status_code=404, detail="任务不存在")
|
||||
return _task_out(task)
|
||||
return _task_out(task, include_detail=True)
|
||||
|
||||
|
||||
@router.post("/stop/{batch_id}")
|
||||
|
||||
Reference in New Issue
Block a user