gitscope
← marzneshin / v0.5.2 / 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.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    )