File size: 2,110 Bytes
fd027e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e7d23ae
 
 
 
fd027e9
 
 
 
 
 
 
 
10a815e
fd027e9
 
 
59e5ed2
 
fd027e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from fastapi import FastAPI, HTTPException, UploadFile, File
from fastapi.middleware.cors import CORSMiddleware
from models import ExtractionRequest, GenerationRequest, LabReportData
from services.parser import LabReportParser
from services.renderer import VisualRenderer
import io
import base64
from PIL import Image

app = FastAPI(title="StrainAI Backend API")

# Enable CORS for Next.js frontend
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # In production, restrict to Vercel URL
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

parser = LabReportParser()
renderer = VisualRenderer()

@app.get("/")
async def root():
    return {"message": "StrainAI Backend API is up and running!", "docs": "/docs"}

@app.get("/health")
async def health():
    return {"status": "healthy"}

@app.post("/extract")
async def extract(file: UploadFile = File(...)):
    try:
        contents = await file.read()
        b64_content = base64.b64encode(contents).decode("utf-8")
        data = await parser.extract_data(b64_content, file.filename)
        return data
    except Exception as e:
        import traceback
        traceback.print_exc()
        raise HTTPException(status_code=500, detail=str(e))

@app.post("/generate-preview")
async def generate_preview(data: LabReportData):
    try:
        img = renderer.generate_dashboard(data)
        
        # Convert image to base64 for preview
        buffered = io.BytesIO()
        img.save(buffered, format="PNG")
        img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
        
        return {"image_data": img_str}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

# For direct file upload if needed
@app.post("/upload")
async def upload_file(file: UploadFile = File(...)):
    # Read file, convert to base64, call extract
    contents = await file.read()
    b64_content = base64.b64encode(contents)
    # logic similar to extract
    pass

if __name__ == "__main__":
    import uvicorn
    uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)