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.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.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.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(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.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.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.Action

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.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.Input | Reactor.Template.Result | Reactor.Template.ValueWhat to use as the source of the argument. See Reactor.Dsl.Argument for more information.

Options

NameTypeDefaultDocs
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.

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.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.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.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.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(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.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.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.

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.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.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.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.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(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.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.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.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.Destroy

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.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.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.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(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.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.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.

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.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.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.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(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.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.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.

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.

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.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.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.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.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(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.tenant

tenant source

Specifies the action tenant

Arguments

NameTypeDefaultDocs
sourceReactor.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.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.Update