from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel from typing import Dict import uuid from datetime import datetime app = FastAPI() # Enable CORS for React Native development app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], ) # In-memory "database" (replace with real DB in production) jobs_db: Dict[str, Dict] = {} class PostRequest(BaseModel): query: str topic: str date: str # Format: "DD-MM-YYYY to DD-MM-YYYY" @app.post("/index") async def create_job(request: PostRequest): """Receive query/topic/date and return job ID""" job_id = str(uuid.uuid4()) # Store the job (simulating background processing) jobs_db[job_id] = { "status": "processing", "request": request.dict(), "created_at": datetime.now().isoformat(), "result": None } # Simulate processing completion after 5 seconds # In real apps, use Celery/BackgroundTasks jobs_db[job_id]["result"] = { "query": request.query, "topic": request.topic, "date_interval": request.date, "processed_data": f"Analysis result for {request.query} ({request.topic})" } jobs_db[job_id]["status"] = "completed" return {"status": "success", "id": job_id} @app.get("/loading") async def get_results(id: str): """Check job status with simulated processing delay""" if id not in jobs_db: raise HTTPException(status_code=404, detail="Job not found") job = jobs_db[id] # Simulate variable processing time (5-25 seconds) if job["status"] == "processing": elapsed = (datetime.now() - datetime.fromisoformat(job["created_at"])).seconds if elapsed < 5: # Minimum processing time await asyncio.sleep(2) # Artificial delay return {"status": "processing"} # Mark as completed after random time (for demo) if elapsed > 15 or random.random() > 0.7: # 30% chance after 15s job["status"] = "completed" job["result"] = { "processed_data": f"Result for {job['request']['query']}", "completion_time": elapsed } if job["status"] == "completed": return { "status": "completed", "result": job["result"], "request": job["request"] } return {"status": "processing"}