56 lines
1.5 KiB
Elixir
56 lines
1.5 KiB
Elixir
defmodule Towerops.Workers.VispSyncWorker do
|
|
@moduledoc """
|
|
Oban cron worker that syncs VISP data for all enabled integrations.
|
|
"""
|
|
use Oban.Worker, queue: :maintenance
|
|
|
|
alias Towerops.Integrations
|
|
alias Towerops.Visp.Sync
|
|
|
|
require Logger
|
|
|
|
@impl Oban.Worker
|
|
def perform(%Oban.Job{}) do
|
|
integrations = Integrations.list_enabled_integrations("visp")
|
|
|
|
results = Enum.map(integrations, &sync_integration/1)
|
|
|
|
synced = Enum.count(results, &match?({:ok, _}, &1))
|
|
failed = Enum.count(results, &match?({:error, _}, &1))
|
|
skipped = Enum.count(results, &(&1 == :skipped))
|
|
|
|
if synced > 0 or failed > 0 do
|
|
Logger.info("VISP sync batch: #{synced} synced, #{failed} failed, #{skipped} skipped")
|
|
end
|
|
|
|
:ok
|
|
end
|
|
|
|
defp sync_integration(integration) do
|
|
if should_sync?(integration) do
|
|
case Sync.sync_organization(integration) do
|
|
{:ok, result} ->
|
|
Logger.info("VISP sync completed for org #{integration.organization_id}: #{inspect(result)}")
|
|
{:ok, result}
|
|
|
|
{:error, reason} ->
|
|
Logger.error("VISP sync failed for org #{integration.organization_id}: #{inspect(reason)}")
|
|
{:error, reason}
|
|
end
|
|
else
|
|
:skipped
|
|
end
|
|
end
|
|
|
|
defp should_sync?(integration) do
|
|
case integration.last_synced_at do
|
|
nil ->
|
|
true
|
|
|
|
last_synced_at ->
|
|
interval_seconds = (integration.sync_interval_minutes || 10) * 60
|
|
elapsed = DateTime.diff(DateTime.utc_now(), last_synced_at, :second)
|
|
elapsed >= interval_seconds
|
|
end
|
|
end
|
|
end
|