feat: 身份操作日志改造为Outbox并修正日志库连接

This commit is contained in:
2025-12-27 09:33:16 +08:00
parent 04444c6554
commit 2d09a629be
30 changed files with 1840 additions and 99 deletions

View File

@@ -4,14 +4,14 @@ using System.Text.Json;
using TakeoutSaaS.Application.Identity.Abstractions;
using TakeoutSaaS.Application.Identity.Commands;
using TakeoutSaaS.Application.Identity.Contracts;
using TakeoutSaaS.Application.Identity.Events;
using TakeoutSaaS.Application.Identity.Queries;
using TakeoutSaaS.Domain.Identity.Entities;
using TakeoutSaaS.Domain.Identity.Enums;
using TakeoutSaaS.Domain.Identity.Repositories;
using TakeoutSaaS.Domain.Tenants.Entities;
using TakeoutSaaS.Domain.Tenants.Repositories;
using TakeoutSaaS.Shared.Abstractions.Constants;
using TakeoutSaaS.Shared.Abstractions.Exceptions;
using TakeoutSaaS.Shared.Abstractions.Ids;
using TakeoutSaaS.Shared.Abstractions.Security;
using TakeoutSaaS.Shared.Abstractions.Tenancy;
@@ -28,7 +28,8 @@ public sealed class CreateIdentityUserCommandHandler(
ITenantProvider tenantProvider,
ICurrentUserAccessor currentUserAccessor,
IAdminAuthService adminAuthService,
IOperationLogRepository operationLogRepository,
IIdentityOperationLogPublisher operationLogPublisher,
IIdGenerator idGenerator,
IMediator mediator)
: IRequestHandler<CreateIdentityUserCommand, UserDetailDto>
{
@@ -85,6 +86,7 @@ public sealed class CreateIdentityUserCommandHandler(
// 6. (空行后) 创建用户实体
var user = new IdentityUser
{
Id = idGenerator.NextId(),
TenantId = tenantId,
Account = account,
DisplayName = displayName,
@@ -100,17 +102,7 @@ public sealed class CreateIdentityUserCommandHandler(
};
user.PasswordHash = passwordHasher.HashPassword(user, request.Password);
// 7. (空行后) 持久化用户
await identityUserRepository.AddAsync(user, cancellationToken);
await identityUserRepository.SaveChangesAsync(cancellationToken);
// 8. (空行后) 绑定角色
if (roleIds.Length > 0)
{
await userRoleRepository.ReplaceUserRolesAsync(tenantId, user.Id, roleIds, cancellationToken);
}
// 9. (空行后) 写入操作日志
// 7. (空行后) 构建操作日志消息
var operatorName = string.IsNullOrWhiteSpace(operatorProfile.DisplayName)
? operatorProfile.Account
: operatorProfile.DisplayName;
@@ -119,7 +111,7 @@ public sealed class CreateIdentityUserCommandHandler(
operatorName = $"user:{currentUserAccessor.UserId}";
}
var log = new OperationLog
var logMessage = new IdentityUserOperationLogMessage
{
OperationType = "identity-user:create",
TargetType = "identity_user",
@@ -138,8 +130,17 @@ public sealed class CreateIdentityUserCommandHandler(
Result = JsonSerializer.Serialize(new { userId = user.Id }),
Success = true
};
await operationLogRepository.AddAsync(log, cancellationToken);
await operationLogRepository.SaveChangesAsync(cancellationToken);
// 8. (空行后) 持久化用户并写入 Outbox
await identityUserRepository.AddAsync(user, cancellationToken);
await operationLogPublisher.PublishAsync(logMessage, cancellationToken);
await identityUserRepository.SaveChangesAsync(cancellationToken);
// 9. (空行后) 绑定角色
if (roleIds.Length > 0)
{
await userRoleRepository.ReplaceUserRolesAsync(tenantId, user.Id, roleIds, cancellationToken);
}
// 10. (空行后) 返回用户详情
var detail = await mediator.Send(new GetIdentityUserDetailQuery { UserId = user.Id }, cancellationToken);