From c6ec9ab891c104ae93e9298694130b4221449759 Mon Sep 17 00:00:00 2001 From: mayor Date: Fri, 6 Feb 2026 12:00:29 -0600 Subject: [PATCH] fix: Handle nil vlan_id in MAC address upsert queries Fixes ArgumentError when upserting MAC addresses with nil vlan_id. Ecto doesn't allow direct comparison with nil in queries - must use is_nil/1 instead. Changed upsert_mac_address to build dynamic query that uses is_nil(m.vlan_id) when vlan_id is nil, or direct comparison when it has a value. Error was: Comparison with nil is forbidden as it is unsafe. Instead write a query with is_nil/1 --- lib/towerops/snmp.ex | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/towerops/snmp.ex b/lib/towerops/snmp.ex index b2434bfa..8dfce3e1 100644 --- a/lib/towerops/snmp.ex +++ b/lib/towerops/snmp.ex @@ -1563,11 +1563,22 @@ defmodule Towerops.Snmp do Creates or updates a MAC address entry. """ def upsert_mac_address(attrs) do - case Repo.get_by(MacAddress, - device_id: attrs.device_id, - mac_address: attrs.mac_address, - vlan_id: attrs[:vlan_id] - ) do + import Ecto.Query + + # Build query to find existing MAC address entry + query = + from m in MacAddress, + where: m.device_id == ^attrs.device_id, + where: m.mac_address == ^attrs.mac_address + + # Handle vlan_id comparison (nil requires is_nil/1) + query = + case attrs[:vlan_id] do + nil -> where(query, [m], is_nil(m.vlan_id)) + vlan_id -> where(query, [m], m.vlan_id == ^vlan_id) + end + + case Repo.one(query) do nil -> %MacAddress{} |> MacAddress.changeset(attrs)