1from fastapi import APIRouter
2
3from app.db import crud
4from app.db.models import Admin as DBAdmin, User, Settings
5from app.db.models import Node
6from app.dependencies import DBDep, AdminDep, SudoAdminDep
7from app.models.node import NodeStatus
8from app.models.settings import SubscriptionSettings, TelegramSettings
9from app.models.system import UsersStats, NodesStats, AdminsStats
10from app.models.user import UserExpireStrategy
11
12router = APIRouter(tags=["System"], prefix="/system")
13
14
15@router.get("/settings/subscription", response_model=SubscriptionSettings)
16def get_subscription_settings(db: DBDep, admin: SudoAdminDep):
17 return db.query(Settings.subscription).first()[0]
18
19
20@router.put("/settings/subscription", response_model=SubscriptionSettings)
21def update_subscription_settings(
22 db: DBDep, modifications: SubscriptionSettings, admin: SudoAdminDep
23):
24 settings = db.query(Settings).first()
25 settings.subscription = modifications.model_dump(mode="json")
26 db.commit()
27 return settings.subscription
28
29
30@router.get("/settings/telegram", response_model=TelegramSettings | None)
31def get_telegram_settings(db: DBDep, admin: SudoAdminDep):
32 return db.query(Settings.telegram).first().telegram
33
34
35@router.put("/settings/telegram", response_model=TelegramSettings | None)
36def update_telegram_settings(
37 db: DBDep, new_telegram: TelegramSettings | None, admin: SudoAdminDep
38):
39 settings = db.query(Settings.telegram).first()
40 settings.telegram = new_telegram
41 db.commit()
42 return settings.telegram
43
44
45@router.get("/stats/admins", response_model=AdminsStats)
46def get_admins_stats(db: DBDep, admin: SudoAdminDep):
47 return AdminsStats(total=db.query(DBAdmin).count())
48
49
50@router.get("/stats/nodes", response_model=NodesStats)
51def get_nodes_stats(db: DBDep, admin: SudoAdminDep):
52 return NodesStats(
53 total=db.query(Node).count(),
54 healthy=db.query(Node)
55 .filter(Node.status == NodeStatus.healthy)
56 .count(),
57 unhealthy=db.query(Node)
58 .filter(Node.status == NodeStatus.unhealthy)
59 .count(),
60 )
61
62
63@router.get("/stats/users", response_model=UsersStats)
64def get_users_stats(db: DBDep, admin: AdminDep):
65 return UsersStats(
66 total=crud.get_users_count(
67 db, admin=admin if not admin.is_sudo else None
68 ),
69 active=crud.get_users_count(
70 db, admin=admin if not admin.is_sudo else None, is_active=True
71 ),
72 on_hold=crud.get_users_count(
73 db,
74 admin=admin if not admin.is_sudo else None,
75 expire_strategy=UserExpireStrategy.START_ON_FIRST_USE,
76 ),
77 expired=crud.get_users_count(
78 db,
79 admin=admin if not admin.is_sudo else None,
80 expired=True,
81 ),
82 limited=crud.get_users_count(
83 db,
84 admin=admin if not admin.is_sudo else None,
85 data_limit_reached=True,
86 ),
87 online=crud.get_users_count(
88 db, admin=admin if not admin.is_sudo else None, online=True
89 ),
90 recent_subscription_updates=list(
91 i[0]
92 for i in db.query(User.username)
93 .filter(User.sub_updated_at != None)
94 .order_by(User.sub_updated_at)
95 .limit(5)
96 ),
97 )