Event Catalog

Event Catalog

All domain events in the system. Updated when modules are designed or implemented.

Format

Event: {EventClassName}
Topic: {module}.{entity}.{action}
Version: {n}
Emitter: {Module/Aggregate}
Consumers: [{list of consuming modules}]
Payload:
  - field: type — description

Organization Context

Event: OrganizationCreated
Topic: organization.organization.created
Version: 1
Emitter: Module/Organization → Organization
Consumers: [People (read model), Groups, Events, News, Search, Audit]
Payload:
  - tenantId: TenantId
  - organizationId: OrganizationId
  - parentId: OrganizationId | null
  - type: OrgTypeKey
  - name: string
  - path: string (ltree path)
Event: OrganizationRenamed
Topic: organization.organization.renamed
Version: 1
Emitter: Module/Organization → Organization
Consumers: [Search, Audit]
Payload:
  - organizationId: OrganizationId
  - oldName: string
  - newName: string
Event: OrganizationMoved
Topic: organization.organization.moved
Version: 1
Emitter: Module/Organization → Organization
Consumers: [People, Groups, Events, News, Search, Audit]
Payload:
  - organizationId: OrganizationId
  - oldParentId: OrganizationId
  - newParentId: OrganizationId
  - oldPath: string
  - newPath: string
Event: OrganizationArchived
Topic: organization.organization.archived
Version: 1
Emitter: Module/Organization → Organization
Consumers: [People, Groups, Events, News, Search, Audit]
Payload:
  - organizationId: OrganizationId
Event: OrganizationSettingsChanged
Topic: organization.organization.settings_changed
Version: 1
Emitter: Module/Organization → Organization
Consumers: [Audit]
Payload:
  - organizationId: OrganizationId
  - changedFields: string[]

Identity / People Context

Event: UserRegistered
Topic: identity.user.registered
Version: 1
Emitter: Core/Identity → User
Consumers: [Organization (member count), Groups, Search, Audit, Notifications]
Payload:
  - tenantId: TenantId
  - userId: UserId
  - organizationId: OrganizationId
  - email: string
Event: UserProfileUpdated
Topic: identity.user.profile_updated
Version: 1
Emitter: Core/Identity → User
Consumers: [Search, Audit]
Payload:
  - userId: UserId
  - changedFields: string[]
Event: UserJoinedOrganization
Topic: identity.user.joined_organization
Version: 1
Emitter: Core/Identity → User
Consumers: [Organization (member count), Groups, News, Audit]
Payload:
  - userId: UserId
  - organizationId: OrganizationId
  - role: OrgRole
Event: UserLeftOrganization
Topic: identity.user.left_organization
Version: 1
Emitter: Core/Identity → User
Consumers: [Organization (member count), Groups, News, Audit]
Payload:
  - userId: UserId
  - organizationId: OrganizationId
Event: UserRoleChanged
Topic: identity.user.role_changed
Version: 1
Emitter: Core/Identity → User
Consumers: [Audit, Notifications]
Payload:
  - userId: UserId
  - organizationId: OrganizationId
  - oldRole: OrgRole
  - newRole: OrgRole
Event: UserSuspended
Topic: identity.user.suspended
Version: 1
Emitter: Core/Identity → User
Consumers: [Groups, Events, Audit, Notifications]
Payload:
  - userId: UserId
  - reason: string
Event: UserDeleted
Topic: identity.user.deleted
Version: 1
Emitter: Core/Identity → User
Consumers: [Groups (remove memberships), Events (cancel RSVPs), News, Chat, Search, Audit]
Payload:
  - userId: UserId
  - tenantId: TenantId
  Note: triggers GDPR cascade within THIS tenant only
Event: UserPrivacySettingsChanged
Topic: identity.user.privacy_settings_changed
Version: 1
Emitter: Core/Identity → User
Consumers: [Search (re-index visibility), Audit]
Payload:
  - userId: UserId
  - changes: object

Community Context (Groups)

Event: GroupCreated
Topic: community.group.created
Version: 1
Emitter: Module/Groups → Group
Consumers: [Search, Audit, Notifications]
Payload:
  - tenantId: TenantId
  - organizationId: OrganizationId
  - groupId: GroupId
  - parentGroupId: GroupId | null
  - type: GroupTypeKey
  - name: string
Event: GroupUpdated
Topic: community.group.updated
Version: 1
Emitter: Module/Groups → Group
Consumers: [Search, Audit]
Payload:
  - groupId: GroupId
  - changedFields: string[]
Event: GroupArchived
Topic: community.group.archived
Version: 1
Emitter: Module/Groups → Group
Consumers: [Search, Events, Audit]
Payload:
  - groupId: GroupId
Event: UserJoinedGroup
Topic: community.group.user_joined
Version: 1
Emitter: Module/Groups → Group
Consumers: [Notifications, Search, Audit]
Payload:
  - groupId: GroupId
  - userId: UserId
  - role: GroupRole
Event: UserLeftGroup
Topic: community.group.user_left
Version: 1
Emitter: Module/Groups → Group
Consumers: [Notifications, Audit]
Payload:
  - groupId: GroupId
  - userId: UserId
Event: GroupRoleChanged
Topic: community.group.role_changed
Version: 1
Emitter: Module/Groups → Group
Consumers: [Notifications, Audit]
Payload:
  - groupId: GroupId
  - userId: UserId
  - oldRole: GroupRole
  - newRole: GroupRole
Event: GroupMembershipRequested
Topic: community.group.membership_requested
Version: 1
Emitter: Module/Groups → Group
Consumers: [Notifications (notify leaders), Audit]
Payload:
  - groupId: GroupId
  - userId: UserId
Event: GroupMembershipApproved
Topic: community.group.membership_approved
Version: 1
Emitter: Module/Groups → Group
Consumers: [Notifications, Audit]
Payload:
  - groupId: GroupId
  - userId: UserId
  - approvedBy: UserId
Event: GroupMovedToOrganization
Topic: community.group.moved_to_organization
Version: 1
Emitter: Module/Groups → Group
Consumers: [Events, Search, Audit]
Payload:
  - groupId: GroupId
  - oldOrganizationId: OrganizationId
  - newOrganizationId: OrganizationId

Activity Context (Events)

Event: EventCreated
Topic: activity.event.created
Version: 1
Emitter: Module/Events → Event
Consumers: [Search, Notifications, Audit]
Payload:
  - tenantId: TenantId
  - organizationId: OrganizationId
  - groupId: GroupId | null
  - eventId: EventId
  - type: EventTypeKey
  - title: string
  - startAt: DateTime
Event: EventUpdated
Topic: activity.event.updated
Version: 1
Emitter: Module/Events → Event
Consumers: [Search, Notifications (if date/location changed), Audit]
Payload:
  - eventId: EventId
  - changedFields: string[]
Event: EventCancelled
Topic: activity.event.cancelled
Version: 1
Emitter: Module/Events → Event
Consumers: [Notifications (notify all RSVPs), Search, Audit]
Payload:
  - eventId: EventId
  - reason: string | null
Event: EventPublished
Topic: activity.event.published
Version: 1
Emitter: Module/Events → Event
Consumers: [Notifications, News (auto-post), Search, Audit]
Payload:
  - eventId: EventId
Event: UserRSVPd
Topic: activity.event.user_rsvpd
Version: 1
Emitter: Module/Events → Event
Consumers: [Notifications, Audit]
Payload:
  - eventId: EventId
  - userId: UserId
  - status: RSVPStatus (attending | maybe | declined | waitlisted)
  - occurrenceDate: Date | null
Event: UserCancelledRSVP
Topic: activity.event.user_cancelled_rsvp
Version: 1
Emitter: Module/Events → Event
Consumers: [Notifications (if waitlist, promote next), Audit]
Payload:
  - eventId: EventId
  - userId: UserId
  - occurrenceDate: Date | null
Event: EventCapacityReached
Topic: activity.event.capacity_reached
Version: 1
Emitter: Module/Events → Event
Consumers: [Notifications (notify organizers), Audit]
Payload:
  - eventId: EventId

Tenant Lifecycle Events

Event: TenantCreated
Topic: platform.tenant.created
Version: 1
Emitter: Core/Identity → Tenant
Consumers: [Audit, Billing]
Payload:
  - tenantId: TenantId
  - type: TenantType
  - lifecycle: permanent | temporary
  - parentTenantId: TenantId | null
Event: TenantBrandingChanged
Topic: platform.tenant.branding_changed
Version: 1
Emitter: Core/Identity → Tenant
Consumers: [Audit]
Payload:
  - tenantId: TenantId
Event: TenantModuleToggled
Topic: platform.tenant.module_toggled
Version: 1
Emitter: Core/Identity → Tenant
Consumers: [Audit]
Payload:
  - tenantId: TenantId
  - moduleId: string
  - enabled: boolean
[DEFERRED] Event: TenantSubscriptionChanged
— Deferred until billing module is designed. Billing will support per-org billing
  (e.g., ICF Basel pays separately from ICF Zürich within the same tenant).
  See ADR 016.
Event: OrgMigratedToTenant
Topic: platform.organization.migrated_to_tenant
Version: 1
Emitter: Module/Organization (superadmin operation)
Consumers: [Groups, Events, News, People, Audit, History]
Payload:
  - organizationId: OrganizationId
  - sourceTenantId: TenantId
  - targetTenantId: TenantId
  - affectedOrgIds: OrganizationId[] (subtree)
  - affectedUserCount: int
  - userConflicts: int (users merged into existing target Users)
Event: TenantArchived
Topic: platform.tenant.archived
Version: 1
Emitter: Core/Identity → Tenant
Consumers: [All modules (disable access), Audit]
Payload:
  - tenantId: TenantId
  - retentionUntil: DateTime
Event: TenantPurged
Topic: platform.tenant.purged
Version: 1
Emitter: Core/Identity → Tenant
Consumers: [All modules (delete data), Audit]
Payload:
  - tenantId: TenantId