FastAPI service that consumes NATS `files.uploaded` events and parses uploaded documents from MinIO/S3 into legal entity, company group and RF office schemas. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
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=['*']
|
|
) |