2023-04-28 14:07:05 +12:00
|
|
|
defmodule AshOban.Transformers.SetDefaults do
|
2023-04-28 14:36:29 +12:00
|
|
|
@moduledoc "Set trigger default values"
|
|
|
|
|
2023-04-28 14:07:05 +12:00
|
|
|
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
|
|
|
|
|
2023-04-28 14:36:29 +12:00
|
|
|
# sobelow_skip ["DOS.BinToAtom"]
|
2023-04-28 14:07:05 +12:00
|
|
|
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,
|
2023-05-09 06:49:22 +12:00
|
|
|
scheduler_queue: trigger.scheduler_queue || queue,
|
2023-04-28 14:07:05 +12:00
|
|
|
action: trigger.action || trigger.name
|
|
|
|
})
|
|
|
|
end)}
|
|
|
|
end
|
|
|
|
|
2023-04-28 14:36:29 +12:00
|
|
|
# sobelow_skip ["DOS.BinToAtom"]
|
2023-04-28 14:07:05 +12:00
|
|
|
defp default_queue_name(dsl, trigger) do
|
|
|
|
:"#{Ash.Resource.Info.short_name(dsl)}_#{trigger.name}"
|
|
|
|
end
|
|
|
|
end
|