File size: 1,690 Bytes
c6fb015 8427d6e c6fb015 82fcdc5 c6fb015 82fcdc5 89d6457 c6fb015 c3bf538 8427d6e c6fb015 c3bf538 8427d6e 89d6457 c3bf538 89d6457 c3bf538 8427d6e c6fb015 8427d6e c6fb015 c3bf538 c6fb015 8427d6e c6fb015 c3bf538 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
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 |