diff --git a/lib/pleroma/workers/reachability_worker.ex b/lib/pleroma/workers/reachability_worker.ex index ba6928dee..badfa476c 100644 --- a/lib/pleroma/workers/reachability_worker.ex +++ b/lib/pleroma/workers/reachability_worker.ex @@ -24,6 +24,22 @@ defmodule Pleroma.Workers.ReachabilityWorker do end end + # New jobs enter here and are immediately re-scheduled for the first phase + @impl true + def perform(%Oban.Job{args: %{"domain" => domain}}) do + scheduled_at = DateTime.add(DateTime.utc_now(), 60, :second) + + %{ + "domain" => domain, + "phase" => "phase_1min", + "attempt" => 1 + } + |> new(scheduled_at: scheduled_at, replace: true) + |> Oban.insert() + + :ok + end + @impl true def timeout(_job), do: :timer.seconds(5) diff --git a/test/pleroma/workers/reachability_worker_test.exs b/test/pleroma/workers/reachability_worker_test.exs index 32c39e869..4854aff77 100644 --- a/test/pleroma/workers/reachability_worker_test.exs +++ b/test/pleroma/workers/reachability_worker_test.exs @@ -191,6 +191,30 @@ defmodule Pleroma.Workers.ReachabilityWorkerTest do assert existing_job.args["domain"] == domain assert existing_job.args["phase"] == "phase_1min" end + + test "handles new jobs with only domain argument and transitions them to the first phase" do + domain = "legacy.example.com" + + with_mocks([ + {Pleroma.Instances, [], [set_reachable: fn _ -> :ok end]} + ]) do + # Create a job with only domain (legacy format) + job = %Oban.Job{ + args: %{"domain" => domain} + } + + # Should reschedule with phase_1min and attempt 1 + assert :ok = ReachabilityWorker.perform(job) + + # Check that a new job was scheduled with the correct format + scheduled_jobs = all_enqueued(worker: ReachabilityWorker) + assert length(scheduled_jobs) == 1 + [scheduled_job] = scheduled_jobs + assert scheduled_job.args["domain"] == domain + assert scheduled_job.args["phase"] == "phase_1min" + assert scheduled_job.args["attempt"] == 1 + end + end end defp get_phase_config("phase_1min"), do: {1, 4, "phase_15min"}