Ben RMX
AEAsh Elixir
•Created by Ben RMX on 9/27/2023 in #support
Breaking action chain in a before_action?
Problem Statement:
My webhook receives at-least-once messaging from an external producer, and I want to persist these Events -- ids generated by the producer-- as an Ash Resource, such that only one instance is saved in the database (postgres), and an Oban job is only enqueued once.
I've created a custom
:add
action with the upsert?
feature, and that works great for the Event persistence -- idempotent no-ops on subsequent calls.
Issue:
However, it doesn't look like there is any information in the Ash.Changeset.after_action
record to determine if it was a fresh record or an existing record, and thus, I don't see a way to conditionally enqueue an Oban job.
Possible solutions?
1. Add a nonce
to Event, have a before action populate the changeset with a random number; followed by an after action that compares the returned record vs the changeset nonce... and enqueue Oban job if they match... This would be a probabilistic approach
2. Or, probably better, is if there a way for a before_action
to load a possibly already existing Event with that given id-producer pair; if exists then shortcut stop the action, returning that Event as the result of the action? Or is this an around_action
? -- knowing that these steps all live in the same db transaction...7 replies
AEAsh Elixir
•Created by Ben RMX on 9/26/2023 in #support
Does attribute and action order matter? and Upsert fields?
Given Declaration
The above gives me the warning:
warning: the Inspect protocol has already been consolidated, an implementation for Btwb.Koohbew.Event has no effect. If you want to implement protocols after compilation or during tests, check the "Consolidation" section in the Protocol module documentationBut if I move identities and actions to above the attributes, then no warning... Given: The above gives a SQL query with
DO UPDATE SET
on all fields
Am I doing something wrong? Do actions have to be above attributes?10 replies
AEAsh Elixir
•Created by Ben RMX on 9/23/2023 in #support
GraphQL :type, prefix based on Context?
In the example docs, we have something like the following:
So, the following introspection query would return
Ticket
as a type.
So, given a totally made up hypothetical, if we had another Ash API with a resource Amusement.Parks.Ticket
, included in the same Ash GraphQL Schema... wouldn't the two Ticket
graphql names clobber each other?
So, is there a way to automatically prefix the resource with a context/api based name? To get graphql like HelpdeskSupportTicket
and AmusementParksTicket
?
Or is it up to the application developer to explicitly define type :helpdesk_support_ticket
and type :amusement_parks_ticket
?8 replies