Thank you for being patient! We're working hard on resolving the issue
This page shows how Google-backed calendar events move end to end:
:~google:...:events provider row endpointFor one Google calendar, the canonical source row key is:
:~google:{authId}:calendar:{calendarId}:events
The canonical HTTP boundary for reads and writes is:
/api/rows/:~google:{authId}:calendar:{calendarId}:events/cells
That provider row owns event state. Aggregate rows such as
calendar-list should read from constituent provider rows; they should
not become second event owners.
The diagrams below use these columns:
UI Browser UI / renderer / gesture
SDK RowHandle / events facade / aggregate list row
Row API /api/rows/:~google:{auth}:calendar:{cal}:events/cells
Server row-key resolution + event row services
Google Google Calendar API
Row Store canonical provider-row cells stored by Lona
This is the complete end-to-end path for fetching events from one Google calendar provider row.
UI SDK Row API Server Google Row Store
│ │ │ │ │ │
│ request R │ │ │ │ │
│────────────▶│ │ │ │ │
│ │ GET /cells │ │ │ │
│ │ range=R │ │ │ │
│ │─────────────▶│ │ │ │
│ │ │ resolve row │ │ │
│ │ │──────────────▶│ │ │
│ │ │ │ read local │ │
│ │ │ │ canonical │─────────────▶│
│ │ │ │ cells │ │
│ │ │ │◀─────────────│ │
│ │ │ │ │ │
│ │ │ │ if stale or │ │
│ │ │ │ missing, │ │
│ │ │ │ sync/fetch │─────────────▶│
│ │ │ │ from Google │ │
│ │ │ │◀─────────────│ events │
│ │ │ │ normalize │ │
│ │ │ │ and persist │─────────────▶│
│ │ │ │ canonical │ │
│ │ │ │ event.v1 │ │
│ │ │ │ cells │ │
│ │ │ return cells │ │ │
│ │ │◀──────────────│ │ │
│ │ decode │ │ │ │
│ │ event.v1 │ │ │ │
│ │ rebuild │ │ │ │
│ │ EventsIndex │ │ │ │
│◀────────────│ results │ │ │ │
│ │ │ │ │ │
This is the complete end-to-end path for create, update, delete, move, or copy, as long as the target is a Google provider row.
UI SDK Row API Server Google Row Store
│ │ │ │ │ │
│ mutate E │ │ │ │ │
│────────────▶│ │ │ │ │
│ │ POST /cells │ │ │ │
│ │ with event │ │ │ │
│ │ mutation │──────────────▶│ │ │
│ │ │ resolve row │ │ │
│ │ │──────────────▶│ │ │
│ │ │ │ map row key │ │
│ │ │ │ to authId + │ │
│ │ │ │ calendarId │ │
│ │ │ │ │ │
│ │ │ │ call Google │─────────────▶│
│ │ │ │ create/patch │ │
│ │ │ │ /delete/move │ │
│ │ │ │◀─────────────│ canonical │
│ │ │ │ event result │ │
│ │ │ │ normalize │ │
│ │ │ │ and persist │─────────────▶│
│ │ │ │ returned │ │
│ │ │ │ event.v1 │ │
│ │ │ │ cells │ │
│ │ │ return │ │ │
│ │ │ affected │ │ │
│ │ │ cells │◀─────────────│ │
│ │ update local │ │ │ │
│ │ row data and │ │ │ │
│ │ source index │ │ │ │
│◀────────────│ rerender │ │ │ │
│ │ │ │ │ │
This is the intended architecture for calendar-list-style reads.
UI SDK aggregate Provider row A Provider row B Provider row C
│ │ │ │ │
│ request R │ │ │ │
│────────────▶│ │ │ │
│ │ resolve │ │ │
│ │ constituents │ │ │
│ │──────────────▶│ │ │
│ │───────────────┼───────────────▶│ │
│ │───────────────┼────────────────┼───────────────▶│
│ │ fetch R │ │ │
│ │◀──────────────│ cells │ │
│ │◀──────────────┼───────────────│ cells │
│ │◀──────────────┼────────────────┼───────────────│ cells
│ │ union decoded │ │ │
│ │ results │ │ │
│◀────────────│ │ │ │
│ │ │ │ │
The aggregate row should own:
It should not own the underlying event cells.
:~google:{authId}:calendar:{calendarId}:eventsevent.v1 cells.