from collections.abc import AsyncGenerator from contextlib import asynccontextmanager from aiogram import Bot from aiogram.client.default import DefaultBotProperties from aiogram.client.session.aiohttp import AiohttpSession from fastapi import FastAPI from api.routes import routers from config import settings from repositories.bills import BillsRepository from repositories.subscriptions import SubscriptionRepository from repositories.users import UserRepository from schemas.di import APIDependenciesDTO from services.billing_service import BillingService from services.user_service import UserService @asynccontextmanager async def lifespan(app: FastAPI) -> AsyncGenerator: # Bot Init aiohttp_session = AiohttpSession(proxy=settings.proxy) if settings.proxy else None default = DefaultBotProperties(parse_mode="HTML") bot = Bot(token=settings.bot_token, default=default, session=aiohttp_session) app.state.bot = bot user_repository = UserRepository() bills_repository = BillsRepository() subscription_repository = SubscriptionRepository() user_service = UserService(user_repository, subscription_repository=subscription_repository) bills_service = BillingService( user_repository=user_repository, bills_repository=bills_repository ) deps_dto = APIDependenciesDTO( user_repository=user_repository, user_service=user_service, bills_repository=bills_repository, billing_service=bills_service, ) app.state.deps = deps_dto for r in routers: app.include_router(r) yield # App's lifespan await bot.session.close() # D IE!!!!!!!! app = FastAPI( title="Malenia API", description="Payment webhook handler and user balance management", version="1.0.0", lifespan=lifespan, docs_url="", )