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