from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from miniopy_async import Minio from src.core.acync_cache import AsyncInMemoryCache from src.core.poll_worker import PollWorker from src.core.config import settings from src.core.clients import S3Storage from nats.aio.client import Client as NATS import asyncio from miniopy_async.error import S3Error import json from src.core.nats_callback import build_file_handler from src.core.nats_callback_pdf import build_file_handler_pdf @asynccontextmanager async def lifespan(app): s3_client = Minio(settings.MINIO_URL, settings.MINIO_ADMIN_LOGIN, settings.MINIO_ADMIN_PASSWORD, secure=False) storage = S3Storage(client=s3_client, bucket_name=settings.MINIO_BUCKET) app.state.storage = storage nc = NATS() await nc.connect("nats://localhost:4222", max_reconnect_attempts=5) # cache = AsyncInMemoryCache() # poller = PollWorker(nc, storage, cache) # await poller.start() handler_cb = build_file_handler(nc, storage, bucket_name=settings.MINIO_BUCKET) # handler_cb = build_file_handler_pdf(nc, storage, settings.MINIO_BUCKET, cache) sub = await nc.subscribe('files.uploaded', queue='xlsxparsing', cb=handler_cb) app.state.nats = nc app.state.nats_subs = [sub] try: yield finally: # await poller.stop() for sub in app.state.nats_subs: await sub.unsubscribe() await nc.close() app = FastAPI(lifespan=lifespan) @app.get('/healthcheck') async def health(): return { 'status': 'alive' } app.add_middleware( CORSMiddleware, allow_credentials=['*'], allow_headers=['*'], allow_methods=['*'], allow_origins=['*'] )