style: 统一 Ruff 代码格式
This commit is contained in:
+172
-45
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user