ash_oban/lib/transformers/set_defaults.ex
Zach Daniel 1520a3db3e improvement: make scheduler default queue the same as worker
but give scheduler a priority of 1 so it happens before workers.
2023-05-08 14:49:22 -04:00

66 lines
2 KiB
Elixir

defmodule AshOban.Transformers.SetDefaults do
@moduledoc "Set trigger default values"
use Spark.Dsl.Transformer
alias Spark.Dsl.Transformer
def after?(AshOban.Transformers.DefineSchedulers), do: false
def after?(_), do: true
def before?(AshOban.Transformers.DefineSchedulers), do: true
def before?(_), do: false
# sobelow_skip ["DOS.BinToAtom"]
def transform(dsl) do
module = Transformer.get_persisted(dsl, :module)
{:ok,
dsl
|> Transformer.get_entities([:oban, :triggers])
|> Enum.reduce(dsl, fn trigger, dsl ->
read_action =
case trigger.read_action do
nil ->
Ash.Resource.Info.primary_action(dsl, :read) ||
raise Spark.Error.DslError,
path: [
:oban,
:triggers,
trigger.name,
:read_action
],
module: module,
message: """
No read action was configured for this trigger, and no primary read action exists
"""
read_action ->
Ash.Resource.Info.action(dsl, read_action)
end
unless read_action.pagination && read_action.pagination.keyset? do
raise Spark.Error.DslError,
path: [:oban, :triggers, trigger.name, :read_action],
module: module,
message: """
The read action `:#{read_action.name}` must support keyset pagination in order to be
used by an AshOban trigger.
"""
end
queue = trigger.queue || default_queue_name(dsl, trigger)
Transformer.replace_entity(dsl, [:oban, :triggers], %{
trigger
| read_action: read_action.name,
queue: queue,
scheduler_queue: trigger.scheduler_queue || queue,
action: trigger.action || trigger.name
})
end)}
end
# sobelow_skip ["DOS.BinToAtom"]
defp default_queue_name(dsl, trigger) do
:"#{Ash.Resource.Info.short_name(dsl)}_#{trigger.name}"
end
end