from fastapi import FastAPI from instance.configdb import init_postgresql, init_mongodb, close_connections from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.cron import CronTrigger from app.routes import user_router, subscription_router, sup_router from app.services.db_manager import DatabaseManager from instance.configdb import get_postgres_session from app.services.mongo_rep import MongoDBRepository from app.services.xui_rep import PanelInteraction import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) app = FastAPI() database_manager = DatabaseManager(session_generator=get_postgres_session) mongo_repo = MongoDBRepository() async def delete_depleted_clients_task(): """ Удаляет исчерпанных клиентов на всех серверах из MongoDB. """ try: # Получаем список серверов из MongoDB servers = await mongo_repo.list_servers() if not servers: logger.warning("Список серверов пуст. Задача пропущена.") return # Проходим по каждому серверу и вызываем delete_depleted_clients for server in servers: base_url = server.get("base_url") login_data = server.get("login_data") certificate = server.get("certificate") if not base_url or not login_data: logger.error(f"Пропуск сервера из-за отсутствия данных: {server}") continue # Создаём экземпляр PanelInteraction panel = PanelInteraction( base_url=base_url, login_data=login_data, logger=logger, certificate=certificate ) # Выполняем удаление исчерпанных клиентов response = await panel.delete_depleted_clients() if response: logger.info(f"Удаление клиентов завершено успешно для сервера: {base_url}") else: logger.warning(f"Не удалось удалить клиентов для сервера: {base_url}") except Exception as e: logger.error(f"Ошибка при выполнении задачи delete_depleted_clients: {e}") scheduler = AsyncIOScheduler() @app.on_event("startup") async def startup(): """ Инициализация подключения к базам данных. """ try: scheduler.add_job(delete_depleted_clients_task, CronTrigger(hour=23, minute=59)) scheduler.start() logger.info("Инициализация PostgreSQL...") await init_postgresql() logger.info("PostgreSQL успешно инициализирован.") logger.info("Инициализация MongoDB...") await init_mongodb() logger.info("MongoDB успешно инициализирован.") except Exception as e: logger.error(f"Ошибка при инициализации баз данных: {e}") raise RuntimeError("Не удалось инициализировать базы данных") @app.on_event("shutdown") async def shutdown(): """ Закрытие соединений с базами данных. """ try: logger.info("Закрытие соединений с базами данных...") await close_connections() logger.info("Соединения с базами данных успешно закрыты.") except Exception as e: logger.error(f"Ошибка при закрытии соединений: {e}") app.include_router(user_router, prefix="/api") #app.include_router(payment_router, prefix="/api") app.include_router(subscription_router, prefix="/api") app.include_router(sup_router, prefix="/api") @app.get("/") def read_root(): return {"message": "FastAPI приложение работает!"}