from fastapi import FastAPI, Depends, HTTPException from fastapi.middleware.cors import CORSMiddleware from sqlalchemy.orm import Session from sqlalchemy import desc from uuid import UUID from typing import List import models.analysis_job as model import schemas from core.database import SessionLocal, engine from tasks.main_task import run_full_analysis model.Base.metadata.create_all(bind=engine) app = FastAPI( title="Quantitative Analysis Platform API", version="0.1.0", ) app.add_middleware( CORSMiddleware, allow_origin_regex=r"https?://.*\.vercel\.app|http://localhost:5173", allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) def get_db(): db = SessionLocal() try: yield db finally: db.close() @app.post("/jobs", response_model=schemas.Job, status_code=201) def create_analysis_job(job_request: schemas.JobCreate, db: Session = Depends(get_db)): db_job = model.AnalysisJob(ticker=job_request.ticker.upper()) db.add(db_job) db.commit() db.refresh(db_job) run_full_analysis.delay(str(db_job.id), db_job.ticker) return db_job @app.get("/jobs/{job_id}", response_model=schemas.Job) def get_job_status(job_id: UUID, db: Session = Depends(get_db)): db_job = db.query(model.AnalysisJob).filter(model.AnalysisJob.id == job_id).first() if db_job is None: raise HTTPException(status_code=404, detail="Job not found") return db_job @app.get("/jobs", response_model=List[schemas.Job]) def get_jobs_history(db: Session = Depends(get_db)): db_jobs = db.query(model.AnalysisJob).order_by(desc(model.AnalysisJob.created_at)).limit(20).all() return db_jobs