Files
vpn-control-panel/app/services/vpn.py
smolkik-code 7c7c88621d Initial commit: VPN Control Panel
- FastAPI REST API with JWT auth
- aiogram 3 Telegram bot with admin middleware
- APScheduler daily tasks (expiry, reminders, revoke, sync)
- SQLAlchemy 2 async ORM with Alembic migrations
- Jinja2 admin panel (Dashboard, Users, Payments, Servers, Tariffs)
- VPN provider abstraction with MockProvider
- Stats service with revenue/subscription analytics
- Docker Compose (PostgreSQL + Redis + app)
- Healthcheck endpoint
2026-07-05 17:50:11 +07:00

57 lines
1.8 KiB
Python

from loguru import logger
from app.models.server import Server, ServerProtocol
from app.models.user import User
from app.repositories.server import ServerRepository
from app.repositories.user import UserRepository
class VPNService:
def __init__(
self,
server_repo: ServerRepository,
user_repo: UserRepository,
):
self.server_repo = server_repo
self.user_repo = user_repo
async def assign_server(
self, user_id: int, protocol: ServerProtocol | None = None
) -> Server:
user = await self.user_repo.get(user_id)
if user is None:
raise ValueError(f"User not found: {user_id}")
if protocol is not None:
server = await self.server_repo.get_least_loaded(protocol)
else:
for proto in ServerProtocol:
server = await self.server_repo.get_least_loaded(proto)
if server is not None:
break
if server is None:
raise RuntimeError("No available VPN servers")
return server
async def get_available_protocols(self) -> list[ServerProtocol]:
servers = await self.server_repo.get_active()
return list({s.protocol for s in servers})
async def get_servers_by_protocol(
self, protocol: ServerProtocol
) -> list[Server]:
return await self.server_repo.get_by_protocol(protocol)
async def get_user_server(
self, user_id: int
) -> Server | None:
return await self.server_repo.get_least_loaded(ServerProtocol.WIREGUARD)
async def is_server_available(self, server_id: int) -> bool:
server = await self.server_repo.get(server_id)
if server is None:
return False
return server.is_active and server.load_percent < 100