| """
|
| VPN server management routes
|
| """
|
| from fastapi import APIRouter, Depends, HTTPException, status
|
| from sqlalchemy.orm import Session
|
| from typing import List
|
|
|
| from core.auth import get_current_active_user
|
| from core.database import get_db
|
| from models.user import User
|
| from schemas.vpn import (
|
| VPNConfigResponse,
|
| VPNSessionResponse,
|
| VPNServerStats
|
| )
|
| from services.vpn_service import VPNService
|
|
|
| router = APIRouter(
|
| prefix="/vpn",
|
| tags=["vpn"],
|
| responses={404: {"description": "Not found"}}
|
| )
|
|
|
| @router.get("/config", response_model=VPNConfigResponse)
|
| async def get_vpn_config(
|
| current_user: User = Depends(get_current_active_user),
|
| db: Session = Depends(get_db)
|
| ):
|
| """Get VPN configuration for current user"""
|
| vpn_service = VPNService(db)
|
| return await vpn_service.get_user_config(current_user.id)
|
|
|
| @router.get("/sessions", response_model=List[VPNSessionResponse])
|
| async def get_vpn_sessions(
|
| current_user: User = Depends(get_current_active_user),
|
| db: Session = Depends(get_db)
|
| ):
|
| """Get active VPN sessions for current user"""
|
| vpn_service = VPNService(db)
|
| return await vpn_service.get_user_sessions(current_user.id)
|
|
|
| @router.get("/stats", response_model=VPNServerStats)
|
| async def get_vpn_stats(
|
| current_user: User = Depends(get_current_active_user),
|
| db: Session = Depends(get_db)
|
| ):
|
| """Get VPN usage statistics for current user"""
|
| vpn_service = VPNService(db)
|
| return await vpn_service.get_user_stats(current_user.id)
|
|
|
| @router.post("/disconnect/{session_id}")
|
| async def disconnect_vpn_session(
|
| session_id: str,
|
| current_user: User = Depends(get_current_active_user),
|
| db: Session = Depends(get_db)
|
| ):
|
| """Disconnect a specific VPN session"""
|
| vpn_service = VPNService(db)
|
| success = await vpn_service.disconnect_session(session_id, current_user.id)
|
|
|
| if not success:
|
| raise HTTPException(
|
| status_code=status.HTTP_404_NOT_FOUND,
|
| detail="Session not found or already disconnected"
|
| )
|
|
|
| return {"status": "success", "message": "Session disconnected"}
|
|
|