berrypod/lib/berrypod/orders/fulfilment_status_worker.ex
jamey 9528700862 rename project from SimpleshopTheme to Berrypod
All modules, configs, paths, and references updated.
836 tests pass, zero warnings.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 21:23:15 +00:00

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