Platform — Data & read/write tables
Platform is the "invisible" layer connecting domains. This page lists the external source entities it listens to and the data artifacts it creates. Convention: 📖 READ, ✏️ WRITE.
Related external concepts
| Concept | What it is | Role with Platform | Owning domain |
|---|---|---|---|
| Source entity (Account, Attendee, Invoice, Employee, Contact, CreditNote, Payment, etc.) | Business entities. | Publish EntityEvent when changed; Platform listens to create notification/history. | Corresponding domain |
| EntityType / EventType / EntityActionType | Enums identifying entity type & action. | Routing keys: worker routes based on them. | Platform (enum) |
| NotificationEventType | Notification type enum. | Domain notification discriminator — explicitly mapped at boundary. | Communication |
| NotificationJob / NotificationScheduler | Work to send + queue. | Output of notification post-processor → handed to Communication. | Communication |
| EntityEventScheduler | Projection schedule (Finance, etc.). | Domain handler creates to fan out projection (Platform does not touch it in history post-processor). | Finance/Booking |
| BusinessUnit | Unit. | Resolve BusinessUnitId for job/history. | Org |
Storage map
| Store | Artifact | Purpose |
|---|---|---|
| Azure Queue | entity-event-queue | Transports EntityEvent to EventHandler worker. |
| Azure Table | NotificationJob | Notification-run record (PartitionKey = entity/EventKey). |
EntityHistory | Entity audit timeline (RowKey = deterministic HistoryEventKey, upsert). | |
OutgoingMessage | (Communication) delivery state — history lookup. | |
| SQL | NotificationScheduler | Queue saying "there is notification work to process" (created by post-processor). |
AttendeeHistory (and entity-specific history) | Some SQL history by entity. | |
| Audit store | EntityEventLog | Raw event audit (separate from EntityHistory). |
⚠️
EntityHistory(Azure Table, projection) ≠EntityEventLog(raw audit) ≠BookingHistory(separate for booking). See History & observability.
Tables/artifacts in each flow
Event publish & process flow
| Step | Artifact | Purpose |
|---|---|---|
| Service publish | entity-event-queue ✏️ WRITE | Put EntityEvent on queue. |
| Worker route | (read message) 📖 READ | Route by EventTypeId. |
| Domain handler | domain tables + EntityEventScheduler ✏️ WRITE | Business projection/scheduler (outside Platform core). |
Notification post-processor flow
| Step | Artifact | Purpose |
|---|---|---|
| Map | (read event/context) 📖 READ | Mapping decides whether to create a job. |
| Dedup + write | NotificationJob ✏️ WRITE (point-read dedup by EventKey) | "1 event-derived job = 1 row". |
| Bridge | NotificationScheduler ✏️ WRITE | Enters send pipeline (Communication). |
History post-processor flow
| Step | Artifact | Purpose |
|---|---|---|
| Map | (read state/snapshot) 📖 READ | Build AddEntityToHistoryModel. |
| Snapshot | Blob ✏️ WRITE | Store summary snapshot. |
| Upsert | EntityHistory ✏️ WRITE (InsertOrReplace by deterministic RowKey) | Audit timeline; retry overwrites without duplicate. |