using Domain.Entities; using Features.Auth.Repository; using Features.Auth.Services; using MediatR; using Shared.Application.Emails; namespace Features.Auth.Commands.ResendConfirmationEmail; /// /// Handles by generating a fresh confirmation token and /// sending it via Features.Emails. /// /// Repository used to look up the user and check verification status. /// Service used to generate the confirmation token. /// Used to send the cross-slice command that triggers the email. /// /// Returns silently without sending an email if the user does not exist (to prevent user enumeration) /// or if the user's account is already verified. /// public class ResendConfirmationEmailHandler( IAuthRepository authRepository, ITokenService tokenService, IMediator mediator ) : IRequestHandler { public async Task Handle(ResendConfirmationEmailCommand request, CancellationToken cancellationToken) { UserAccount? user = await authRepository.GetUserByIdAsync(request.UserId); if (user == null) return; // Silent return to prevent user enumeration if (await authRepository.IsUserVerifiedAsync(request.UserId)) return; // Already confirmed, no-op string confirmationToken = tokenService.GenerateConfirmationToken(user); await mediator.Send( new SendResendConfirmationEmailCommand(user.FirstName, user.Email, confirmationToken), cancellationToken ); } }