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