from typing import List from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from .. import models, schemas from ..database import get_db router = APIRouter(tags=["bundles"]) @router.get("/diagram/{diagram_id}", response_model=List[schemas.WireBundleOut]) def list_bundles(diagram_id: int, db: Session = Depends(get_db)): return db.query(models.WireBundle).filter(models.WireBundle.diagram_id == diagram_id).all() @router.post("/", response_model=schemas.WireBundleOut, status_code=201) def create_bundle(payload: schemas.WireBundleCreate, db: Session = Depends(get_db)): bundle = models.WireBundle(**payload.model_dump()) db.add(bundle) db.commit() db.refresh(bundle) return bundle @router.patch("/{bundle_id}", response_model=schemas.WireBundleOut) def update_bundle(bundle_id: int, payload: schemas.WireBundleUpdate, db: Session = Depends(get_db)): bundle = db.get(models.WireBundle, bundle_id) if not bundle: raise HTTPException(404, "Bundle not found") for k, v in payload.model_dump(exclude_unset=True).items(): setattr(bundle, k, v) db.commit() db.refresh(bundle) return bundle @router.delete("/{bundle_id}", status_code=204) def delete_bundle(bundle_id: int, db: Session = Depends(get_db)): bundle = db.get(models.WireBundle, bundle_id) if not bundle: raise HTTPException(404, "Bundle not found") # Detach wires before deleting for wire in bundle.wires: wire.bundle_id = None db.delete(bundle) db.commit()