using MediatR;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using IamService.Domain.AggregatesModel.UserAggregate;
using IamService.Domain.Events;
namespace IamService.API.Application.Commands.Auth;
///
/// EN: Handler for RegisterUserCommand.
/// VI: Handler cho RegisterUserCommand.
///
public class RegisterUserCommandHandler : IRequestHandler
{
private readonly UserManager _userManager;
private readonly ILogger _logger;
public RegisterUserCommandHandler(
UserManager userManager,
ILogger logger)
{
_userManager = userManager ?? throw new ArgumentNullException(nameof(userManager));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public async Task Handle(
RegisterUserCommand request,
CancellationToken cancellationToken)
{
_logger.LogInformation(
"Registering new user with email {Email}",
request.Email);
// EN: Check if user already exists
// VI: Kiểm tra xem user đã tồn tại chưa
var existingUser = await _userManager.FindByEmailAsync(request.Email);
if (existingUser != null)
{
_logger.LogWarning("User with email {Email} already exists", request.Email);
throw new InvalidOperationException($"User with email {request.Email} already exists");
}
// EN: Create new user
// VI: Tạo user mới
var user = new ApplicationUser(request.Email, request.FirstName, request.LastName);
// EN: Add domain event
// VI: Thêm domain event
user.AddDomainEvent(new UserRegisteredDomainEvent(user));
// EN: Create user with password
// VI: Tạo user với password
var result = await _userManager.CreateAsync(user, request.Password);
if (!result.Succeeded)
{
var errors = string.Join(", ", result.Errors.Select(e => e.Description));
_logger.LogWarning("Failed to create user: {Errors}", errors);
throw new InvalidOperationException($"Failed to create user: {errors}");
}
_logger.LogInformation(
"Successfully registered user {UserId} with email {Email}",
user.Id, user.Email);
return new RegisterUserCommandResult(
user.Id,
user.Email!,
user.FullName);
}
}