codenuk_backend_mine/services/test-generator/src/main.py

159 lines
4.1 KiB
Python

import os
import sys
import asyncio
from datetime import datetime
from typing import Dict, Any, Optional
import uvicorn
from fastapi import FastAPI, HTTPException, Depends, BackgroundTasks
from fastapi.middleware.cors import CORSMiddleware
from fastapi.middleware.trustedhost import TrustedHostMiddleware
from pydantic import BaseModel, ValidationError
from loguru import logger
# Configure logging
logger.remove()
logger.add(sys.stdout, level="INFO", format="{time} | {level} | {message}")
# Pydantic models
class HealthResponse(BaseModel):
status: str
service: str
timestamp: str
version: str
uptime: float
class ServiceRequest(BaseModel):
project_id: Optional[str] = None
data: Dict[str, Any] = {}
metadata: Dict[str, Any] = {}
class ServiceResponse(BaseModel):
success: bool
data: Dict[str, Any] = {}
message: str = ""
timestamp: str = ""
# Initialize FastAPI app
app = FastAPI(
title="test-generator",
description="test-generator service for automated development pipeline",
version="1.0.0",
docs_url="/docs",
redoc_url="/redoc"
)
# Add middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.add_middleware(
TrustedHostMiddleware,
allowed_hosts=["*"]
)
# Global variables
start_time = datetime.utcnow()
# Routes
@app.get("/health", response_model=HealthResponse)
async def health_check():
"""Comprehensive health check endpoint"""
uptime = (datetime.utcnow() - start_time).total_seconds()
return HealthResponse(
status="healthy",
service="test-generator",
timestamp=datetime.utcnow().isoformat(),
version="1.0.0",
uptime=uptime
)
@app.get("/")
async def root():
"""Root endpoint"""
return {
"message": "test-generator is running",
"service": "test-generator",
"status": "active",
"timestamp": datetime.utcnow().isoformat(),
"version": "1.0.0"
}
@app.get("/api/v1/status")
async def service_status():
"""Detailed service status endpoint"""
uptime = (datetime.utcnow() - start_time).total_seconds()
return {
"service": "test-generator",
"status": "ready",
"capabilities": [
"health_check",
"status_check",
"async_processing"
],
"uptime": uptime,
"timestamp": datetime.utcnow().isoformat(),
"version": "1.0.0"
}
@app.post("/api/v1/process", response_model=ServiceResponse)
async def process_request(request: ServiceRequest, background_tasks: BackgroundTasks):
"""Main processing endpoint for test-generator"""
try:
logger.info(f"Processing request for project: {request.project_id}")
# Simulate processing
await asyncio.sleep(0.1)
response_data = {
"processed": True,
"service": "test-generator",
"project_id": request.project_id,
"input_data_keys": list(request.data.keys()) if request.data else []
}
return ServiceResponse(
success=True,
data=response_data,
message="Request processed successfully by test-generator",
timestamp=datetime.utcnow().isoformat()
)
except Exception as e:
logger.error(f"Error processing request: {e}")
raise HTTPException(
status_code=500,
detail=f"Processing failed: {str(e)}"
)
@app.get("/api/v1/cache/{project_id}")
async def get_cached_result(project_id: str):
"""Get cached result for a project"""
return {
"found": False,
"message": "Cache not implemented yet",
"project_id": project_id,
"timestamp": datetime.utcnow().isoformat()
}
if __name__ == "__main__":
port = int(os.getenv("PORT", 8005))
log_level = os.getenv("LOG_LEVEL", "info")
logger.info(f"Starting test-generator on port {port}")
uvicorn.run(
"main:app",
host="0.0.0.0",
port=port,
reload=False,
log_level=log_level,
access_log=True
)