Add aggregates.yaml: the full state graph for applicants/subscribers/projects/organizations
Lint and reload / lint-and-reload (push) Successful in 2s
Lint and reload / lint-and-reload (push) Successful in 2s
Portal's aggregate state machines used to be compiled Rust, duplicated across four files plus the bucket-name wiring that dispatched to them. This is now the single source of truth for what states exist, what event-type string represents each, and what transitions are legal - portal loads and validates it at boot/reload (see the paired portal change). Adding a new aggregate, or reshaping an existing one, is now a content-only change. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
bc18add801
commit
4efa26585a
@@ -0,0 +1,47 @@
|
||||
# The full state graph for every bucket that wants event-sourced,
|
||||
# CAS-protected transitions - see portal's src/aggregates/mod.rs. A
|
||||
# bucket with no entry here still works (plain KV mutate-in-place, no
|
||||
# event log). `bucket` doubles as both the KV bucket name and the
|
||||
# JetStream event-subject segment (events.<bucket>.<id>) - one name,
|
||||
# not two.
|
||||
#
|
||||
# Pages (review.yaml, subscribed.yaml, index.yaml) reference these
|
||||
# bucket names and `to:` state names by string; they never re-declare
|
||||
# the graph itself. Add a new aggregate here alone - no portal code
|
||||
# change needed.
|
||||
aggregates:
|
||||
- bucket: applicants
|
||||
initial: open
|
||||
states:
|
||||
open: { event: applied }
|
||||
invited: { event: invited }
|
||||
declined: { event: declined }
|
||||
transitions:
|
||||
open: [invited, declined]
|
||||
|
||||
- bucket: subscribers
|
||||
initial: open
|
||||
states:
|
||||
open: { event: subscribed }
|
||||
unsubscribed: { event: unsubscribed }
|
||||
transitions:
|
||||
open: [unsubscribed]
|
||||
|
||||
- bucket: projects
|
||||
initial: open
|
||||
states:
|
||||
open: { event: submitted }
|
||||
accepted: { event: accepted }
|
||||
declined: { event: declined }
|
||||
transitions:
|
||||
open: [accepted, declined]
|
||||
|
||||
- bucket: organizations
|
||||
initial: prospect
|
||||
states:
|
||||
prospect: { event: identified }
|
||||
client: { event: became_client }
|
||||
past_client: { event: churned }
|
||||
transitions:
|
||||
prospect: [client, past_client]
|
||||
client: [past_client]
|
||||
Reference in New Issue
Block a user