using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using MediatR;
using CellularManagement.Domain.Entities;
using CellularManagement.Domain.Repositories;
using CellularManagement.Domain.Common;
using System.Threading.Tasks;
using System.Threading;
using System;
using System.Linq;
namespace CellularManagement.Application.Features.Users.Commands.CreateUser;
///
/// 创建用户命令处理器
/// 处理创建新用户的业务逻辑
///
public sealed class CreateUserCommandHandler : IRequestHandler>
{
private readonly UserManager _userManager;
private readonly ILogger _logger;
private readonly IUnitOfWork _unitOfWork;
///
/// 构造函数
///
/// 用户管理器,用于管理用户身份
/// 日志记录器
/// 工作单元,用于事务管理
public CreateUserCommandHandler(
UserManager userManager,
ILogger logger,
IUnitOfWork unitOfWork)
{
_userManager = userManager;
_logger = logger;
_unitOfWork = unitOfWork;
}
///
/// 处理创建用户命令
///
/// 创建用户命令
/// 取消令牌
/// 操作结果,包含创建的用户ID
public async Task> Handle(
CreateUserCommand request,
CancellationToken cancellationToken)
{
try
{
// 检查用户是否已存在
var existingUser = await _userManager.FindByEmailAsync(request.Email);
if (existingUser != null)
{
_logger.LogWarning("用户邮箱 {Email} 已存在", request.Email);
return OperationResult.CreateFailure("用户已存在");
}
// 创建新用户
var user = new AppUser
{
UserName = request.UserName,
Email = request.Email,
PhoneNumber = request.PhoneNumber
};
// 在事务中创建用户
await _unitOfWork.ExecuteTransactionAsync(async () =>
{
var result = await _userManager.CreateAsync(user, request.Password);
if (!result.Succeeded)
{
var errors = result.Errors.Select(e => e.Description).ToList();
_logger.LogWarning("创建用户失败: {Errors}", string.Join(", ", errors));
throw new InvalidOperationException(string.Join(", ", errors));
}
}, cancellationToken: cancellationToken);
_logger.LogInformation("用户 {UserId} 创建成功", user.Id);
return OperationResult.CreateSuccess(
new CreateUserResponse(user.Id));
}
catch (Exception ex)
{
_logger.LogError(ex, "创建用户时发生错误");
_logger.LogError(ex, "Error creating user");
return OperationResult.CreateFailure("Failed to create user");
}
}
}