gitscope
← marzneshin / v0.3.0 / app/routes/system.py
https://dev.kronoz.win/r/marzneshin.git
app/routes/system.py · Python
Blame Raw
 1from fastapi import APIRouter
 2
 3from app import __version__
 4from app.db import crud
 5from app.db.models import Admin as DBAdmin, User
 6from app.db.models import Node
 7from app.dependencies import DBDep, AdminDep, SudoAdminDep
 8from app.models.node import NodeStatus
 9from app.models.system import SystemStats, UsersStats, NodesStats, AdminsStats
10from app.models.user import UserStatus
11
12router = APIRouter(tags=["System"], prefix="/system")
13
14
15@router.get("/stats/admins", response_model=AdminsStats)
16def get_admins_stats(db: DBDep, admin: SudoAdminDep):
17    return AdminsStats(total=db.query(DBAdmin).count())
18
19
20@router.get("/stats/nodes", response_model=NodesStats)
21def get_nodes_stats(db: DBDep, admin: SudoAdminDep):
22    return NodesStats(
23        total=db.query(Node).count(),
24        healthy=db.query(Node).filter(Node.status == NodeStatus.healthy).count(),
25        unhealthy=db.query(Node).filter(Node.status == NodeStatus.unhealthy).count(),
26    )
27
28
29@router.get("/stats/users", response_model=UsersStats)
30def get_users_stats(db: DBDep, admin: AdminDep):
31    return UsersStats(
32        total=crud.get_users_count(db, admin=admin if not admin.is_sudo else None),
33        active=crud.get_users_count(
34            db, admin=admin if not admin.is_sudo else None, status=UserStatus.active
35        ),
36        on_hold=crud.get_users_count(
37            db,
38            admin=admin if not admin.is_sudo else None,
39            status=UserStatus.on_hold,
40        ),
41        expired=crud.get_users_count(
42            db,
43            admin=admin if not admin.is_sudo else None,
44            status=UserStatus.expired,
45        ),
46        limited=crud.get_users_count(
47            db,
48            admin=admin if not admin.is_sudo else None,
49            status=UserStatus.limited,
50        ),
51        online=crud.get_users_count(
52            db, admin=admin if not admin.is_sudo else None, online=True
53        ),
54        recent_subscription_updates=list(
55            i[0]
56            for i in db.query(User.username)
57            .filter(User.sub_updated_at != None)
58            .order_by(User.sub_updated_at)
59            .limit(5)
60        ),
61    )