Add complete domain events dispatching infrastructure and critical event handlers for Identity module. Changes: - Added IMediator injection to IdentityDbContext - Implemented SaveChangesAsync override to dispatch domain events before persisting - Made DomainEvent base class implement INotification (added MediatR.Contracts dependency) - Created 3 new domain events: UserRoleAssignedEvent, UserRemovedFromTenantEvent, UserLoggedInEvent - Implemented 4 event handlers with structured logging: - UserRoleAssignedEventHandler (audit log, cache invalidation placeholder) - UserRemovedFromTenantEventHandler (notification placeholder) - UserLoggedInEventHandler (login tracking placeholder) - TenantCreatedEventHandler (welcome email placeholder) - Updated unit tests to inject mock IMediator into IdentityDbContext Technical Details: - Domain events are now published via MediatR within the same transaction - Events are dispatched BEFORE SaveChangesAsync to ensure atomicity - Event handlers auto-registered by MediatR assembly scanning - All handlers include structured logging for observability Next Steps (Phase 3): - Update command handlers to raise new events (UserLoggedInEvent, UserRoleAssignedEvent) - Add event raising logic to User/Tenant aggregates - Implement audit logging persistence (currently just logging) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
31 lines
1001 B
C#
31 lines
1001 B
C#
using ColaFlow.Modules.Identity.Domain.Aggregates.Users.Events;
|
|
using MediatR;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace ColaFlow.Modules.Identity.Application.EventHandlers;
|
|
|
|
public sealed class UserRemovedFromTenantEventHandler : INotificationHandler<UserRemovedFromTenantEvent>
|
|
{
|
|
private readonly ILogger<UserRemovedFromTenantEventHandler> _logger;
|
|
|
|
public UserRemovedFromTenantEventHandler(ILogger<UserRemovedFromTenantEventHandler> logger)
|
|
{
|
|
_logger = logger;
|
|
}
|
|
|
|
public Task Handle(UserRemovedFromTenantEvent notification, CancellationToken cancellationToken)
|
|
{
|
|
_logger.LogInformation(
|
|
"User {UserId} removed from tenant {TenantId}. Removed by: {RemovedBy}. Reason: {Reason}",
|
|
notification.UserId,
|
|
notification.TenantId.Value,
|
|
notification.RemovedBy,
|
|
notification.Reason);
|
|
|
|
// Future: Send notification to user
|
|
// Future: Audit log
|
|
|
|
return Task.CompletedTask;
|
|
}
|
|
}
|