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 )