Fix phantom queued status when Oban unique constraint rejects job

This commit is contained in:
Graham McIntire 2026-04-02 16:22:06 -05:00
parent d36256e730
commit 12d7dbf7ea
No known key found for this signature in database
GPG key ID: F4ABF488E6029E59

View file

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