""" FastAPI application for MyDocManager file processor service. This service provides API endpoints for health checks and task dispatching. """ import os from fastapi import FastAPI, HTTPException from pydantic import BaseModel import redis from celery import Celery from database.connection import test_database_connection # Initialize FastAPI app app = FastAPI( title="MyDocManager File Processor", description="File processing and task dispatch service", version="1.0.0" ) # Environment variables REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379/0") MONGODB_URL = os.getenv("MONGODB_URL", "mongodb://localhost:27017") # Initialize Redis client try: redis_client = redis.from_url(REDIS_URL) except Exception as e: redis_client = None print(f"Warning: Could not connect to Redis: {e}") # Initialize Celery celery_app = Celery( "file_processor", broker=REDIS_URL, backend=REDIS_URL ) # Pydantic models class TestTaskRequest(BaseModel): """Request model for test task.""" message: str @app.get("/health") async def health_check(): """ Health check endpoint. Returns: dict: Service health status with dependencies """ health_status = { "status": "healthy", "service": "file-processor", "dependencies": { "redis": "unknown", "mongodb": "unknown" }, } # Check Redis connection if redis_client: try: redis_client.ping() health_status["dependencies"]["redis"] = "connected" except Exception: health_status["dependencies"]["redis"] = "disconnected" health_status["status"] = "degraded" # check MongoDB connection if test_database_connection(): health_status["dependencies"]["mongodb"] = "connected" else: health_status["dependencies"]["mongodb"] = "disconnected" return health_status @app.post("/test-task") async def dispatch_test_task(request: TestTaskRequest): """ Dispatch a test task to Celery worker. Args: request: Test task request containing message Returns: dict: Task dispatch information Raises: HTTPException: If task dispatch fails """ try: # Send task to worker task = celery_app.send_task( "main.test_task", args=[request.message] ) return { "status": "dispatched", "task_id": task.id, "message": f"Test task dispatched with message: {request.message}" } except Exception as e: raise HTTPException( status_code=500, detail=f"Failed to dispatch task: {str(e)}" ) @app.get("/") async def root(): """ Root endpoint. Returns: dict: Basic service information """ return { "service": "MyDocManager File Processor", "version": "1.0.0", "status": "running" }