ash/documentation/dsls/DSL:-Ash.Reactor.md
Zach Daniel 5967ed3a48 improvement!: 3.0 (#955)
* improvement!: use `%Ash.NotSelected{}` for unselected values

* improvement!: default `require_atomic?` to `true`

* improvement!: raise errors on unknown generic action arguments

* improvement!: default bulk strategy to `:atomic`

* improvement!: warnings on `require_atomic?` `true` actions
improvement!: revise `Ash.NotSelected` to `Ash.NotLoaded`
improvement!: errors on unknown action inputs across the board

* doc: clarify wording in notifiers.md

closes #889

* improvement!: default `api.authorization.authorize` to `:by_default`

* improvement!: require the api when constructing changesets

this commit also fixes some work from prior commits around
the default value for the `authorize` option

* improvement!: code_interface.define_for -> code_interface.api

`code_interface.define_for` is now `code_interface.api`. Additionally, it is set automatically if the `api` option is specified on `use Ash.Resource`.

* improvement!: remove registries

* improvement!: pubsub notifier default to `previous_values?: false`
improvement!: requires_original_data? callback defaults to false

* improvement!: rename Ash.Calculation -> Ash.Resource.Calculation
improvement!: improve `Ash.Query.Calculation.new` signature
improvement!: anonymous function calculations now take lists and return lists
improvement!: make callback contexts into structs
improvement!: pass context to builtin lifecycle hook changes
improvement!: calculation arguments are now in the `arguments` key of the context

* chore: fix build

* improvement!: remove `aggregates` and `calculations` from `Filter.parse` and `Filter.parse_input`

* improvement: update spark to 2.0

* improvement!: make picosat_elixir optional with `simple_sat`

* improvement!: rename api to domain

* docs: add more info to upgrading guide

* docs: tweak docs formatting

* improvement!: remove `Ash.Changeset.new!`

* docs: update docs for `Ash.Changeset.new/1`

* improvement!: deprecate `private?: false` in favor of `public?: true`

* doc: add upgrade guide for private -> public

* improvement: update reactor to 3.0

* improvement!: default `default_accept` is now `[]`

* improvement!: `Ash.CiString.new/1` returns `nil` on `nil` input

* improvement!(Ash.Reactor): Improve integration with Ash 3.0 changes.

* improvement!: clean up and reorganize `Ash` functions

this is in preparation of deprecating the functions that are defined
on the api

improvement!: remove context-based functionality

* chore: update docs references from `Ash.Domain` to `Ash`

* chore: fix bad merge

* chore: fix context access in atomic changes

* improvement!: Deprecate calling functions on (domain) api in favor of `Ash`

* improvement!: add `attribute_public?` and update `attribute_writable?` behavior

* improvement!: update atomic behaviors, default to invalid

* chore: update downcase docs

* improvement!: changeset.filters -> changeset.filter

* improvement!: remove deprecated functions

* improvement!: remove and simplify `Ash.Filter.TemplateHelpers`

* improvement: import Ash.Expr in modules where it is used
improvement: require Ash.QUery in modules where it makes sense

* fix!: keyword lists are no longer special cased in ash expressions

* improvement: add structs for more context implementations

* chore: small tweaks, finish `:all` -> `:*` conversion

* chore: update DSL docs for multitenancy.global?

* improvement: ensure selects are applied on destroys
chore: remove TODOs

* chore: some docs changes

* improvement!: introduce strict mode to calculations

* chore: update tests

* improvement: support custom expressions

* docs: document custom expressions

* chore: fix and test custom expressions and function fragments
docs: update relevant docs w/ the changes

* improvement!: reverse order of before action & before transaction hooks

* improvement!: default read actions are now paginatable

* improvement!: require explicit accept lists in default actions

* chore: update docs

* improvement!: remove Ash.Flow and Ash.Engine

* chore: unlock unused deps

* chore: don't use unused variable

* chore: include ash flow change in upgrade guide

* improvement!: standardize various exception keys and names

* improvement!: use `Splode` for errors

* improvement: update upgrade guide to include Splode

* feat: code interface on the domain

* improvement: only require primary key if resource has actions or fields
improvement: only build schema if resource has actions or fields
improvement: verify primary key in its own verifier

* improvement: add `resource/1` builtin check

* improvement!: move simple_notifiers to an option instead of a DSL builder
improvement!: update spark for better autocomplete, configure autocomplete for key functions
docs: replace `an domain` with `a domain`

* improvement: better code interface documentation

* fix: set tenant on query so that root calles to Api.aggreagte work as expected (#929)

* chore: fixes from previous improvements

* chore: update splode

* chore: update splode

* improvement!: swap position of sort order and arguments in calculation sorting

* improvement!: add `include_nil?` aggregate option, and default it to `false`

* improvement: support notifiers within actions

* improvement: support specifying multiple filters

* improvement: add `sortable?` flags to all fields
improvement: support multiple filters on relationships

* improvement: support sensitive? on calculations and arguments

* improvement: validate resources in inputs to code interface

* chore: don't require explicit accept lists when using `default_accept :*`

* chore: update spark

* chore: update public attribute handling per 3.0

* improvement: update reactor and tests

* chore: better error message

* chore: fix rebase issue

* chore: handle merge issues
improvement: don't require domain on relationships if destination has domain

* improvement!: errors on unknown inputs for calculations

* improvement: always choose to cast atomic

* improvement: support casting some embeds atomically

* improvement: various 3.0 updates, documented in upgrade.md

* chore: Add failing tests for loads with with explicit domains. (#948)

Co-authored-by: James Harton <james@harton.nz>

* improvement: ensure non-static dynamic domains works

* improvement: add Ash.ToTenant protocol

* chore: add docs for no ToTenant option

* fix: properly construct new query in `build/3`

* chore: update simple_sat dependency

* chore: don't reselect when missing primary keys

* chore: remove IO.inspect

* chore: update spark

* chore: update spark

* improvement: use `Keyword.put_new` in `Ash.Context.to_opts` (#953)

* improvement: support bulk and atomic operations in code interfaces

---------

Co-authored-by: James Harton <james@harton.nz>
Co-authored-by: WIGGLES <55168935+WIGGLES-dev@users.noreply.github.com>
Co-authored-by: Dmitry Maganov <vonagam@gmail.com>
2024-03-27 16:31:59 -04:00

34 KiB

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

Name Type Default Docs
default_domain{: #ash-default_domain } module A 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.

Nested DSLs

Arguments

Name Type Default Docs
name{: #reactor-action-name .spark-required} atom A unique name for the step. This is used when choosing the return value of the Reactor and for arguments into other steps.
resource{: #reactor-action-resource .spark-required} module The resource to call the action on.
action{: #reactor-action-action } atom The name of the action to call on the resource.

Options

Name Type Default Docs
domain{: #reactor-action-domain } module The Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?{: #reactor-action-async? } boolean true When set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?{: #reactor-action-authorize? } boolean | nil Explicitly enable or disable authorization for the action.
description{: #reactor-action-description } String.t A description for the step
undo_action{: #reactor-action-undo_action } atom The name of the action to call on the resource when the step is to be undone.
undo{: #reactor-action-undo } :always | :never | :outside_transaction :never What to do when the reactor is undoing it's work? * always - The undo action will always be run. * never - The action will never be undone. * outside_transaction - The action will only be undone if not running inside a transaction.

reactor.action.actor

actor source

Specifies the action actor

Arguments

Name Type Default Docs
source{: #reactor-action-actor-source .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value What to use as the source of the actor. See Reactor.Dsl.Argument for more information.

Options

Name Type Default Docs
transform{: #reactor-action-actor-transform } (any -> any) | module | nil An 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

Name Type Default Docs
template{: #reactor-action-inputs-template .spark-required} %{optional(atom) => Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value)

Options

Name Type Default Docs
transform{: #reactor-action-inputs-transform } (any -> any) | module | nil An 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

Name Type Default Docs
source{: #reactor-action-tenant-source .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value What to use as the source of the tenant. See Reactor.Dsl.Argument for more information.

Options

Name Type Default Docs
transform{: #reactor-action-tenant-transform } (any -> any) | module | nil An 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

Name Type Default Docs
names{: #reactor-action-wait_for-names .spark-required} atom | list(atom) The name of the step to wait for.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.Action

reactor.create

create name, resource, action \\ nil

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

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

Name Type Default Docs
name{: #reactor-create-name .spark-required} atom A unique name for the step. This is used when choosing the return value of the Reactor and for arguments into other steps.
resource{: #reactor-create-resource .spark-required} module The resource to call the action on.
action{: #reactor-create-action } atom The name of the action to call on the resource.

Options

Name Type Default Docs
upsert_identity{: #reactor-create-upsert_identity } atom The identity to use for the upsert
upsert?{: #reactor-create-upsert? } boolean false Whether or not this action should be executed as an upsert.
domain{: #reactor-create-domain } module The Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?{: #reactor-create-async? } boolean true When set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?{: #reactor-create-authorize? } boolean | nil Explicitly enable or disable authorization for the action.
description{: #reactor-create-description } String.t A description for the step
undo_action{: #reactor-create-undo_action } atom The name of the action to call on the resource when the step is to be undone.
undo{: #reactor-create-undo } :always | :never | :outside_transaction :never What to do when the reactor is undoing it's work? * always - The undo action will always be run. * never - The action will never be undone. * outside_transaction - The action will only be undone if not running inside a transaction.

reactor.create.actor

actor source

Specifies the action actor

Arguments

Name Type Default Docs
source{: #reactor-create-actor-source .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value What to use as the source of the actor. See Reactor.Dsl.Argument for more information.

Options

Name Type Default Docs
transform{: #reactor-create-actor-transform } (any -> any) | module | nil An 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

Name Type Default Docs
template{: #reactor-create-inputs-template .spark-required} %{optional(atom) => Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value)

Options

Name Type Default Docs
transform{: #reactor-create-inputs-transform } (any -> any) | module | nil An 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

Name Type Default Docs
source{: #reactor-create-tenant-source .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value What to use as the source of the tenant. See Reactor.Dsl.Argument for more information.

Options

Name Type Default Docs
transform{: #reactor-create-tenant-transform } (any -> any) | module | nil An 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

Name Type Default Docs
names{: #reactor-create-wait_for-names .spark-required} atom | 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.

Nested DSLs

Examples

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

Arguments

Name Type Default Docs
name{: #reactor-destroy-name .spark-required} atom A unique name for the step. This is used when choosing the return value of the Reactor and for arguments into other steps.
resource{: #reactor-destroy-resource .spark-required} module The resource to call the action on.
action{: #reactor-destroy-action } atom The name of the action to call on the resource.

Options

Name Type Default Docs
initial{: #reactor-destroy-initial .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value The record to update.
return_destroyed?{: #reactor-destroy-return_destroyed? } boolean false Whether or not the step should return the destroyed record upon completion.
domain{: #reactor-destroy-domain } module The Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?{: #reactor-destroy-async? } boolean true When set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?{: #reactor-destroy-authorize? } boolean | nil Explicitly enable or disable authorization for the action.
description{: #reactor-destroy-description } String.t A description for the step
undo_action{: #reactor-destroy-undo_action } atom The name of the action to call on the resource when the step is to be undone.
undo{: #reactor-destroy-undo } :always | :never | :outside_transaction :never What to do when the reactor is undoing it's work? * always - The undo action will always be run. * never - The action will never be undone. * outside_transaction - The action will only be undone if not running inside a transaction.

reactor.destroy.actor

actor source

Specifies the action actor

Arguments

Name Type Default Docs
source{: #reactor-destroy-actor-source .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value What to use as the source of the actor. See Reactor.Dsl.Argument for more information.

Options

Name Type Default Docs
transform{: #reactor-destroy-actor-transform } (any -> any) | module | nil An 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

Name Type Default Docs
template{: #reactor-destroy-inputs-template .spark-required} %{optional(atom) => Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value)

Options

Name Type Default Docs
transform{: #reactor-destroy-inputs-transform } (any -> any) | module | nil An 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

Name Type Default Docs
source{: #reactor-destroy-tenant-source .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value What to use as the source of the tenant. See Reactor.Dsl.Argument for more information.

Options

Name Type Default Docs
transform{: #reactor-destroy-tenant-transform } (any -> any) | module | nil An 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

Name Type Default Docs
names{: #reactor-destroy-wait_for-names .spark-required} atom | 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

Name Type Default Docs
name{: #reactor-read_one-name .spark-required} atom A unique name for the step. This is used when choosing the return value of the Reactor and for arguments into other steps.
resource{: #reactor-read_one-resource .spark-required} module The resource to call the action on.
action{: #reactor-read_one-action } atom The name of the action to call on the resource.

Options

Name Type Default Docs
fail_on_not_found?{: #reactor-read_one-fail_on_not_found? } boolean false When set to true the step will fail if the resource is not found.
domain{: #reactor-read_one-domain } module The Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?{: #reactor-read_one-async? } boolean true When set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?{: #reactor-read_one-authorize? } boolean | nil Explicitly enable or disable authorization for the action.
description{: #reactor-read_one-description } String.t A description for the step

reactor.read_one.actor

actor source

Specifies the action actor

Arguments

Name Type Default Docs
source{: #reactor-read_one-actor-source .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value What to use as the source of the actor. See Reactor.Dsl.Argument for more information.

Options

Name Type Default Docs
transform{: #reactor-read_one-actor-transform } (any -> any) | module | nil An 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

Name Type Default Docs
template{: #reactor-read_one-inputs-template .spark-required} %{optional(atom) => Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value)

Options

Name Type Default Docs
transform{: #reactor-read_one-inputs-transform } (any -> any) | module | nil An 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

Name Type Default Docs
source{: #reactor-read_one-tenant-source .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value What to use as the source of the tenant. See Reactor.Dsl.Argument for more information.

Options

Name Type Default Docs
transform{: #reactor-read_one-tenant-transform } (any -> any) | module | nil An 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

Name Type Default Docs
names{: #reactor-read_one-wait_for-names .spark-required} atom | 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

Name Type Default Docs
name{: #reactor-read-name .spark-required} atom A unique name for the step. This is used when choosing the return value of the Reactor and for arguments into other steps.
resource{: #reactor-read-resource .spark-required} module The resource to call the action on.
action{: #reactor-read-action } atom The name of the action to call on the resource.

Options

Name Type Default Docs
domain{: #reactor-read-domain } module The Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?{: #reactor-read-async? } boolean true When set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?{: #reactor-read-authorize? } boolean | nil Explicitly enable or disable authorization for the action.
description{: #reactor-read-description } String.t A description for the step

reactor.read.actor

actor source

Specifies the action actor

Arguments

Name Type Default Docs
source{: #reactor-read-actor-source .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value What to use as the source of the actor. See Reactor.Dsl.Argument for more information.

Options

Name Type Default Docs
transform{: #reactor-read-actor-transform } (any -> any) | module | nil An 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

Name Type Default Docs
template{: #reactor-read-inputs-template .spark-required} %{optional(atom) => Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value)

Options

Name Type Default Docs
transform{: #reactor-read-inputs-transform } (any -> any) | module | nil An 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

Name Type Default Docs
source{: #reactor-read-tenant-source .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value What to use as the source of the tenant. See Reactor.Dsl.Argument for more information.

Options

Name Type Default Docs
transform{: #reactor-read-tenant-transform } (any -> any) | module | nil An 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

Name Type Default Docs
names{: #reactor-read-wait_for-names .spark-required} atom | 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

Name Type Default Docs
name{: #reactor-transaction-name .spark-required} atom A unique name for the step. This is used when choosing the return value of the Reactor and for arguments into other steps.
resources{: #reactor-transaction-resources .spark-required} module | list(module) A resource or list of resources to consider in the transaction.

Options

Name Type Default Docs
return{: #reactor-transaction-return } atom The name of the step whose result will be returned as the return value of the transaction.
timeout{: #reactor-transaction-timeout } pos_integer | :infinity 15000 How 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

Name Type Default Docs
names{: #reactor-transaction-wait_for-names .spark-required} atom | 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.

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

Name Type Default Docs
name{: #reactor-update-name .spark-required} atom A unique name for the step. This is used when choosing the return value of the Reactor and for arguments into other steps.
resource{: #reactor-update-resource .spark-required} module The resource to call the action on.
action{: #reactor-update-action } atom The name of the action to call on the resource.

Options

Name Type Default Docs
initial{: #reactor-update-initial .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value The record to update.
domain{: #reactor-update-domain } module The Domain to use when calling the action. Defaults to the Domain set on the resource or in the ash section.
async?{: #reactor-update-async? } boolean true When set to true the step will be executed asynchronously via Reactor's TaskSupervisor.
authorize?{: #reactor-update-authorize? } boolean | nil Explicitly enable or disable authorization for the action.
description{: #reactor-update-description } String.t A description for the step
undo_action{: #reactor-update-undo_action } atom The name of the action to call on the resource when the step is to be undone.
undo{: #reactor-update-undo } :always | :never | :outside_transaction :never What to do when the reactor is undoing it's work? * always - The undo action will always be run. * never - The action will never be undone. * outside_transaction - The action will only be undone if not running inside a transaction.

reactor.update.actor

actor source

Specifies the action actor

Arguments

Name Type Default Docs
source{: #reactor-update-actor-source .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value What to use as the source of the actor. See Reactor.Dsl.Argument for more information.

Options

Name Type Default Docs
transform{: #reactor-update-actor-transform } (any -> any) | module | nil An 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

Name Type Default Docs
template{: #reactor-update-inputs-template .spark-required} %{optional(atom) => Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value} | keyword(Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value)

Options

Name Type Default Docs
transform{: #reactor-update-inputs-transform } (any -> any) | module | nil An 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

Name Type Default Docs
source{: #reactor-update-tenant-source .spark-required} Reactor.Template.Input | Reactor.Template.Result | Reactor.Template.Value What to use as the source of the tenant. See Reactor.Dsl.Argument for more information.

Options

Name Type Default Docs
transform{: #reactor-update-tenant-transform } (any -> any) | module | nil An 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

Name Type Default Docs
names{: #reactor-update-wait_for-names .spark-required} atom | list(atom) The name of the step to wait for.

Introspection

Target: Reactor.Dsl.WaitFor

Introspection

Target: Ash.Reactor.Dsl.Update