boyinfuture's picture
more efficiewnt backend
6ffbf76
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