From 12d7dbf7eaaa9c32242039ca5e954fca375f21b1 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Thu, 2 Apr 2026 16:22:06 -0500 Subject: [PATCH] Fix phantom queued status when Oban unique constraint rejects job --- .../live/contact_live/show.ex | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/lib/microwaveprop_web/live/contact_live/show.ex b/lib/microwaveprop_web/live/contact_live/show.ex index b8af0681..9a93d0b0 100644 --- a/lib/microwaveprop_web/live/contact_live/show.ex +++ b/lib/microwaveprop_web/live/contact_live/show.ex @@ -202,9 +202,15 @@ defmodule MicrowavepropWeb.ContactLive.Show do contact.pos1 && contact.weather_status not in [:queued, :unavailable] -> jobs = ContactWeatherEnqueueWorker.build_weather_jobs([contact]) - if jobs != [], do: Oban.insert_all(jobs) - Radio.set_enrichment_status!([contact.id], :weather_status, :queued) - %{contact | weather_status: :queued} + + if jobs != [] do + Oban.insert_all(jobs) + Radio.set_enrichment_status!([contact.id], :weather_status, :queued) + %{contact | weather_status: :queued} + else + Radio.set_enrichment_status!([contact.id], :weather_status, :unavailable) + %{contact | weather_status: :unavailable} + end is_nil(contact.pos1) -> %{contact | weather_status: :unavailable} @@ -296,9 +302,14 @@ defmodule MicrowavepropWeb.ContactLive.Show do defp maybe_enqueue_terrain(nil, contact) do cond do contact.pos1 && contact.pos2 && contact.terrain_status not in [:queued, :unavailable] -> - Oban.insert(TerrainProfileWorker.new(%{"contact_id" => contact.id})) - Radio.set_enrichment_status!([contact.id], :terrain_status, :queued) - %{contact | terrain_status: :queued} + case Oban.insert(TerrainProfileWorker.new(%{"contact_id" => contact.id})) do + {:ok, %{conflict?: false}} -> + Radio.set_enrichment_status!([contact.id], :terrain_status, :queued) + %{contact | terrain_status: :queued} + + _ -> + %{contact | terrain_status: :unavailable} + end is_nil(contact.pos1) or is_nil(contact.pos2) -> %{contact | terrain_status: :unavailable} @@ -324,16 +335,22 @@ defmodule MicrowavepropWeb.ContactLive.Show do valid_time = HrrrClient.nearest_hrrr_hour(contact.qso_timestamp) {rlat, rlon} = Weather.round_to_hrrr_grid(lat, lon) - Oban.insert( - HrrrFetchWorker.new(%{ - "lat" => rlat, - "lon" => rlon, - "valid_time" => DateTime.to_iso8601(valid_time) - }) - ) + case Oban.insert( + HrrrFetchWorker.new(%{ + "lat" => rlat, + "lon" => rlon, + "valid_time" => DateTime.to_iso8601(valid_time) + }) + ) do + {:ok, %{conflict?: false}} -> + Radio.set_enrichment_status!([contact.id], :hrrr_status, :queued) + {nil, %{contact | hrrr_status: :queued}} - Radio.set_enrichment_status!([contact.id], :hrrr_status, :queued) - {nil, %{contact | hrrr_status: :queued}} + _ -> + # Unique conflict — job already ran recently, mark unavailable + Radio.set_enrichment_status!([contact.id], :hrrr_status, :unavailable) + {nil, %{contact | hrrr_status: :unavailable}} + end else {nil, contact} end