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 <noreply@anthropic.com>
This commit is contained in:
2026-05-18 18:06:01 +02:00
parent 28e7a3e3d2
commit ec669c87b4
+9
View File
@@ -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