using Domain.Exceptions; using Features.Auth.Dtos; using Features.Auth.Identity; using MediatR; using Microsoft.AspNetCore.Identity; namespace Features.Auth.Commands.Account.UpdateEmail; /// /// Handles via . /// also resets EmailConfirmed to /// , so the user must re-confirm the new address (see /// Features.Users.Commands.ResendConfirmationEmail). /// public class UpdateEmailHandler(UserManager userManager) : IRequestHandler { /// Thrown when the account does not exist. /// Thrown when the requested email address is already in use. public async Task Handle( UpdateEmailCommand request, CancellationToken cancellationToken ) { ApplicationUser user = await userManager.FindByIdAsync(request.UserAccountId.ToString()) ?? throw new NotFoundException("User account not found"); IdentityResult result = await userManager.SetEmailAsync(user, request.NewEmail); if (!result.Succeeded) { if (result.Errors.Any(e => e.Code == "DuplicateEmail")) throw new ConflictException("Email address already exists"); throw new ConflictException( string.Join("; ", result.Errors.Select(e => e.Description)) ); } return new UpdateEmailPayload(user.Id, user.Email, user.EmailConfirmed); } }