ash_archival/documentation/topics/unarchiving.md
Zach Daniel b76a35bca9 improvement: support upserts
docs: add documentation explaining why you may still want to use a base filter
docs: add small upgrade guide, pointing at base_filter docs
2024-04-27 00:31:34 -04:00

817 B

Un-archiving

Un-archiving can be accomplished by creating a read action that is skipped, using exclude_read_actions. Then, you can create an update action that sets that attribute to nil. For example:

archive do
  ...
  exclude_read_actions :archived
end

actions do
  read :archived do
    filter expr(not is_nil(archived_at))
  end

  update :unarchive do
    update set_attribute(:archived_at, nil)
  end
end

You could then do something like this:

Resource
|> Ash.get!(id, action: :archived)
|> Ash.Changeset.for_update(:unarchive, %{)
|> Ash.update!()

More idiomatically, you would define a code interfaceon the domain, and call that:

# to unarchive by `id`
Resource
|> Ash.Query.for_read(:archived, %{})
|> Ash.Query.filter(id == ^id)
|> Domain.unarchive!()