TorbatYar/docs/architecture/event-driven-architecture.md
Mortezakoohjani a483b47369 feat(workspace): complete production workspace and content operations
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-12 11:54:17 +03:30

1.3 KiB

Event-Driven Architecture

Envelope

All events use shared.events.EventEnvelope:

{
  "event_id": "uuid",
  "event_type": "tenant.created",
  "aggregate_type": "tenant",
  "aggregate_id": "uuid",
  "tenant_id": "uuid|null",
  "source_service": "core-service",
  "payload": {},
  "occurred_at": "ISO-8601"
}

Outbox → Inbox (ADR-006)

  1. Producer writes business row + outbox_events in one transaction.
  2. Worker (process_outbox_events) publishes pending rows.
  3. Consumer inserts inbox_events keyed by event_id (idempotency) then handles payload.

Naming

{aggregate}.{past_tense_verb} — e.g. tenant.created, subscription.updated, user.registered.

Torbat Workspace publishes workspace.* only (ADR-024). Do not emit work-management events as experience.workspace.* or payment.workspace.*.

Catalog

Canonical list → event-catalog.md

Future

Replace in-process/Celery-only publish with a real message bus without changing envelope or outbox ownership.