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