from collections.abc import AsyncGenerator from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi_pagination import add_pagination from fastapi_pagination.utils import disable_installed_extensions_check from shared import logger from shared.worker_base import WorkerConfig from src import deps from src.adapter.jwt import JWT from src.adapter.parser import ParserClient from src.adapter.postgres import Postgres from src.adapter.s3 import S3 from src.adapter.telegram_bot import TelegramBot from src.config import settings from src.controller.http_v1 import api_router from src.controller.worker.fetch_placement_post import FetchPublicationPostWorker from src.usecase import Usecase @asynccontextmanager async def lifespan(_: FastAPI) -> AsyncGenerator[None]: await postgres.connect() await s3.connect() await fetch_publication_post_worker.start() yield await fetch_publication_post_worker.stop() await s3.close() await postgres.close() logger.init(settings.logger) disable_installed_extensions_check() postgres = Postgres(settings.db) telegram = TelegramBot(settings.telegram) jwt_encoder = JWT(settings.jwt) parser_client = ParserClient(base_url=settings.parser.URL) s3 = S3(settings.s3) usecase = Usecase( database=postgres, telegram_bot=telegram, jwt_encoder=jwt_encoder, parser=parser_client, s3=s3, ) deps.set_usecase(usecase) fetch_publication_post_worker = FetchPublicationPostWorker(config=WorkerConfig(INTERVAL_SECONDS=5)) app = FastAPI( lifespan=lifespan, version=settings.logger.APP_VERSION, swagger_ui_parameters={ 'defaultModelsExpandDepth': 0, # Сворачиваем Schemas }, ) app.add_middleware( CORSMiddleware, allow_origins=[ 'https://app.tgexchange.ru', 'http://app.tgexchange.ru', ], allow_credentials=True, allow_methods=['*'], allow_headers=['*'], ) add_pagination(app) app.include_router(api_router)