优化首页统计和任务请求
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
"""首页聚合统计路由。"""
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
from sqlalchemy import func
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from ..database import get_db
|
||||
from ..deps import get_current_user
|
||||
from ..models import (
|
||||
Account,
|
||||
HuyaAccount,
|
||||
HuyaGoodsSnapshot,
|
||||
HuyaRechargeGoodsSnapshot,
|
||||
HuyaTask,
|
||||
LoginTask,
|
||||
User,
|
||||
)
|
||||
from ..permissions import user_has_permission
|
||||
|
||||
|
||||
router = APIRouter(prefix="/api/dashboard", tags=["首页概览"])
|
||||
|
||||
|
||||
def _task_summary(query, task_model) -> dict:
|
||||
"""按状态汇总任务,避免首页读取任务列表。"""
|
||||
rows = (
|
||||
query.order_by(None)
|
||||
.with_entities(task_model.status, func.count(task_model.id))
|
||||
.group_by(task_model.status)
|
||||
.all()
|
||||
)
|
||||
status_counts = {status or "": count for status, count in rows}
|
||||
return {
|
||||
"total": sum(status_counts.values()),
|
||||
"success": status_counts.get("success", 0),
|
||||
"failed": sum(status_counts.get(status, 0) for status in ("failed", "error")),
|
||||
"status_counts": status_counts,
|
||||
}
|
||||
|
||||
|
||||
def _empty_task_summary() -> dict:
|
||||
return {"total": 0, "success": 0, "failed": 0, "status_counts": {}}
|
||||
|
||||
|
||||
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")
|
||||
|
||||
|
||||
@router.get("/summary")
|
||||
def dashboard_summary(
|
||||
db: Session = Depends(get_db),
|
||||
current: User = Depends(get_current_user),
|
||||
):
|
||||
"""返回首页所需的全部轻量统计。"""
|
||||
douyu_accounts = 0
|
||||
if user_has_permission(current, "account:view_all"):
|
||||
douyu_accounts = db.query(Account).count()
|
||||
elif user_has_permission(current, "account:view_assigned"):
|
||||
douyu_accounts = db.query(Account).filter(Account.assigned_to == current.id).count()
|
||||
|
||||
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 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)
|
||||
|
||||
cookies = 0
|
||||
if user_has_permission(current, "cookie:view"):
|
||||
cookie_query = (
|
||||
db.query(LoginTask)
|
||||
.join(Account, LoginTask.account_id == Account.id)
|
||||
.filter(LoginTask.status == "success")
|
||||
)
|
||||
if not user_has_permission(current, "login:view_all"):
|
||||
cookie_query = cookie_query.filter(Account.assigned_to == current.id)
|
||||
cookies = cookie_query.count()
|
||||
|
||||
huya_accounts = 0
|
||||
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.count()
|
||||
|
||||
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)
|
||||
if not _can_view_huya_all(current):
|
||||
huya_task_query = huya_task_query.filter(HuyaAccount.assigned_to == current.id)
|
||||
huya_tasks = _task_summary(huya_task_query, HuyaTask)
|
||||
huya_goods = db.query(HuyaGoodsSnapshot).count()
|
||||
huya_recharge_goods = db.query(HuyaRechargeGoodsSnapshot).count()
|
||||
|
||||
return {
|
||||
"douyu": {
|
||||
"accounts": douyu_accounts,
|
||||
"tasks": login_tasks["total"],
|
||||
"success": login_tasks["success"],
|
||||
"failed": login_tasks["failed"],
|
||||
"cookies": cookies,
|
||||
},
|
||||
"huya": {
|
||||
"accounts": huya_accounts,
|
||||
"tasks": huya_tasks["total"],
|
||||
"success": huya_tasks["success"],
|
||||
"failed": huya_tasks["failed"],
|
||||
"goods": huya_goods,
|
||||
"rechargeGoods": huya_recharge_goods,
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user