using Application.Services.Database; using FluentValidation; namespace Application.Endpoints.Pacients.Login; public class PacientResetPasswordValidation : AbstractValidator { private readonly IPacientRepository _pacientRepository; public PacientResetPasswordValidation(IPacientRepository pacientRepository) { _pacientRepository = pacientRepository; RuleFor(x => x.Email) .NotEmpty().WithMessage("Email is required.") .EmailAddress().WithMessage("Invalid email format.") .MustAsync(BeExistingPacient).WithMessage("Pacient with this email does not exist."); RuleFor(x => x.Password) .NotEmpty().WithMessage("Password is required.") .MinimumLength(8).WithMessage("Password must be at least 8 characters long.") .MustAsync((dto, password, context, cancellationToken) => BeDifferentFromOldPassword(dto.Email, password, cancellationToken)) .WithMessage("New password cannot be the same as old password."); } private async Task BeExistingPacient(string email, CancellationToken cancellationToken) { var pacient = await _pacientRepository.FindByEmailAsync(email); return pacient != null; } private async Task BeDifferentFromOldPassword(string email, string newPassword, CancellationToken cancellationToken) { var currentPacient = await _pacientRepository.FindByEmailAsync(email); return !newPassword.Equals(currentPacient?.Password, StringComparison.Ordinal); } }