ammocpr/lib/ammoprices/scraping/scrape_job.ex

41 lines
1.1 KiB
Elixir

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,
Ammoprices.Scraping.Retailers.TargetSportsUsa,
Ammoprices.Scraping.Retailers.TrueShotAmmo,
Ammoprices.Scraping.Retailers.PalmettoStateArmory,
Ammoprices.Scraping.Retailers.BulkAmmo,
Ammoprices.Scraping.Retailers.Natchez
]
@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 minutes in prod, 0 in test
defp scrape_delay do
{min, max} = Application.get_env(:ammoprices, :scrape_delay_ms, {300_000, 900_000})
delay = Enum.random(min..max)
if delay > 0 do
Process.sleep(delay)
end
end
end