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