diff --git a/lib/farside/application.ex b/lib/farside/application.ex index db7f894..d518383 100644 --- a/lib/farside/application.ex +++ b/lib/farside/application.ex @@ -6,6 +6,7 @@ defmodule Farside.Application do require Logger alias Farside.LastUpdated + alias Farside.Check alias Farside.Sync alias Farside.Http @@ -22,7 +23,7 @@ defmodule Farside.Application do maybe_loaded_children = case is_nil(System.get_env("FARSIDE_TEST")) do true -> - [{Sync, []}] + [{Check, []}, {Sync, []}] false -> Logger.info("Skipping sync job setup...") @@ -82,5 +83,4 @@ defmodule Farside.Application do response end - end diff --git a/lib/farside/check.ex b/lib/farside/check.ex new file mode 100644 index 0000000..5356928 --- /dev/null +++ b/lib/farside/check.ex @@ -0,0 +1,28 @@ +defmodule Farside.Check do + use Task + + def child_spec(args) do + %{ + id: __MODULE__, + start: {__MODULE__, :start_link, [args]}, + type: :worker + } + end + + def start_link(_arg) do + Task.start_link(&poll/0) + end + + def poll() do + receive do + after + 60_000 -> + run() + poll() + end + end + + defp run() do + Farside.Instance.Supervisor.sync_empty_instances() + end +end diff --git a/lib/farside/instance.ex b/lib/farside/instance.ex index 498d9af..6b80d42 100644 --- a/lib/farside/instance.ex +++ b/lib/farside/instance.ex @@ -76,6 +76,25 @@ defmodule Farside.Instance do {:noreply, state} end + def handle_cast( + :check, + state + ) do + service = :ets.lookup(String.to_atom(state.type), :default) + + {_, service} = List.first(service) + + if Enum.count(service.instances) == 0 do + service = Http.fetch_instances(service) + + :ets.delete(String.to_atom(state.type), :data) + + :ets.insert(state.ref, {:data, service}) + end + + {:noreply, state} + end + @doc false def via_tuple(data, registry \\ @registry_name) do {:via, Registry, {registry, data}} diff --git a/lib/farside/instance.supervisor.ex b/lib/farside/instance.supervisor.ex index f890af1..4f66242 100644 --- a/lib/farside/instance.supervisor.ex +++ b/lib/farside/instance.supervisor.ex @@ -90,4 +90,12 @@ defmodule Farside.Instance.Supervisor do _ -> true end end + + def sync_empty_instances() do + list() + |> Enum.each(fn x -> + SERVER.via_tuple(x) + |> GenServer.cast(:check) + end) + end end