From 0f42cf16c5b19ad2fd44a39437b039c6e6f1334a Mon Sep 17 00:00:00 2001 From: jarvis Date: Sun, 25 Jan 2026 14:59:56 +0000 Subject: [PATCH] feat: Add domain events to Identity module Add domain events for identity-related operations: - UserRegisteredEvent: Raised when a new user registers - PasswordChangedEvent: Raised when a user changes password - UserRoleAssignedEvent: Raised when roles are assigned to a user - UserActivatedEvent: Raised when a user account is activated - UserDeactivatedEvent: Raised when a user account is deactivated - SessionRevokedEvent: Raised when a user session is revoked All events inherit from DomainEvent base record and include: - EventId, OccurredOnUtc, CorrelationId, TenantId (from base) - Relevant domain-specific data - Static factory method for convenient creation --- .../Domain/Events/PasswordChangedEvent.cs | 17 +++++++++++++++++ .../Domain/Events/SessionRevokedEvent.cs | 19 +++++++++++++++++++ .../Domain/Events/UserActivatedEvent.cs | 17 +++++++++++++++++ .../Domain/Events/UserDeactivatedEvent.cs | 18 ++++++++++++++++++ .../Domain/Events/UserRegisteredEvent.cs | 19 +++++++++++++++++++ .../Domain/Events/UserRoleAssignedEvent.cs | 17 +++++++++++++++++ 6 files changed, 107 insertions(+) create mode 100644 src/Modules/Identity/Modules.Identity/Domain/Events/PasswordChangedEvent.cs create mode 100644 src/Modules/Identity/Modules.Identity/Domain/Events/SessionRevokedEvent.cs create mode 100644 src/Modules/Identity/Modules.Identity/Domain/Events/UserActivatedEvent.cs create mode 100644 src/Modules/Identity/Modules.Identity/Domain/Events/UserDeactivatedEvent.cs create mode 100644 src/Modules/Identity/Modules.Identity/Domain/Events/UserRegisteredEvent.cs create mode 100644 src/Modules/Identity/Modules.Identity/Domain/Events/UserRoleAssignedEvent.cs diff --git a/src/Modules/Identity/Modules.Identity/Domain/Events/PasswordChangedEvent.cs b/src/Modules/Identity/Modules.Identity/Domain/Events/PasswordChangedEvent.cs new file mode 100644 index 0000000000..bedd06d16d --- /dev/null +++ b/src/Modules/Identity/Modules.Identity/Domain/Events/PasswordChangedEvent.cs @@ -0,0 +1,17 @@ +using FSH.Framework.Core.Domain; + +namespace FSH.Modules.Identity.Domain.Events; + +/// Raised when a user changes their password. +public sealed record PasswordChangedEvent( + Guid EventId, + DateTimeOffset OccurredOnUtc, + string UserId, + bool WasReset, + string? CorrelationId = null, + string? TenantId = null +) : DomainEvent(EventId, OccurredOnUtc, CorrelationId, TenantId) +{ + public static PasswordChangedEvent Create(string userId, bool wasReset = false, string? correlationId = null, string? tenantId = null) + => new(Guid.NewGuid(), DateTimeOffset.UtcNow, userId, wasReset, correlationId, tenantId); +} diff --git a/src/Modules/Identity/Modules.Identity/Domain/Events/SessionRevokedEvent.cs b/src/Modules/Identity/Modules.Identity/Domain/Events/SessionRevokedEvent.cs new file mode 100644 index 0000000000..17fb3c7aa5 --- /dev/null +++ b/src/Modules/Identity/Modules.Identity/Domain/Events/SessionRevokedEvent.cs @@ -0,0 +1,19 @@ +using FSH.Framework.Core.Domain; + +namespace FSH.Modules.Identity.Domain.Events; + +/// Raised when a user session is revoked. +public sealed record SessionRevokedEvent( + Guid EventId, + DateTimeOffset OccurredOnUtc, + string UserId, + Guid SessionId, + string? RevokedBy, + string? Reason, + string? CorrelationId = null, + string? TenantId = null +) : DomainEvent(EventId, OccurredOnUtc, CorrelationId, TenantId) +{ + public static SessionRevokedEvent Create(string userId, Guid sessionId, string? revokedBy = null, string? reason = null, string? correlationId = null, string? tenantId = null) + => new(Guid.NewGuid(), DateTimeOffset.UtcNow, userId, sessionId, revokedBy, reason, correlationId, tenantId); +} diff --git a/src/Modules/Identity/Modules.Identity/Domain/Events/UserActivatedEvent.cs b/src/Modules/Identity/Modules.Identity/Domain/Events/UserActivatedEvent.cs new file mode 100644 index 0000000000..def5227cb1 --- /dev/null +++ b/src/Modules/Identity/Modules.Identity/Domain/Events/UserActivatedEvent.cs @@ -0,0 +1,17 @@ +using FSH.Framework.Core.Domain; + +namespace FSH.Modules.Identity.Domain.Events; + +/// Raised when a user account is activated. +public sealed record UserActivatedEvent( + Guid EventId, + DateTimeOffset OccurredOnUtc, + string UserId, + string? ActivatedBy, + string? CorrelationId = null, + string? TenantId = null +) : DomainEvent(EventId, OccurredOnUtc, CorrelationId, TenantId) +{ + public static UserActivatedEvent Create(string userId, string? activatedBy = null, string? correlationId = null, string? tenantId = null) + => new(Guid.NewGuid(), DateTimeOffset.UtcNow, userId, activatedBy, correlationId, tenantId); +} diff --git a/src/Modules/Identity/Modules.Identity/Domain/Events/UserDeactivatedEvent.cs b/src/Modules/Identity/Modules.Identity/Domain/Events/UserDeactivatedEvent.cs new file mode 100644 index 0000000000..c464b04b8f --- /dev/null +++ b/src/Modules/Identity/Modules.Identity/Domain/Events/UserDeactivatedEvent.cs @@ -0,0 +1,18 @@ +using FSH.Framework.Core.Domain; + +namespace FSH.Modules.Identity.Domain.Events; + +/// Raised when a user account is deactivated. +public sealed record UserDeactivatedEvent( + Guid EventId, + DateTimeOffset OccurredOnUtc, + string UserId, + string? DeactivatedBy, + string? Reason, + string? CorrelationId = null, + string? TenantId = null +) : DomainEvent(EventId, OccurredOnUtc, CorrelationId, TenantId) +{ + public static UserDeactivatedEvent Create(string userId, string? deactivatedBy = null, string? reason = null, string? correlationId = null, string? tenantId = null) + => new(Guid.NewGuid(), DateTimeOffset.UtcNow, userId, deactivatedBy, reason, correlationId, tenantId); +} diff --git a/src/Modules/Identity/Modules.Identity/Domain/Events/UserRegisteredEvent.cs b/src/Modules/Identity/Modules.Identity/Domain/Events/UserRegisteredEvent.cs new file mode 100644 index 0000000000..ae6f11cf82 --- /dev/null +++ b/src/Modules/Identity/Modules.Identity/Domain/Events/UserRegisteredEvent.cs @@ -0,0 +1,19 @@ +using FSH.Framework.Core.Domain; + +namespace FSH.Modules.Identity.Domain.Events; + +/// Raised when a new user registers in the system. +public sealed record UserRegisteredEvent( + Guid EventId, + DateTimeOffset OccurredOnUtc, + string UserId, + string Email, + string? FirstName, + string? LastName, + string? CorrelationId = null, + string? TenantId = null +) : DomainEvent(EventId, OccurredOnUtc, CorrelationId, TenantId) +{ + public static UserRegisteredEvent Create(string userId, string email, string? firstName = null, string? lastName = null, string? correlationId = null, string? tenantId = null) + => new(Guid.NewGuid(), DateTimeOffset.UtcNow, userId, email, firstName, lastName, correlationId, tenantId); +} diff --git a/src/Modules/Identity/Modules.Identity/Domain/Events/UserRoleAssignedEvent.cs b/src/Modules/Identity/Modules.Identity/Domain/Events/UserRoleAssignedEvent.cs new file mode 100644 index 0000000000..3356b9c76d --- /dev/null +++ b/src/Modules/Identity/Modules.Identity/Domain/Events/UserRoleAssignedEvent.cs @@ -0,0 +1,17 @@ +using FSH.Framework.Core.Domain; + +namespace FSH.Modules.Identity.Domain.Events; + +/// Raised when roles are assigned to a user. +public sealed record UserRoleAssignedEvent( + Guid EventId, + DateTimeOffset OccurredOnUtc, + string UserId, + IReadOnlyList AssignedRoles, + string? CorrelationId = null, + string? TenantId = null +) : DomainEvent(EventId, OccurredOnUtc, CorrelationId, TenantId) +{ + public static UserRoleAssignedEvent Create(string userId, IEnumerable assignedRoles, string? correlationId = null, string? tenantId = null) + => new(Guid.NewGuid(), DateTimeOffset.UtcNow, userId, assignedRoles.ToList().AsReadOnly(), correlationId, tenantId); +}