From ec669c87b4a0630ea043e08ffeeb071f7eed7d9b Mon Sep 17 00:00:00 2001 From: Olivier Date: Mon, 18 May 2026 18:06:01 +0200 Subject: [PATCH] fix: validate interface vlan_id existence before write in devices router Added _validate_iface_vlans() helper that checks all non-null vlan_ids against the DB before any insert or update, returning a 400 instead of letting SQLite raise an IntegrityError 500. Co-Authored-By: Claude Sonnet 4.6 --- backend/routers/devices.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/backend/routers/devices.py b/backend/routers/devices.py index 988859a..7673563 100644 --- a/backend/routers/devices.py +++ b/backend/routers/devices.py @@ -124,8 +124,16 @@ def list_devices(db: Session = Depends(get_db)): return db.query(models.Device).order_by(models.Device.name).all() +def _validate_iface_vlans(interfaces: List[InterfaceCreate], db: Session) -> None: + vlan_ids = {iface.vlan_id for iface in interfaces if iface.vlan_id is not None} + for vid in vlan_ids: + if not db.query(models.Vlan).filter(models.Vlan.id == vid).first(): + raise HTTPException(status_code=400, detail=f"Réseau introuvable : id={vid}") + + @router.post("/", response_model=DeviceOut) def create_device(device: DeviceCreate, db: Session = Depends(get_db)): + _validate_iface_vlans(device.interfaces, db) db_device = models.Device( name=device.name, type=device.type, @@ -149,6 +157,7 @@ def update_device(device_id: int, device: DeviceCreate, db: Session = Depends(ge db_device = db.query(models.Device).filter(models.Device.id == device_id).first() if not db_device: raise HTTPException(status_code=404, detail="Équipement introuvable") + _validate_iface_vlans(device.interfaces, db) db_device.name = device.name db_device.type = device.type db_device.description = device.description