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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user