Spaces:
Sleeping
Sleeping
File size: 3,668 Bytes
2ff1055 |
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
import os
import shutil
from enum import Enum
from typing import List, Optional
from datetime import datetime
from fastapi import FastAPI, Depends, HTTPException, UploadFile, File, Form
from fastapi.responses import FileResponse
from pydantic import BaseModel
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session
SQLALCHEMY_DATABASE_URL = "sqlite:///./lab.db"
engine = create_engine(
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
class RequestStatus(str, Enum):
PENDING = "pending"
FILE_UPLOADED = "file uploaded"
DONE = "done"
class LabRequest(Base):
__tablename__ = "requests"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
details = Column(String)
status = Column(String, default=RequestStatus.PENDING)
fastq_file_path = Column(String, nullable=True)
report_path = Column(String, nullable=True)
created_at = Column(DateTime, default=datetime.utcnow)
Base.metadata.create_all(bind=engine)
class RequestCreate(BaseModel):
name: str
details: str
class RequestResponse(BaseModel):
id: int
name: str
details: str
status: str
fastq_file_path: Optional[str] = None
report_path: Optional[str] = None
created_at: datetime
class Config:
from_attributes = True
app = FastAPI()
UPLOAD_DIR = "temp_uploads"
os.makedirs(UPLOAD_DIR, exist_ok=True)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.post("/request", response_model=RequestResponse)
def create_request(request: RequestCreate, db: Session = Depends(get_db)):
db_request = LabRequest(
name=request.name,
details=request.details,
status=RequestStatus.PENDING
)
db.add(db_request)
db.commit()
db.refresh(db_request)
return db_request
@app.get("/get-request", response_model=List[RequestResponse])
def get_requests(db: Session = Depends(get_db)):
return db.query(LabRequest).all()
@app.put("/modify-request/{request_id}", response_model=RequestResponse)
async def modify_request(
request_id: int,
fastq_file: Optional[UploadFile] = File(None),
report_file: Optional[UploadFile] = File(None),
db: Session = Depends(get_db)
):
db_request = db.query(LabRequest).filter(LabRequest.id == request_id).first()
if not db_request:
raise HTTPException(status_code=404, detail="Request not found")
if fastq_file:
file_location = f"{UPLOAD_DIR}/{request_id}_fastq_{fastq_file.filename}"
with open(file_location, "wb+") as file_object:
shutil.copyfileobj(fastq_file.file, file_object)
db_request.fastq_file_path = file_location
db_request.status = RequestStatus.FILE_UPLOADED
if report_file:
report_location = f"{UPLOAD_DIR}/{request_id}_report_{report_file.filename}"
with open(report_location, "wb+") as file_object:
shutil.copyfileobj(report_file.file, file_object)
db_request.report_path = report_location
db_request.status = RequestStatus.DONE
db.commit()
db.refresh(db_request)
return db_request
@app.get("/download/{filename}")
async def download_file(filename: str):
file_path = os.path.join(UPLOAD_DIR, filename)
if os.path.exists(file_path):
return FileResponse(file_path, filename=filename)
raise HTTPException(status_code=404, detail="File not found") |