style: 统一 Ruff 代码格式

This commit is contained in:
yml2213
2026-08-30 21:04:52 +08:00
parent c891ac982e
commit 47e19ed7b2
90 changed files with 5574 additions and 2350 deletions
+20 -5
View File
@@ -36,7 +36,10 @@ def _audit_log_out(db: Session, row: AuditLog) -> dict:
accounts = (
db.query(DouyuTask, Account)
.join(Account, Account.id == DouyuTask.account_id)
.filter(DouyuTask.batch_id == batch_id, DouyuTask.task_type == "create_gold_qr")
.filter(
DouyuTask.batch_id == batch_id,
DouyuTask.task_type == "create_gold_qr",
)
.order_by(DouyuTask.id.asc())
.limit(100)
.all()
@@ -56,14 +59,19 @@ def _audit_log_out(db: Session, row: AuditLog) -> dict:
batch_id = row.target.removeprefix("douyu_batch:")
task = (
db.query(DouyuTask)
.filter(DouyuTask.batch_id == batch_id, DouyuTask.task_type == "create_gold_qr")
.filter(
DouyuTask.batch_id == batch_id,
DouyuTask.task_type == "create_gold_qr",
)
.order_by(DouyuTask.id.asc())
.first()
)
task_result = task.result if task and isinstance(task.result, dict) else {}
recharge_channel = str(task_result.get("recharge_channel") or "wechat_qr")
detail["recharge_channel"] = recharge_channel
detail["payment_method"] = "API 直充支付" if recharge_channel == "supplier_api" else "微信扫码支付"
detail["payment_method"] = (
"API 直充支付" if recharge_channel == "supplier_api" else "微信扫码支付"
)
if isinstance(detail, dict):
detail_text = json.dumps(detail, ensure_ascii=False, separators=(",", ":"))
return {
@@ -99,7 +107,9 @@ def list_audit_logs(
query = query.filter(AuditLog.action == action.strip())
if keyword:
pattern = f"%{keyword.strip()}%"
query = query.filter((AuditLog.target.ilike(pattern)) | (AuditLog.detail.ilike(pattern)))
query = query.filter(
(AuditLog.target.ilike(pattern)) | (AuditLog.detail.ilike(pattern))
)
if success is not None:
query = query.filter(AuditLog.success == success)
if start_time:
@@ -107,7 +117,12 @@ def list_audit_logs(
if end_time:
query = query.filter(AuditLog.created_at <= end_time)
total = query.count()
rows = query.order_by(AuditLog.id.desc()).offset((page - 1) * page_size).limit(page_size).all()
rows = (
query.order_by(AuditLog.id.desc())
.offset((page - 1) * page_size)
.limit(page_size)
.all()
)
return {
"items": [_audit_log_out(db, row) for row in rows],
"total": total,
+16 -3
View File
@@ -41,7 +41,9 @@ def login(req: LoginRequest, response: Response, db: Session = Depends(get_db)):
)
# 审计
db.add(AuditLog(user_id=user.id, username=user.username, action="login", target="auth"))
db.add(
AuditLog(user_id=user.id, username=user.username, action="login", target="auth")
)
db.commit()
return TokenResponse(
@@ -66,8 +68,19 @@ def me(current_user: User = Depends(get_current_user)):
@router.post("/logout")
def logout(response: Response, current_user: User = Depends(get_current_user), db: Session = Depends(get_db)):
def logout(
response: Response,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db),
):
response.delete_cookie(key="access_token", path="/")
db.add(AuditLog(user_id=current_user.id, username=current_user.username, action="logout", target="auth"))
db.add(
AuditLog(
user_id=current_user.id,
username=current_user.username,
action="logout",
target="auth",
)
)
db.commit()
return {"message": "已登出"}
+37 -17
View File
@@ -44,7 +44,9 @@ def _empty_task_summary() -> dict:
def _can_view_huya_all(user: User) -> bool:
"""兼容旧 huya:account 全量权限。"""
return user_has_permission(user, "huya:view_all") or user_has_permission(user, "huya:account")
return user_has_permission(user, "huya:view_all") or user_has_permission(
user, "huya:account"
)
@router.get("/summary")
@@ -65,12 +67,17 @@ def dashboard_summary(
)
login_tasks = _empty_task_summary()
if any(user_has_permission(current, permission) for permission in (
"login:batch",
"login:view_all",
"login:view_assigned",
)):
login_query = db.query(LoginTask).join(Account, LoginTask.account_id == Account.id)
if any(
user_has_permission(current, permission)
for permission in (
"login:batch",
"login:view_all",
"login:view_assigned",
)
):
login_query = db.query(LoginTask).join(
Account, LoginTask.account_id == Account.id
)
if not user_has_permission(current, "login:view_all"):
login_query = login_query.filter(Account.assigned_to == current.id)
login_tasks = _task_summary(login_query, LoginTask)
@@ -87,27 +94,40 @@ def dashboard_summary(
cookies = cookie_query.with_entities(func.count(LoginTask.id)).scalar() or 0
huya_accounts = 0
can_view_huya_accounts = any(user_has_permission(current, permission) for permission in (
"huya:account",
"huya:view_all",
"huya:view_assigned",
))
can_view_huya_accounts = any(
user_has_permission(current, permission)
for permission in (
"huya:account",
"huya:view_all",
"huya:view_assigned",
)
)
if can_view_huya_accounts:
huya_account_query = db.query(HuyaAccount)
if not _can_view_huya_all(current):
huya_account_query = huya_account_query.filter(HuyaAccount.assigned_to == current.id)
huya_accounts = huya_account_query.with_entities(func.count(HuyaAccount.id)).scalar() or 0
huya_account_query = huya_account_query.filter(
HuyaAccount.assigned_to == current.id
)
huya_accounts = (
huya_account_query.with_entities(func.count(HuyaAccount.id)).scalar() or 0
)
huya_tasks = _empty_task_summary()
huya_goods = 0
huya_recharge_goods = 0
if user_has_permission(current, "huya:task"):
huya_task_query = db.query(HuyaTask).join(HuyaAccount, HuyaTask.account_id == HuyaAccount.id)
huya_task_query = db.query(HuyaTask).join(
HuyaAccount, HuyaTask.account_id == HuyaAccount.id
)
if not _can_view_huya_all(current):
huya_task_query = huya_task_query.filter(HuyaAccount.assigned_to == current.id)
huya_task_query = huya_task_query.filter(
HuyaAccount.assigned_to == current.id
)
huya_tasks = _task_summary(huya_task_query, HuyaTask)
huya_goods = db.query(func.count(HuyaGoodsSnapshot.id)).scalar() or 0
huya_recharge_goods = db.query(func.count(HuyaRechargeGoodsSnapshot.id)).scalar() or 0
huya_recharge_goods = (
db.query(func.count(HuyaRechargeGoodsSnapshot.id)).scalar() or 0
)
return {
"douyu": {
+24 -8
View File
@@ -106,7 +106,11 @@ def list_tasks(
current: User = Depends(get_current_user),
):
"""查看登录任务列表。"""
query = db.query(LoginTask).options(defer(LoginTask.cookie)).join(Account, LoginTask.account_id == Account.id)
query = (
db.query(LoginTask)
.options(defer(LoginTask.cookie))
.join(Account, LoginTask.account_id == Account.id)
)
# 客服只能看自己账号的任务
if not user_has_permission(current, "login:view_all"):
@@ -130,12 +134,20 @@ def list_tasks(
result = []
for t in rows:
result.append(LoginTaskOut(
id=t.id, batch_id=t.batch_id, account_id=t.account_id,
account_username=accounts_map.get(t.account_id, ""),
status=t.status, cookie="", message=t.message or "",
created_by=t.created_by, created_at=t.created_at, finished_at=t.finished_at,
))
result.append(
LoginTaskOut(
id=t.id,
batch_id=t.batch_id,
account_id=t.account_id,
account_username=accounts_map.get(t.account_id, ""),
status=t.status,
cookie="",
message=t.message or "",
created_by=t.created_by,
created_at=t.created_at,
finished_at=t.finished_at,
)
)
return result
@@ -178,7 +190,11 @@ def delete_tasks(
ids = [int(x) for x in task_ids.split(",") if x.strip().isdigit()]
if not ids:
raise HTTPException(status_code=400, detail="无效的任务ID")
deleted = db.query(LoginTask).filter(LoginTask.id.in_(ids)).delete(synchronize_session=False)
deleted = (
db.query(LoginTask)
.filter(LoginTask.id.in_(ids))
.delete(synchronize_session=False)
)
db.commit()
return {"message": f"已删除 {deleted} 个任务", "deleted": deleted, "success": True}
+15 -7
View File
@@ -11,7 +11,9 @@ from ..schemas import ProxyConfigOut, ProxyConfigUpdate, PlatformInfo, PlatformF
from ..deps import require_permission, authenticate_websocket
from ..services.proxy_service import proxy_service
from core.douyu.proxy_platforms import (
get_platform_names, get_platform_labels, get_credential_fields,
get_platform_names,
get_platform_labels,
get_credential_fields,
)
router = APIRouter(prefix="/api/proxy", tags=["代理与白名单"])
@@ -37,7 +39,9 @@ def update_proxy_config(
api_url=req.api_url if req.api_url is not None else "",
http=req.http if req.http is not None else "",
https=req.https if req.https is not None else "",
whitelist_enabled=req.whitelist_enabled if req.whitelist_enabled is not None else False,
whitelist_enabled=req.whitelist_enabled
if req.whitelist_enabled is not None
else False,
whitelist_platform=req.whitelist_platform or "xiequ",
whitelist_credentials=req.whitelist_credentials,
whitelist_uid=req.whitelist_uid,
@@ -53,16 +57,19 @@ def list_platforms():
result = []
for name in get_platform_names():
fields = get_credential_fields(name)
result.append(PlatformInfo(
name=name,
label=labels.get(name, name),
credential_fields=[PlatformFieldDef(**f) for f in fields],
))
result.append(
PlatformInfo(
name=name,
label=labels.get(name, name),
credential_fields=[PlatformFieldDef(**f) for f in fields],
)
)
return result
# ---- WebSocket 日志推送 ----
@router.websocket("/ws/test/{test_id}")
async def ws_test_logs(websocket: WebSocket, test_id: str):
"""WebSocket 推送代理/白名单测试实时日志(需认证)。"""
@@ -100,6 +107,7 @@ async def ws_test_logs(websocket: WebSocket, test_id: str):
# ---- 异步测试 API 端点 ----
@router.post("/test")
async def test_proxy(
db: Session = Depends(get_db),
+69 -32
View File
@@ -25,16 +25,18 @@ def list_users(
users = db.query(User).filter(User.deleted_at.is_(None)).order_by(User.id).all()
result = []
for u in users:
result.append(UserInfo(
id=u.id,
username=u.username,
role=u.role,
is_active=u.is_active,
remark=u.remark or "",
created_at=u.created_at,
permissions=get_user_permissions(u),
custom_permissions=u.custom_permissions,
))
result.append(
UserInfo(
id=u.id,
username=u.username,
role=u.role,
is_active=u.is_active,
remark=u.remark or "",
created_at=u.created_at,
permissions=get_user_permissions(u),
custom_permissions=u.custom_permissions,
)
)
return result
@@ -58,13 +60,22 @@ def create_user(
db.commit()
db.refresh(user)
db.add(AuditLog(user_id=current.id, username=current.username,
action="user:create", target=user.username))
db.add(
AuditLog(
user_id=current.id,
username=current.username,
action="user:create",
target=user.username,
)
)
db.commit()
return UserInfo(
id=user.id, username=user.username, role=user.role,
is_active=user.is_active, remark=user.remark or "",
id=user.id,
username=user.username,
role=user.role,
is_active=user.is_active,
remark=user.remark or "",
permissions=get_user_permissions(user),
custom_permissions=user.custom_permissions,
)
@@ -97,13 +108,22 @@ def update_user(
db.commit()
db.refresh(user)
db.add(AuditLog(user_id=current.id, username=current.username,
action="user:edit", target=user.username))
db.add(
AuditLog(
user_id=current.id,
username=current.username,
action="user:edit",
target=user.username,
)
)
db.commit()
return UserInfo(
id=user.id, username=user.username, role=user.role,
is_active=user.is_active, remark=user.remark or "",
id=user.id,
username=user.username,
role=user.role,
is_active=user.is_active,
remark=user.remark or "",
permissions=get_user_permissions(user),
custom_permissions=user.custom_permissions,
)
@@ -126,21 +146,27 @@ def rename_user(
raise HTTPException(status_code=400, detail="用户名至少 2 个字符")
if username == user.username:
return UserInfo(
id=user.id, username=user.username, role=user.role,
is_active=user.is_active, remark=user.remark or "",
permissions=get_user_permissions(user), custom_permissions=user.custom_permissions,
id=user.id,
username=user.username,
role=user.role,
is_active=user.is_active,
remark=user.remark or "",
permissions=get_user_permissions(user),
custom_permissions=user.custom_permissions,
)
if db.query(User.id).filter(User.username == username).first():
raise HTTPException(status_code=400, detail="用户名已存在")
old_username = user.username
user.username = username
db.add(AuditLog(
user_id=current.id,
username=current.username,
action="user:rename",
target=f"{old_username} -> {username}",
))
db.add(
AuditLog(
user_id=current.id,
username=current.username,
action="user:rename",
target=f"{old_username} -> {username}",
)
)
try:
db.commit()
except IntegrityError as exc:
@@ -148,9 +174,13 @@ def rename_user(
raise HTTPException(status_code=400, detail="用户名已存在") from exc
db.refresh(user)
return UserInfo(
id=user.id, username=user.username, role=user.role,
is_active=user.is_active, remark=user.remark or "",
permissions=get_user_permissions(user), custom_permissions=user.custom_permissions,
id=user.id,
username=user.username,
role=user.role,
is_active=user.is_active,
remark=user.remark or "",
permissions=get_user_permissions(user),
custom_permissions=user.custom_permissions,
)
@@ -182,8 +212,14 @@ def delete_user(
.update({HuyaAccount.assigned_to: None}, synchronize_session=False)
)
deleted_username = user.username
db.add(AuditLog(user_id=current.id, username=current.username,
action="user:delete", target=deleted_username))
db.add(
AuditLog(
user_id=current.id,
username=current.username,
action="user:delete",
target=deleted_username,
)
)
user.is_active = False
user.deleted_at = datetime.now(timezone.utc)
user.deleted_username = deleted_username
@@ -202,6 +238,7 @@ def delete_user(
def list_permissions(_: User = Depends(require_permission("user:assign_permissions"))):
"""返回所有可用权限点及角色默认权限映射。"""
from ..permissions import ROLE_PERMISSIONS
return {
"permissions": PERMISSIONS,
"role_permissions": ROLE_PERMISSIONS,
+172 -45
View File
@@ -20,7 +20,9 @@ from ..services.audit_service import record_audit
router = APIRouter(prefix="/api/yyb", tags=["应用宝充值"])
def _get_task(db: Session, task_id: int, current: User, write: bool = False) -> YybRechargeTask:
def _get_task(
db: Session, task_id: int, current: User, write: bool = False
) -> YybRechargeTask:
"""读取任务。
查看:本人或 yyb:history;写操作:本人或 yyb:manage。
@@ -53,14 +55,26 @@ def _creator_username(db: Session, task: YybRechargeTask) -> str:
@router.post("/tasks")
def create_task(payload: YybTaskCreateRequest, db: Session = Depends(get_db), current: User = Depends(require_permission("yyb:session"))):
def create_task(
payload: YybTaskCreateRequest,
db: Session = Depends(get_db),
current: User = Depends(require_permission("yyb:session")),
):
data = _worker_call(YybWorkerClient().create_job)
task = YybRechargeTask(task_id=uuid.uuid4().hex[:16], created_by=current.id,
worker_job_id=str(data["job_id"]), status=str(data.get("status", "created")),
phase="login", message="请选择登录方式")
task = YybRechargeTask(
task_id=uuid.uuid4().hex[:16],
created_by=current.id,
worker_job_id=str(data["job_id"]),
status=str(data.get("status", "created")),
phase="login",
message="请选择登录方式",
)
db.add(task)
record_audit(
db, current, action="recharge:yyb:create", target=f"yyb_task:{task.task_id}",
db,
current,
action="recharge:yyb:create",
target=f"yyb_task:{task.task_id}",
detail={"task_id": task.task_id, "status": task.status},
)
db.commit()
@@ -69,9 +83,18 @@ def create_task(payload: YybTaskCreateRequest, db: Session = Depends(get_db), cu
@router.post("/tasks/{task_id}/login")
def login(task_id: int, payload: YybLoginRequest, db: Session = Depends(get_db), current: User = Depends(require_permission("yyb:session"))):
def login(
task_id: int,
payload: YybLoginRequest,
db: Session = Depends(get_db),
current: User = Depends(require_permission("yyb:session")),
):
task = _get_task(db, task_id, current, write=True)
data = _worker_call(lambda: YybWorkerClient().login(task.worker_job_id, payload.provider, payload.timeout))
data = _worker_call(
lambda: YybWorkerClient().login(
task.worker_job_id, payload.provider, payload.timeout
)
)
task.provider = payload.provider
task.status = str(data.get("status", "waiting_login"))
task.phase = "login"
@@ -79,31 +102,48 @@ def login(task_id: int, payload: YybLoginRequest, db: Session = Depends(get_db),
if data.get("qr_data"):
task.login_qr_data = data["qr_data"]
record_audit(
db, current, action="recharge:yyb:login", target=f"yyb_task:{task.task_id}",
detail={"task_id": task.task_id, "provider": payload.provider, "status": task.status},
db,
current,
action="recharge:yyb:login",
target=f"yyb_task:{task.task_id}",
detail={
"task_id": task.task_id,
"provider": payload.provider,
"status": task.status,
},
)
db.commit()
return public_task(task, creator_username=_creator_username(db, task))
@router.get("/tasks/{task_id}")
def get_task(task_id: int, db: Session = Depends(get_db), current: User = Depends(get_current_user)):
def get_task(
task_id: int,
db: Session = Depends(get_db),
current: User = Depends(get_current_user),
):
task = _get_task(db, task_id, current)
try:
sync_task(db, task, YybWorkerClient())
except YybWorkerError:
# Worker 暂时重启时仍返回最近一次持久化状态。
pass
return public_task(task, include_qr=user_has_permission(current, "yyb:session"),
include_payment_qr=user_has_permission(current, "yyb:recharge"),
creator_username=_creator_username(db, task))
return public_task(
task,
include_qr=user_has_permission(current, "yyb:session"),
include_payment_qr=user_has_permission(current, "yyb:recharge"),
creator_username=_creator_username(db, task),
)
@router.get("/tasks")
def list_tasks(scope: str = Query("mine", pattern="^(mine|all)$"),
status: str | None = Query(None, max_length=32),
limit: int = Query(50, ge=1, le=200),
db: Session = Depends(get_db), current: User = Depends(require_permission("yyb:session"))):
def list_tasks(
scope: str = Query("mine", pattern="^(mine|all)$"),
status: str | None = Query(None, max_length=32),
limit: int = Query(50, ge=1, le=200),
db: Session = Depends(get_db),
current: User = Depends(require_permission("yyb:session")),
):
if scope == "all" and not user_has_permission(current, "yyb:history"):
raise HTTPException(403, "无权查看全部充值任务")
query = db.query(YybRechargeTask)
@@ -114,36 +154,80 @@ def list_tasks(scope: str = Query("mine", pattern="^(mine|all)$"),
rows = query.order_by(YybRechargeTask.id.desc()).limit(limit).all()
usernames = {
user.id: user.username
for user in db.query(User).filter(User.id.in_({row.created_by for row in rows})).all()
for user in db.query(User)
.filter(User.id.in_({row.created_by for row in rows}))
.all()
}
return [public_task(task, include_qr=False, creator_username=usernames.get(task.created_by, ""))
for task in rows]
return [
public_task(
task, include_qr=False, creator_username=usernames.get(task.created_by, "")
)
for task in rows
]
@router.get("/tasks/{task_id}/selection-options")
def selection_options(task_id: int, platform: str = Query("android"), points: int | None = Query(None), zone_id: str | None = Query(None), db: Session = Depends(get_db), current: User = Depends(require_permission("yyb:session"))):
def selection_options(
task_id: int,
platform: str = Query("android"),
points: int | None = Query(None),
zone_id: str | None = Query(None),
db: Session = Depends(get_db),
current: User = Depends(require_permission("yyb:session")),
):
task = _get_task(db, task_id, current, write=True)
data = _worker_call(lambda: YybWorkerClient().selection_options(task.worker_job_id, platform, points, zone_id))
data = _worker_call(
lambda: YybWorkerClient().selection_options(
task.worker_job_id, platform, points, zone_id
)
)
task.platform = platform
db.commit()
return data
@router.post("/tasks/{task_id}/selection")
def selection(task_id: int, payload: YybSelectionRequest, db: Session = Depends(get_db), current: User = Depends(require_permission("yyb:session"))):
def selection(
task_id: int,
payload: YybSelectionRequest,
db: Session = Depends(get_db),
current: User = Depends(require_permission("yyb:session")),
):
task = _get_task(db, task_id, current, write=True)
data = _worker_call(lambda: YybWorkerClient().selection(task.worker_job_id, payload.model_dump()))
data = _worker_call(
lambda: YybWorkerClient().selection(task.worker_job_id, payload.model_dump())
)
selected = data.get("selection", payload.model_dump())
for field in ("platform", "points", "product_id", "zone_id", "zone_name", "role_id", "role_name"):
for field in (
"platform",
"points",
"product_id",
"zone_id",
"zone_name",
"role_id",
"role_name",
):
setattr(task, field, selected[field])
task.price_fen = int(selected.get("price_fen") or 0)
task.phase, task.status, task.message = "payment", "ready", "选择已保存,可以生成付款码"
task.phase, task.status, task.message = (
"payment",
"ready",
"选择已保存,可以生成付款码",
)
record_audit(
db, current, action="recharge:yyb:selection", target=f"yyb_task:{task.task_id}",
db,
current,
action="recharge:yyb:selection",
target=f"yyb_task:{task.task_id}",
detail={
"task_id": task.task_id, "product_id": task.product_id, "points": task.points,
"zone_id": task.zone_id, "zone_name": task.zone_name, "role_id": task.role_id,
"role_name": task.role_name, "price_fen": task.price_fen,
"task_id": task.task_id,
"product_id": task.product_id,
"points": task.points,
"zone_id": task.zone_id,
"zone_name": task.zone_name,
"role_id": task.role_id,
"role_name": task.role_name,
"price_fen": task.price_fen,
},
)
db.commit()
@@ -151,10 +235,19 @@ def selection(task_id: int, payload: YybSelectionRequest, db: Session = Depends(
@router.post("/tasks/{task_id}/payment")
def payment(task_id: int, db: Session = Depends(get_db), current: User = Depends(require_permission("yyb:recharge"))):
def payment(
task_id: int,
db: Session = Depends(get_db),
current: User = Depends(require_permission("yyb:recharge")),
):
# 接手他人任务需 yyb:manage;锁行做原子状态迁移,防止并发双击重复下单。
_get_task(db, task_id, current, write=True)
task = db.query(YybRechargeTask).filter(YybRechargeTask.id == task_id).with_for_update().first()
task = (
db.query(YybRechargeTask)
.filter(YybRechargeTask.id == task_id)
.with_for_update()
.first()
)
if not task:
raise HTTPException(404, "充值任务不存在")
if task.status != "ready" or task.phase != "payment":
@@ -174,8 +267,12 @@ def payment(task_id: int, db: Session = Depends(get_db), current: User = Depends
task.message = "生成付款码失败,请稍后重试"
task.payment_started_at = None
record_audit(
db, current, action="recharge:yyb:payment", target=f"yyb_task:{task.task_id}",
detail="生成付款码失败", success=False,
db,
current,
action="recharge:yyb:payment",
target=f"yyb_task:{task.task_id}",
detail="生成付款码失败",
success=False,
)
db.commit()
raise
@@ -183,16 +280,30 @@ def payment(task_id: int, db: Session = Depends(get_db), current: User = Depends
task.phase = str(data.get("phase", "payment"))
task.message = str(data.get("message", task.message))
record_audit(
db, current, action="recharge:yyb:payment", target=f"yyb_task:{task.task_id}",
detail={"task_id": task.task_id, "product_id": task.product_id, "points": task.points,
"price_fen": task.price_fen, "status": task.status},
db,
current,
action="recharge:yyb:payment",
target=f"yyb_task:{task.task_id}",
detail={
"task_id": task.task_id,
"product_id": task.product_id,
"points": task.points,
"price_fen": task.price_fen,
"status": task.status,
},
)
db.commit()
return public_task(task, include_qr=False, creator_username=_creator_username(db, task))
return public_task(
task, include_qr=False, creator_username=_creator_username(db, task)
)
@router.post("/tasks/{task_id}/payment/check")
def payment_check(task_id: int, db: Session = Depends(get_db), current: User = Depends(require_permission("yyb:recharge"))):
def payment_check(
task_id: int,
db: Session = Depends(get_db),
current: User = Depends(require_permission("yyb:recharge")),
):
task = _get_task(db, task_id, current, write=True)
if task.status not in {"waiting_payment", "payment_timeout"}:
raise HTTPException(409, "当前任务状态不支持检测到账")
@@ -204,16 +315,29 @@ def payment_check(task_id: int, db: Session = Depends(get_db), current: User = D
if task.status == "success":
task.phase = "completed"
record_audit(
db, current, action="recharge:yyb:payment_check", target=f"yyb_task:{task.task_id}",
detail={"task_id": task.task_id, "status": task.status, "message": task.message},
db,
current,
action="recharge:yyb:payment_check",
target=f"yyb_task:{task.task_id}",
detail={
"task_id": task.task_id,
"status": task.status,
"message": task.message,
},
success=task.status != "failed",
)
db.commit()
return public_task(task, include_qr=False, creator_username=_creator_username(db, task))
return public_task(
task, include_qr=False, creator_username=_creator_username(db, task)
)
@router.post("/tasks/{task_id}/stop")
def stop(task_id: int, db: Session = Depends(get_db), current: User = Depends(require_permission("yyb:session"))):
def stop(
task_id: int,
db: Session = Depends(get_db),
current: User = Depends(require_permission("yyb:session")),
):
task = _get_task(db, task_id, current, write=True)
data = _worker_call(lambda: YybWorkerClient().stop(task.worker_job_id))
task.status = "stopped"
@@ -221,7 +345,10 @@ def stop(task_id: int, db: Session = Depends(get_db), current: User = Depends(re
task.message = str(data.get("message", "任务已停止"))
task.finished_at = _utcnow()
record_audit(
db, current, action="recharge:yyb:stop", target=f"yyb_task:{task.task_id}",
db,
current,
action="recharge:yyb:stop",
target=f"yyb_task:{task.task_id}",
detail={"task_id": task.task_id, "status": task.status},
)
db.commit()