128 lines
2.8 KiB
Python
128 lines
2.8 KiB
Python
"""
|
|
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"
|
|
} |