openvpn-endpoint-server/server/app/web/dashboard.py

58 lines
1.8 KiB
Python

"""Dashboard web routes."""
from fastapi import APIRouter, Request, Depends
from fastapi.responses import HTMLResponse, RedirectResponse
from sqlalchemy.orm import Session
from sqlalchemy import func
from ..database import get_db
from ..models.user import User
from ..models.gateway import Gateway
from ..models.endpoint import Endpoint
from ..models.access import ConnectionLog
from .deps import get_current_user_web, get_flashed_messages
router = APIRouter()
@router.get("/", response_class=HTMLResponse)
async def root(request: Request):
"""Root redirect to dashboard."""
if request.session.get("user_id"):
return RedirectResponse(url="/dashboard", status_code=303)
return RedirectResponse(url="/login", status_code=303)
@router.get("/dashboard", response_class=HTMLResponse)
async def dashboard(
request: Request,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user_web)
):
"""Dashboard with overview."""
# Get statistics
gateways_total = db.query(Gateway).count()
gateways_online = db.query(Gateway).filter(Gateway.is_online == True).count()
endpoints_total = db.query(Endpoint).count()
users_total = db.query(User).filter(User.is_active == True).count()
active_connections = db.query(ConnectionLog).filter(
ConnectionLog.disconnected_at.is_(None)
).count()
stats = {
"gateways_total": gateways_total,
"gateways_online": gateways_online,
"endpoints_total": endpoints_total,
"users_total": users_total,
"active_connections": active_connections
}
return request.app.state.templates.TemplateResponse(
"dashboard/index.html",
{
"request": request,
"current_user": current_user,
"stats": stats,
"flash_messages": get_flashed_messages(request)
}
)