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
This commit is contained in:
Graham McIntire 2026-02-06 12:00:29 -06:00 committed by Graham McIntire
parent 26e5d20510
commit c6ec9ab891
No known key found for this signature in database

View file

@ -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)