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