All modules, configs, paths, and references updated. 836 tests pass, zero warnings. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
50 lines
1.2 KiB
Elixir
50 lines
1.2 KiB
Elixir
defmodule Berrypod.Orders.FulfilmentStatusWorker do
|
|
@moduledoc """
|
|
Oban Cron worker that polls the fulfilment provider for status updates.
|
|
|
|
Runs every 30 minutes as a fallback for missed webhook events.
|
|
Only checks orders that are submitted or processing (i.e. awaiting
|
|
further status transitions).
|
|
"""
|
|
|
|
use Oban.Worker, queue: :sync, max_attempts: 1
|
|
|
|
alias Berrypod.Orders
|
|
|
|
require Logger
|
|
|
|
@impl Oban.Worker
|
|
def perform(%Oban.Job{}) do
|
|
orders = Orders.list_submitted_orders()
|
|
|
|
if orders == [] do
|
|
:ok
|
|
else
|
|
Logger.info("Polling fulfilment status for #{length(orders)} order(s)")
|
|
|
|
Enum.each(orders, fn order ->
|
|
refresh_order(order)
|
|
Process.sleep(200)
|
|
end)
|
|
|
|
:ok
|
|
end
|
|
end
|
|
|
|
defp refresh_order(order) do
|
|
case Orders.refresh_fulfilment_status(order) do
|
|
{:ok, updated} ->
|
|
if updated.fulfilment_status != order.fulfilment_status do
|
|
Logger.info(
|
|
"Order #{order.order_number} status: #{order.fulfilment_status} → #{updated.fulfilment_status}"
|
|
)
|
|
end
|
|
|
|
{:error, reason} ->
|
|
Logger.warning(
|
|
"Failed to refresh status for order #{order.order_number}: #{inspect(reason)}"
|
|
)
|
|
end
|
|
end
|
|
end
|