from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from .. import models, schemas from ..database import get_db router = APIRouter(tags=["sheets"]) @router.post("/", response_model=schemas.SheetOut) def create_sheet(sheet: schemas.SheetCreate, db: Session = Depends(get_db)): diagram = db.query(models.Diagram).filter(models.Diagram.id == sheet.diagram_id).first() if not diagram: raise HTTPException(status_code=404, detail="Diagram not found") db_sheet = models.Sheet(**sheet.model_dump()) db.add(db_sheet) db.commit() db.refresh(db_sheet) return db_sheet @router.get("/{sheet_id}", response_model=schemas.SheetOut) def get_sheet(sheet_id: int, db: Session = Depends(get_db)): sheet = db.query(models.Sheet).filter(models.Sheet.id == sheet_id).first() if not sheet: raise HTTPException(status_code=404, detail="Sheet not found") return sheet @router.patch("/{sheet_id}", response_model=schemas.SheetOut) def update_sheet(sheet_id: int, update: schemas.SheetUpdate, db: Session = Depends(get_db)): sheet = db.query(models.Sheet).filter(models.Sheet.id == sheet_id).first() if not sheet: raise HTTPException(status_code=404, detail="Sheet not found") for key, value in update.model_dump(exclude_none=True).items(): setattr(sheet, key, value) db.commit() db.refresh(sheet) return sheet @router.delete("/{sheet_id}") def delete_sheet(sheet_id: int, db: Session = Depends(get_db)): sheet = db.query(models.Sheet).filter(models.Sheet.id == sheet_id).first() if not sheet: raise HTTPException(status_code=404, detail="Sheet not found") sheet_count = db.query(models.Sheet).filter(models.Sheet.diagram_id == sheet.diagram_id).count() if sheet_count <= 1: raise HTTPException(status_code=400, detail="Cannot delete the last sheet") db.delete(sheet) db.commit() return {"ok": True}