defmodule Ammoprices.Scraping.ScrapeJob do @moduledoc false use Oban.Worker, queue: :scraping, max_attempts: 3 alias Ammoprices.Catalog alias Ammoprices.Scraping.Runner @scrapers [ Ammoprices.Scraping.Retailers.LuckyGunner, Ammoprices.Scraping.Retailers.SgAmmo ] @impl Oban.Worker def perform(_job) do calibers = Catalog.list_calibers() for scraper <- @scrapers, caliber <- calibers do scrape_delay() Runner.run(scraper, caliber) end Phoenix.PubSub.broadcast(Ammoprices.PubSub, "prices:updated", {:prices_updated, %{}}) :ok end # Random delay between requests: 5-15 seconds in prod, 0 in test defp scrape_delay do {min, max} = Application.get_env(:ammoprices, :scrape_delay_ms, {5_000, 15_000}) delay = Enum.random(min..max) if delay > 0 do Process.sleep(delay) end end end