"""首页聚合统计路由。""" 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, }, }