feat(backend): Activate domain events for user login, role assignment, and tenant removal
Implemented domain event raising in command handlers to enable audit logging and event-driven architecture for key Identity module operations. Changes: - Updated LoginCommand to include IpAddress and UserAgent fields for audit trail - Updated AuthController to extract and pass IP address and user agent from HTTP context - Modified LoginCommandHandler to raise UserLoggedInEvent on successful login - Updated AssignUserRoleCommand to include AssignedBy field for audit purposes - Modified AssignUserRoleCommandHandler to raise UserRoleAssignedEvent with previous role tracking - Updated RemoveUserFromTenantCommand to include RemovedBy and Reason fields - Modified RemoveUserFromTenantCommandHandler to raise UserRemovedFromTenantEvent before deletion - Added domain methods to User aggregate: RecordLoginWithEvent, RaiseRoleAssignedEvent, RaiseRemovedFromTenantEvent - Updated TenantUsersController to extract current user ID from JWT claims and pass to commands Technical Details: - All event raising follows aggregate root encapsulation pattern - Domain events are persisted through repository UpdateAsync calls - Event handlers will automatically log these events for audit trail - Maintains backward compatibility with existing login flow 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -64,7 +64,14 @@ public class TenantUsersController : ControllerBase
|
||||
if (userTenantId != tenantId)
|
||||
return StatusCode(403, new { error = "Access denied: You can only manage users in your own tenant" });
|
||||
|
||||
var command = new AssignUserRoleCommand(tenantId, userId, request.Role);
|
||||
// Extract current user ID from claims
|
||||
var currentUserIdClaim = User.FindFirst("user_id")?.Value;
|
||||
if (currentUserIdClaim == null)
|
||||
return Unauthorized(new { error = "User ID not found in token" });
|
||||
|
||||
var currentUserId = Guid.Parse(currentUserIdClaim);
|
||||
|
||||
var command = new AssignUserRoleCommand(tenantId, userId, request.Role, currentUserId);
|
||||
await _mediator.Send(command);
|
||||
return Ok(new { Message = "Role assigned successfully" });
|
||||
}
|
||||
@@ -87,7 +94,14 @@ public class TenantUsersController : ControllerBase
|
||||
if (userTenantId != tenantId)
|
||||
return StatusCode(403, new { error = "Access denied: You can only manage users in your own tenant" });
|
||||
|
||||
var command = new RemoveUserFromTenantCommand(tenantId, userId);
|
||||
// Extract current user ID from claims
|
||||
var currentUserIdClaim = User.FindFirst("user_id")?.Value;
|
||||
if (currentUserIdClaim == null)
|
||||
return Unauthorized(new { error = "User ID not found in token" });
|
||||
|
||||
var currentUserId = Guid.Parse(currentUserIdClaim);
|
||||
|
||||
var command = new RemoveUserFromTenantCommand(tenantId, userId, currentUserId, null);
|
||||
await _mediator.Send(command);
|
||||
return Ok(new { Message = "User removed from tenant successfully" });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user