using MediatR; using TakeoutSaaS.Application.Identity.Commands; using TakeoutSaaS.Application.Identity.Contracts; using TakeoutSaaS.Domain.Identity.Entities; using TakeoutSaaS.Domain.Identity.Repositories; using TakeoutSaaS.Shared.Abstractions.Constants; using TakeoutSaaS.Shared.Abstractions.Exceptions; using TakeoutSaaS.Shared.Abstractions.Tenancy; namespace TakeoutSaaS.Application.Identity.Handlers; /// /// 创建角色处理器。 /// public sealed class CreateRoleCommandHandler( IRoleRepository roleRepository, ITenantProvider tenantProvider) : IRequestHandler { /// /// 处理创建角色请求。 /// /// 创建命令。 /// 取消标记。 /// 创建后的角色 DTO。 public async Task Handle(CreateRoleCommand request, CancellationToken cancellationToken) { // 1. 获取租户上下文 var tenantId = request.TenantId ?? tenantProvider.GetCurrentTenantId(); // 2. 归一化输入并校验唯一 var name = request.Name?.Trim() ?? string.Empty; var code = request.Code?.Trim() ?? string.Empty; if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(code)) { throw new BusinessException(ErrorCodes.BadRequest, "角色名称与编码不能为空"); } var exists = await roleRepository.FindByCodeAsync(code, tenantId, cancellationToken); if (exists is not null) { throw new BusinessException(ErrorCodes.Conflict, "角色编码已存在"); } // 3. 构建角色实体 var role = new Role { TenantId = tenantId, Name = name, Code = code, Description = request.Description }; // 4. 持久化 await roleRepository.AddAsync(role, cancellationToken); await roleRepository.SaveChangesAsync(cancellationToken); // 5. 返回 DTO return new RoleDto { Id = role.Id, TenantId = role.TenantId, Name = role.Name, Code = role.Code, Description = role.Description }; } }