AshEvents: No such input `id` for action; How to handle auto-generated primary keys?

I am currently trying to enable event tracking for one of my resources. As such, it contains the following event DSL:

defmodule MyApp.MyResource do
  events do
    event_log MyApp.MyEventLog
  end
  attributes do
    uuid_primary_key :id
    attribute :field1, ...
    attribute :field2, ...
  end
  actions do
    create :create do
      accept [:field1, :field2]
      argument :xyz, ...
    end
  end
end

The event tracking works correctly and I can see the events being populated in my event log with both data and changed_attributes being set correctly for each call of the :create action. The auto-generated UUID is recorded in changed_attributes as expected.

When I then try to replay the events as follows:
MyApp.MyEventLog |> Ash.ActionInput.for_action(:replay, %{}) |> Ash.run_action!()

I get this error:

** (Ash.Error.Invalid) 
Bread Crumbs:
  > Error returned from: MyApp.MyResource.create

Invalid Error

* No such input `id` for action MyApp.MyResource.create

The attribute exists on MyApp.MyResource, but is not accepted by MyApp.MyResource.create


The attribute is currently `writable?: false`, which means that it can never be accepted by an action.

Valid Inputs:

* :field1
* :field2
* ...

This left me very confused and unsure of how to proceed. The AshEvents documentation explicitly says that auto-genered UUIDs are recorded, and I can see that they are. As far as I understand, the default :force_change strategy for all actions shouldn’t require the field to be listed in accept. Furthermore, the examples on the Alembic blog also use resources with auto-generated UUIDs and do not explicitly accept id.

What changes do I have to make in order to get replay working?

Hi, AshEvents maintainer here!

I will start working on a fix for this :smiley:

As a temporary measure in the meantime, try making these changes:

  1. uuid_primary_key :id, writable?: true
  2. Add :id to the action’s accept list
2 Likes