diff --git a/backend/routers/admin.py b/backend/routers/admin.py index 702c270..34a85a4 100644 --- a/backend/routers/admin.py +++ b/backend/routers/admin.py @@ -1,5 +1,6 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session +from sqlalchemy import func, case from typing import List from backend.database import get_db @@ -20,11 +21,18 @@ def get_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)): @router.get("/stats") def get_system_stats(db: Session = Depends(get_db)): - total_users = db.query(User).count() - admin_users = db.query(User).filter(User.role == UserRole.ADMIN).count() + """ + Get system statistics. + Optimized: Uses a single query with aggregates instead of 3 separate count queries. + """ + stats = db.query( + func.count(User.id).label('total_users'), + func.sum(case((User.role == UserRole.ADMIN, 1), else_=0)).label('admin_count'), + func.sum(case((User.is_active == True, 1), else_=0)).label('active_users') + ).first() return { - "total_users": total_users, - "admin_count": admin_users, - "active_users": db.query(User).filter(User.is_active == True).count(), + "total_users": stats.total_users or 0, + "admin_count": stats.admin_count or 0, + "active_users": stats.active_users or 0, } diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..c8c9c75 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +asyncio_mode = auto +asyncio_default_fixture_loop_scope = function