View Source DSL: Ash.Reactor

Ash.Reactor is a Reactor extension which provides steps for working with Ash resources and actions.

See the Ash Reactor Guide for more information.

ash

Ash-related configuration for the Ash.Reactor extension

Options

NameTypeDefaultDocs
default_domainmoduleA domain to use by default when calling actions

reactor.action

action name, resource, action \\ nil

Declares a step that will call a generic action on a resource.

Undo behaviour

This step has three different modes of undo.

  • never - The result of the action is never undone. This is the default.
  • always - The undo_action will always be called.
  • outside_transaction - The undo_action will not be called when running inside a transaction block, but will be otherwise.

Nested DSLs

Arguments

NameTypeDefaultDocs
nameatomA unique name for the step.
resourcemoduleThe resource to call the action on.
actionatomThe name of the action to call on the resource.

Options

NameTypeDefaultDocs
domainmoduleThe Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?booleantrueWhen set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?boolean | nilExplicitly enable or disable authorization for the action.
descriptionString.tA description for the step
undo_actionatomThe name of the action to call on the resource when the step is to be undone.
undo:always | :never | :outside_transaction:neverHow to handle undoing this action

reactor.action.actor

actor source

Specifies the action actor

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the actor.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the actor before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Actor

reactor.action.context

context context

A map to be merged into the action's context

Arguments

NameTypeDefaultDocs
contextnil | Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value | mapA map to be merged into the action's context.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the context before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Context

reactor.action.inputs

inputs template

Specify the inputs for an action

Examples

inputs %{
  author: result(:get_user),
  title: input(:title),
  body: input(:body)
}
inputs(author: result(:get_user))

Arguments

NameTypeDefaultDocs
template%{optional(atom) => Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value)

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which will transform the inputs before executing the action.

Introspection

Target: Ash.Reactor.Dsl.Inputs

reactor.action.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the tenant.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the tenant before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Tenant

reactor.action.wait_for

wait_for names

Wait for the named step to complete before allowing this one to start.

Desugars to argument :_, result(step_to_wait_for)

Examples

wait_for :create_user

Arguments

NameTypeDefaultDocs
namesatom | list(atom)The name of the step to wait for.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.Action

reactor.ash_step

ash_step name, impl \\ nil

Specifies a Ash.Reactor step.

This is basically a wrapper around Reactor.step, in order to handle any returned notifications from the run step/function.

See the Reactor.Step behaviour for more information.

Nested DSLs

Examples

ash_step :create_post, MyApp.CreatePostStep do
  argument :title, input(:title)
end
ash_step :create_post do
  argument :title, input(:title)

  run fn %{title: title}, _ ->
    MyApp.Post.create(title, return_notifications?: true)
  end
end

Arguments

NameTypeDefaultDocs
nameatomA unique name for the step. Used when choosing the return value of the Reactor and for arguments into other steps.
implmodule | nilA module that implements the Reactor.Step behaviour that provides the implementation.

Options

NameTypeDefaultDocs
run(any -> any) | mfa | (any, any -> any) | mfaProvide an anonymous function which implements the run/3 callback. Cannot be provided at the same time as the impl argument.
undo(any -> any) | mfa | (any, any -> any) | mfa | (any, any, any -> any) | mfaProvide an anonymous function which implements the undo/4 callback. Cannot be provided at the same time as the impl argument.
compensate(any -> any) | mfa | (any, any -> any) | mfa | (any, any, any -> any) | mfaProvide an anonymous function which implements the undo/4 callback. Cannot be provided at the same time as the impl argument.
max_retries:infinity | non_neg_integer:infinityThe maximum number of times that the step can be retried before failing. Only used when the result of the compensate/4 callback is :retry.
async?booleantrueWhen set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the entire argument map before it is passed to the step.

reactor.ash_step.argument

argument name, source \\ nil

Specifies an argument to a Reactor step.

Each argument is a value which is either the result of another step, or an input value.

Individual arguments can be transformed with an arbitrary function before being passed to any steps.

Examples

argument :name, input(:name)
argument :year, input(:date, [:year])
argument :user, result(:create_user)
argument :user_id, result(:create_user) do
  transform & &1.id
end
argument :user_id, result(:create_user, [:id])
argument :three, value(3)

Arguments

NameTypeDefaultDocs
nameatomThe name of the argument which will be used as the key in the arguments map passed to the implementation.
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the argument. See Reactor.Dsl.Argument for more information.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description for the argument.
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the argument before it is passed to the step.

Introspection

Target: Reactor.Dsl.Argument

reactor.ash_step.wait_for

wait_for names

Wait for the named step to complete before allowing this one to start.

Desugars to argument :_, result(step_to_wait_for)

Examples

wait_for :create_user

Arguments

NameTypeDefaultDocs
namesatom | list(atom)The name of the step to wait for.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.AshStep

reactor.bulk_create

bulk_create name, resource, action \\ nil

Declares a step which will call a create action on a resource with a collection of inputs.

Check the docs!

Make sure to thoroughly read and understand the documentation in Ash.bulk_create/4 before using. Read each option and note the default values. By default, bulk creates don't return records or errors, and don't emit notifications.

Caveats/differences from Ash.bulk_create/4:

  1. max_concurrency specifies the number of tasks that Ash will start to process batches, and has no effect on Reactor concurrency targets. It's could be possible to create a very large number of processes if a number of steps are running bulk actions with a high degree of concurrency.
  2. Setting notify? to true will cause both notify? and return_notifications? to be set to true in the underlying call to Ash.bulk_create/4. Notifications will then be managed by the Ash.Reactor.Notifications Reactor middleware.
  3. If you specify an undo action it must be a generic action which takes the bulk result as it's only argument.

Undo behaviour

This step has three different modes of undo.

  • never - The result of the action is never undone. This is the default.
  • always - The undo_action will always be called.
  • outside_transaction - The undo_action will not be called when running inside a transaction block, but will be otherwise.

Nested DSLs

Examples

bulk_create :create_posts, MyApp.Post, :create do
  initial input(:titles)
  actor result(:get_user)
  tenant result(:get_organisation, [:id])
end

Arguments

NameTypeDefaultDocs
nameatomA unique name for the step.
resourcemoduleThe resource to call the action on.
actionatomThe name of the action to call on the resource.

Options

NameTypeDefaultDocs
initialReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueA collection of inputs to pass to the create action. Must implement the Enumerable protocol.
assume_casted?booleanfalseWhether or not to cast attributes and arguments as input. This is an optimization for cases where the input is already casted and/or not in need of casting
authorize_changeset_with:filter | :error:filterIf set to :error, instead of filtering unauthorized changes, unauthorized changes will raise an appropriate forbidden error
authorize_query_with:filter | :error:filterIf set to :error, instead of filtering unauthorized query results, unauthorized query results will raise an appropriate forbidden error
batch_sizenil | pos_integerThe number of records to include in each batch. Defaults to the default_limit or max_page_size of the action, or 100.
max_concurrencynon_neg_integer0If set to a value greater than 0, up to that many tasks will be started to run batches asynchronously.
notification_metadatamap | Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value%{}Metadata to be merged into the metadata field for all notifications sent from this operation.
notify?booleanfalseWhether or not to generate any notifications. This may be intensive for large bulk actions.
read_actionatomThe action to use when building the read query.
return_errors?booleanfalseWhether or not to return all of the errors that occur. Defaults to false to account for large inserts.
return_records?booleanfalseWhether or not to return all of the records that were inserted. Defaults to false to account for large inserts.
return_stream?booleanfalseIf set to true, instead of an Ash.BulkResult, a mixed stream is returned.
rollback_on_error?booleantrueWhether or not to rollback the transaction on error, if the resource is in a transaction.
selectatom | list(atom)A select statement to apply to records. Ignored if return_records? is not true.
skip_unknown_inputsatom | String.t | list(atom | String.t)A list of inputs that, if provided, will be ignored if they are not recognized by the action. Use :* to indicate all unknown keys.
sorted?booleanfalseWhether or not to sort results by their input position, in cases where return_records? is set to true.
stop_on_error?booleanfalseIf true, the first encountered error will stop the action and be returned. Otherwise, errors will be skipped.
success_state:success | :partial_success:successBulk results can be entirely or partially successful. Chooses the Ash.BulkResult state to consider the step a success.
timeouttimeoutIf none is provided, the timeout configured on the domain is used (which defaults to 30_000).
transaction:all | :batch | false:batchWhether or not to wrap the entire execution in a transaction, each batch, or not at all.
upsert_fieldsatom | list(atom)The fields to upsert. If not set, the action's upsert_fields is used.
upsert_identityatomThe identity to use for the upsert
upsert?booleanfalseWhether or not this action should be executed as an upsert.
domainmoduleThe Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?booleantrueWhen set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?boolean | nilExplicitly enable or disable authorization for the action.
descriptionString.tA description for the step
undo_actionatomThe name of the action to call on the resource when the step is to be undone.
undo:always | :never | :outside_transaction:neverHow to handle undoing this action

reactor.bulk_create.context

context context

A map to be merged into the action's context

Arguments

NameTypeDefaultDocs
contextnil | Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value | mapA map to be merged into the action's context.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the context before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Context

reactor.bulk_create.actor

actor source

Specifies the action actor

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the actor.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the actor before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Actor

reactor.bulk_create.load

load source

Allows the addition of an Ash load statement to the action

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the load

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the load before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.ActionLoad

reactor.bulk_create.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the tenant.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the tenant before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Tenant

reactor.bulk_create.wait_for

wait_for names

Wait for the named step to complete before allowing this one to start.

Desugars to argument :_, result(step_to_wait_for)

Examples

wait_for :create_user

Arguments

NameTypeDefaultDocs
namesatom | list(atom)The name of the step to wait for.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.BulkCreate

reactor.bulk_update

bulk_update name, resource, action \\ nil

Declares a step which will call an update action on a resource with a collection of inputs.

Check the docs!

Make sure to thoroughly read and understand the documentation in Ash.bulk_update/4 before using. Read each option and note the default values. By default, bulk updates don't return records or errors, and don't emit notifications.

Caveats/differences from Ash.bulk_update/4:

  1. max_concurrency specifies the number of tasks that Ash will start to process batches, and has no effect on Reactor concurrency targets. It's could be possible to create a very large number of processes if a number of steps are running bulk actions with a high degree of concurrency.
  2. Setting notify? to true will cause both notify? and return_notifications? to be set to true in the underlying call to Ash.bulk_create/4. Notifications will then be managed by the Ash.Reactor.Notifications Reactor middleware.
  3. If you specify an undo action it must be a generic action which takes the bulk result as it's only argument.

Undo behaviour

This step has three different modes of undo.

  • never - The result of the action is never undone. This is the default.
  • always - The undo_action will always be called.
  • outside_transaction - The undo_action will not be called when running inside a transaction block, but will be otherwise.

Nested DSLs

Examples

bulk_update :publish_posts, MyApp.Post, :publish do
  initial input(:posts),
  actor result(:get_user)
end

Arguments

NameTypeDefaultDocs
nameatomA unique name for the step.
resourcemoduleThe resource to call the action on.
actionatomThe name of the action to call on the resource.

Options

NameTypeDefaultDocs
initialReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueA collection of inputs to pass to the create action. Must implement the Enumerable protocol.
allow_stream_with:keyset | :offset | :full_read:keysetThe 'worst' strategy allowed to be used to fetch records if the :stream strategy is chosen. See the Ash.stream!/2 docs for more.
assume_casted?booleanfalseWhether or not to cast attributes and arguments as input. This is an optimization for cases where the input is already casted and/or not in need of casting
atomic_updatemapA map of atomic updates to apply. See Ash.Changeset.atomic_update/3 for more.
authorize_changeset_with:filter | :error:filterIf set to :error, instead of filtering unauthorized changes, unauthorized changes will raise an appropriate forbidden error
authorize_query_with:filter | :error:filterIf set to :error, instead of filtering unauthorized query results, unauthorized query results will raise an appropriate forbidden error
authorize_query?booleantrueIf a query is given, determines whether or not authorization is run on that query.
batch_sizenil | pos_integerThe number of records to include in each batch. Defaults to the default_limit or max_page_size of the action, or 100.
filtermap | keywordA filter to apply to records. This is also applied to a stream of inputs.
lockanyA lock statement to add onto the query.
max_concurrencynon_neg_integer0If set to a value greater than 0, up to that many tasks will be started to run batches asynchronously.
notification_metadatamap | Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value%{}Metadata to be merged into the metadata field for all notifications sent from this operation.
notify?booleanfalseWhether or not to generate any notifications. This may be intensive for large bulk actions.
pagekeyword[]Pagination options, see Ash.read/2 for more.
read_actionatomThe action to use when building the read query.
return_errors?booleanfalseWhether or not to return all of the errors that occur. Defaults to false to account for large inserts.
return_records?booleanfalseWhether or not to return all of the records that were inserted. Defaults to false to account for large inserts.
return_stream?booleanfalseIf set to true, instead of an Ash.BulkResult, a mixed stream is returned.
reuse_values?booleanfalseWhether calculations are allowed to reuse values that have already been loaded, or must refetch them from the data layer.
rollback_on_error?booleantrueWhether or not to rollback the transaction on error, if the resource is in a transaction.
selectatom | list(atom)A select statement to apply to records. Ignored if return_records? is not true.
skip_unknown_inputsatom | String.t | list(atom | String.t)A list of inputs that, if provided, will be ignored if they are not recognized by the action. Use :* to indicate all unknown keys.
sorted?booleanfalseWhether or not to sort results by their input position, in cases where return_records? is set to true.
stop_on_error?booleanfalseIf true, the first encountered error will stop the action and be returned. Otherwise, errors will be skipped.
strategylist(:atomic | :atomic_batches | :stream)[:atomic]The strategy or strategies to enable. :stream is used in all cases if the data layer does not support atomics.
stream_batch_sizepos_integerBatch size to use if provided a query and the query must be streamed.
stream_with:keyset | :offset | :full_readThe specific strategy to use to fetch records. See Ash.stream!/2 docs for more.
success_state:success | :partial_success:successBulk results can be entirely or partially successful. Chooses the Ash.BulkResult state to consider the step a success.
timeouttimeoutIf none is provided, the timeout configured on the domain is used (which defaults to 30_000).
transaction:all | :batch | false:batchWhether or not to wrap the entire execution in a transaction, each batch, or not at all.
domainmoduleThe Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?booleantrueWhen set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?boolean | nilExplicitly enable or disable authorization for the action.
descriptionString.tA description for the step
undo_actionatomThe name of the action to call on the resource when the step is to be undone.
undo:always | :never | :outside_transaction:neverHow to handle undoing this action

reactor.bulk_update.actor

actor source

Specifies the action actor

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the actor.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the actor before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Actor

reactor.bulk_update.context

context context

A map to be merged into the action's context

Arguments

NameTypeDefaultDocs
contextnil | Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value | mapA map to be merged into the action's context.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the context before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Context

reactor.bulk_update.inputs

inputs template

Specify the inputs for an action

Examples

inputs %{
  author: result(:get_user),
  title: input(:title),
  body: input(:body)
}
inputs(author: result(:get_user))

Arguments

NameTypeDefaultDocs
template%{optional(atom) => Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value)

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which will transform the inputs before executing the action.

Introspection

Target: Ash.Reactor.Dsl.Inputs

reactor.bulk_update.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the tenant.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the tenant before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Tenant

reactor.bulk_update.wait_for

wait_for names

Wait for the named step to complete before allowing this one to start.

Desugars to argument :_, result(step_to_wait_for)

Examples

wait_for :create_user

Arguments

NameTypeDefaultDocs
namesatom | list(atom)The name of the step to wait for.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.BulkUpdate

reactor.change

change name, change

Declares a step that will modify a changeset.

Nested DSLs

Arguments

NameTypeDefaultDocs
nameatomA unique name for this step.
change(any, any -> any) | moduleThe module and options for a change. Also accepts a function that takes the changeset and the context. See Ash.Resource.Change.Builtins for builtin changes.

Options

NameTypeDefaultDocs
initialmodule | Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueThe initial value to work from, either a resource or a changeset
descriptionString.t | nilAn optional description for the change
only_when_valid?booleanfalseIf the change should only be run on valid changes. By default, all changes are run unless stated otherwise here.
where(any, any -> any) | module | list((any, any -> any) | module)[]Validations that should pass in order for this change to apply. These validations failing will result in this change being ignored.
fail_if_invalid?booleanfalseFail if the result of the change is an invalid changeset

reactor.change.argument

argument name, source \\ nil

Specifies an argument to a Reactor step.

Each argument is a value which is either the result of another step, or an input value.

Individual arguments can be transformed with an arbitrary function before being passed to any steps.

Examples

argument :name, input(:name)
argument :year, input(:date, [:year])
argument :user, result(:create_user)
argument :user_id, result(:create_user) do
  transform & &1.id
end
argument :user_id, result(:create_user, [:id])
argument :three, value(3)

Arguments

NameTypeDefaultDocs
nameatomThe name of the argument which will be used as the key in the arguments map passed to the implementation.
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the argument. See Reactor.Dsl.Argument for more information.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description for the argument.
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the argument before it is passed to the step.

Introspection

Target: Reactor.Dsl.Argument

reactor.change.wait_for

wait_for names

Wait for the named step to complete before allowing this one to start.

Desugars to argument :_, result(step_to_wait_for)

Examples

wait_for :create_user

Arguments

NameTypeDefaultDocs
namesatom | list(atom)The name of the step to wait for.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.Change

reactor.create

create name, resource, action \\ nil

Declares a step that will call a create action on a resource.

Undo behaviour

This step has three different modes of undo.

  • never - The result of the action is never undone. This is the default.
  • always - The undo_action will always be called.
  • outside_transaction - The undo_action will not be called when running inside a transaction block, but will be otherwise.

Nested DSLs

Examples

create :create_post, MyApp.Post, :create do
  inputs %{
    title: input(:post_title),
    author_id: result(:get_user, [:id])
  }
  actor result(:get_user)
  tenant result(:get_organisation, [:id])
end

Arguments

NameTypeDefaultDocs
nameatomA unique name for the step.
resourcemoduleThe resource to call the action on.
actionatomThe name of the action to call on the resource.

Options

NameTypeDefaultDocs
initialnil | module | Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueThe initial value passed into the action.
upsert_identityatomThe identity to use for the upsert
upsert?booleanfalseWhether or not this action should be executed as an upsert.
domainmoduleThe Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?booleantrueWhen set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?boolean | nilExplicitly enable or disable authorization for the action.
descriptionString.tA description for the step
undo_actionatomThe name of the action to call on the resource when the step is to be undone.
undo:always | :never | :outside_transaction:neverHow to handle undoing this action

reactor.create.actor

actor source

Specifies the action actor

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the actor.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the actor before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Actor

reactor.create.context

context context

A map to be merged into the action's context

Arguments

NameTypeDefaultDocs
contextnil | Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value | mapA map to be merged into the action's context.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the context before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Context

reactor.create.inputs

inputs template

Specify the inputs for an action

Examples

inputs %{
  author: result(:get_user),
  title: input(:title),
  body: input(:body)
}
inputs(author: result(:get_user))

Arguments

NameTypeDefaultDocs
template%{optional(atom) => Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value)

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which will transform the inputs before executing the action.

Introspection

Target: Ash.Reactor.Dsl.Inputs

reactor.create.load

load source

Allows the addition of an Ash load statement to the action

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the load

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the load before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.ActionLoad

reactor.create.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the tenant.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the tenant before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Tenant

reactor.create.wait_for

wait_for names

Wait for the named step to complete before allowing this one to start.

Desugars to argument :_, result(step_to_wait_for)

Examples

wait_for :create_user

Arguments

NameTypeDefaultDocs
namesatom | list(atom)The name of the step to wait for.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.Create

reactor.destroy

destroy name, resource, action \\ nil

Declares a step that will call a destroy action on a resource.

Undo behaviour

This step has three different modes of undo.

  • never - The result of the action is never undone. This is the default.
  • always - The undo_action will always be called.
  • outside_transaction - The undo_action will not be called when running inside a transaction block, but will be otherwise.

Nested DSLs

Examples

destroy :delete_post, MyApp.Post, :destroy do
  initial input(:post)
  actor result(:get_user)
  tenant result(:get_organisation, [:id])
end

Arguments

NameTypeDefaultDocs
nameatomA unique name for the step.
resourcemoduleThe resource to call the action on.
actionatomThe name of the action to call on the resource.

Options

NameTypeDefaultDocs
initialReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueThe record to update.
return_destroyed?booleanfalseWhether or not the step should return the destroyed record upon completion.
domainmoduleThe Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?booleantrueWhen set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?boolean | nilExplicitly enable or disable authorization for the action.
descriptionString.tA description for the step
undo_actionatomThe name of the action to call on the resource when the step is to be undone.
undo:always | :never | :outside_transaction:neverHow to handle undoing this action

reactor.destroy.actor

actor source

Specifies the action actor

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the actor.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the actor before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Actor

reactor.destroy.context

context context

A map to be merged into the action's context

Arguments

NameTypeDefaultDocs
contextnil | Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value | mapA map to be merged into the action's context.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the context before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Context

reactor.destroy.inputs

inputs template

Specify the inputs for an action

Examples

inputs %{
  author: result(:get_user),
  title: input(:title),
  body: input(:body)
}
inputs(author: result(:get_user))

Arguments

NameTypeDefaultDocs
template%{optional(atom) => Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value)

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which will transform the inputs before executing the action.

Introspection

Target: Ash.Reactor.Dsl.Inputs

reactor.destroy.load

load source

Allows the addition of an Ash load statement to the action

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the load

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the load before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.ActionLoad

reactor.destroy.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the tenant.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the tenant before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Tenant

reactor.destroy.wait_for

wait_for names

Wait for the named step to complete before allowing this one to start.

Desugars to argument :_, result(step_to_wait_for)

Examples

wait_for :create_user

Arguments

NameTypeDefaultDocs
namesatom | list(atom)The name of the step to wait for.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.Destroy

reactor.load

load name, records, load

Declares a step that will load additional data on a resource.

Nested DSLs

Arguments

NameTypeDefaultDocs
nameatomA unique name for the step.
recordsReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueThe records upon which to add extra loaded data
loadReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueAn Ash load statement

Options

NameTypeDefaultDocs
domainmoduleThe Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?booleantrueWhen set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?boolean | nilExplicitly enable or disable authorization for the action.
descriptionString.tA description for the step
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the load statement before it is passed to the load.
lazy?booleanIf set to true, values will only be loaded if the related value isn't currently loaded.
reuse_values?booleanWhether calculations are allowed to reuse values that have already been loaded, or must refetch them from the data layer.
strict?booleanIf set to true, only specified attributes will be loaded when passing a list of fields to fetch on a relationship, which allows for more optimized data-fetching.

reactor.load.actor

actor source

Specifies the action actor

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the actor.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the actor before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Actor

reactor.load.context

context context

A map to be merged into the action's context

Arguments

NameTypeDefaultDocs
contextnil | Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value | mapA map to be merged into the action's context.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the context before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Context

reactor.load.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the tenant.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the tenant before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Tenant

reactor.load.wait_for

wait_for names

Wait for the named step to complete before allowing this one to start.

Desugars to argument :_, result(step_to_wait_for)

Examples

wait_for :create_user

Arguments

NameTypeDefaultDocs
namesatom | list(atom)The name of the step to wait for.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.Load

reactor.read_one

read_one name, resource, action \\ nil

Declares a step that will call a read action on a resource returning a single record.

Nested DSLs

Examples

read_one :post_by_id, MyApp.Post, :read do
  inputs %{id: input(:post_id)}
end

Arguments

NameTypeDefaultDocs
nameatomA unique name for the step.
resourcemoduleThe resource to call the action on.
actionatomThe name of the action to call on the resource.

Options

NameTypeDefaultDocs
fail_on_not_found?booleanfalseWhen set to true the step will fail if the resource is not found.
domainmoduleThe Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?booleantrueWhen set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?boolean | nilExplicitly enable or disable authorization for the action.
descriptionString.tA description for the step

reactor.read_one.actor

actor source

Specifies the action actor

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the actor.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the actor before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Actor

reactor.read_one.context

context context

A map to be merged into the action's context

Arguments

NameTypeDefaultDocs
contextnil | Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value | mapA map to be merged into the action's context.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the context before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Context

reactor.read_one.inputs

inputs template

Specify the inputs for an action

Examples

inputs %{
  author: result(:get_user),
  title: input(:title),
  body: input(:body)
}
inputs(author: result(:get_user))

Arguments

NameTypeDefaultDocs
template%{optional(atom) => Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value)

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which will transform the inputs before executing the action.

Introspection

Target: Ash.Reactor.Dsl.Inputs

reactor.read_one.load

load source

Allows the addition of an Ash load statement to the action

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the load

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the load before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.ActionLoad

reactor.read_one.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the tenant.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the tenant before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Tenant

reactor.read_one.wait_for

wait_for names

Wait for the named step to complete before allowing this one to start.

Desugars to argument :_, result(step_to_wait_for)

Examples

wait_for :create_user

Arguments

NameTypeDefaultDocs
namesatom | list(atom)The name of the step to wait for.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.ReadOne

reactor.read

read name, resource, action \\ nil

Declares a step that will call a read action on a resource.

Nested DSLs

Examples

read :read_posts, MyApp.Post, :read
read :read_posts_in_range, MyApp.Post, :read_in_range do
  inputs %{min_date: input(:min_date), max_date: input(:max_date)}
end

Arguments

NameTypeDefaultDocs
nameatomA unique name for the step.
resourcemoduleThe resource to call the action on.
actionatomThe name of the action to call on the resource.

Options

NameTypeDefaultDocs
domainmoduleThe Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?booleantrueWhen set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?boolean | nilExplicitly enable or disable authorization for the action.
descriptionString.tA description for the step

reactor.read.actor

actor source

Specifies the action actor

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the actor.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the actor before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Actor

reactor.read.context

context context

A map to be merged into the action's context

Arguments

NameTypeDefaultDocs
contextnil | Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value | mapA map to be merged into the action's context.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the context before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Context

reactor.read.inputs

inputs template

Specify the inputs for an action

Examples

inputs %{
  author: result(:get_user),
  title: input(:title),
  body: input(:body)
}
inputs(author: result(:get_user))

Arguments

NameTypeDefaultDocs
template%{optional(atom) => Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value)

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which will transform the inputs before executing the action.

Introspection

Target: Ash.Reactor.Dsl.Inputs

reactor.read.load

load source

Allows the addition of an Ash load statement to the action

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the load

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the load before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.ActionLoad

reactor.read.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the tenant.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the tenant before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Tenant

reactor.read.wait_for

wait_for names

Wait for the named step to complete before allowing this one to start.

Desugars to argument :_, result(step_to_wait_for)

Examples

wait_for :create_user

Arguments

NameTypeDefaultDocs
namesatom | list(atom)The name of the step to wait for.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.Read

reactor.transaction

transaction name, resources

Creates a group of steps which will be executed inside a data layer transaction.

Nested DSLs

Arguments

NameTypeDefaultDocs
nameatomA unique name for the step.
resourcesmodule | list(module)A resource or list of resources to consider in the transaction.

Options

NameTypeDefaultDocs
returnatomThe name of the step whose result will be returned as the return value of the transaction.
timeoutpos_integer | :infinity15000How long to allow the transaction to run before timing out.

reactor.transaction.wait_for

wait_for names

Wait for the named step to complete before allowing this one to start.

Desugars to argument :_, result(step_to_wait_for)

Examples

wait_for :create_user

Arguments

NameTypeDefaultDocs
namesatom | list(atom)The name of the step to wait for.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.Transaction

reactor.update

update name, resource, action \\ nil

Declares a step that will call an update action on a resource.

Undo behaviour

This step has three different modes of undo.

  • never - The result of the action is never undone. This is the default.
  • always - The undo_action will always be called.
  • outside_transaction - The undo_action will not be called when running inside a transaction block, but will be otherwise.

Nested DSLs

Examples

update :publish_post, MyApp.Post, :update do
  initial input(:post)
  inputs %{
    published: value(true)
  }
  actor result(:get_user)
  tenant result(:get_organisation, [:id])
end

Arguments

NameTypeDefaultDocs
nameatomA unique name for the step.
resourcemoduleThe resource to call the action on.
actionatomThe name of the action to call on the resource.

Options

NameTypeDefaultDocs
initialReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueThe record to update.
domainmoduleThe Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?booleantrueWhen set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?boolean | nilExplicitly enable or disable authorization for the action.
descriptionString.tA description for the step
undo_actionatomThe name of the action to call on the resource when the step is to be undone.
undo:always | :never | :outside_transaction:neverHow to handle undoing this action

reactor.update.actor

actor source

Specifies the action actor

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the actor.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the actor before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Actor

reactor.update.context

context context

A map to be merged into the action's context

Arguments

NameTypeDefaultDocs
contextnil | Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value | mapA map to be merged into the action's context.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the context before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Context

reactor.update.inputs

inputs template

Specify the inputs for an action

Examples

inputs %{
  author: result(:get_user),
  title: input(:title),
  body: input(:body)
}
inputs(author: result(:get_user))

Arguments

NameTypeDefaultDocs
template%{optional(atom) => Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(Reactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value)

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which will transform the inputs before executing the action.

Introspection

Target: Ash.Reactor.Dsl.Inputs

reactor.update.load

load source

Allows the addition of an Ash load statement to the action

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the load

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the load before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.ActionLoad

reactor.update.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.Template.Element | Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the tenant.

Options

NameTypeDefaultDocs
transform(any -> any) | module | nilAn optional transformation function which can be used to modify the tenant before it is passed to the action.

Introspection

Target: Ash.Reactor.Dsl.Tenant

reactor.update.wait_for

wait_for names

Wait for the named step to complete before allowing this one to start.

Desugars to argument :_, result(step_to_wait_for)

Examples

wait_for :create_user

Arguments

NameTypeDefaultDocs
namesatom | list(atom)The name of the step to wait for.

Options

NameTypeDefaultDocs
descriptionString.tAn optional description.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.Update