using Events.WebAPI.Contract.Command; using Events.WebAPI.Contract.DTOs; using Events.WebAPI.Contract.Validation; using FluentValidation; using MediatR; namespace Events.WebAPI.Contract.Validation.Person; public class UpdatePersonValidator : AbstractValidator> { public UpdatePersonValidator(IMediator mediator, IValidationMessageProvider validationMessageProvider) { var uniqueIndexValidator = new UniqueIndexValidator( mediator, (_, _) => validationMessageProvider.UniquePersonDocumentAndCountry(), t => t.DocumentNumber, t => t.CountryCode); RuleFor(a => a.Dto.FirstName).NotEmpty().MaximumLength(100); RuleFor(a => a.Dto.LastName).NotEmpty().MaximumLength(100); RuleFor(a => a.Dto.FirstNameTranscription).NotEmpty().MaximumLength(100); RuleFor(a => a.Dto.LastNameTranscription).NotEmpty().MaximumLength(100); RuleFor(a => a.Dto.AddressLine).NotEmpty().MaximumLength(200); RuleFor(a => a.Dto.PostalCode).NotEmpty().MaximumLength(20); RuleFor(a => a.Dto.City).NotEmpty().MaximumLength(100); RuleFor(a => a.Dto.AddressCountry).NotEmpty().MaximumLength(100); When(a => !string.IsNullOrWhiteSpace(a.Dto.Email), () => { RuleFor(a => a.Dto.Email).MaximumLength(255).EmailAddress(); }); RuleFor(a => a.Dto.ContactPhone).MaximumLength(50); RuleFor(a => a.Dto.BirthDate).NotEmpty(); RuleFor(a => a.Dto.DocumentNumber).NotEmpty().MaximumLength(50); RuleFor(a => a.Dto.CountryCode).NotEmpty().MaximumLength(3); ValidationMessage emailOrContactPhoneRequired = validationMessageProvider.PersonEmailOrContactPhoneRequired(); RuleFor(a => a.Dto) .Must(dto => !string.IsNullOrWhiteSpace(dto.Email) || !string.IsNullOrWhiteSpace(dto.ContactPhone)) .WithMessage(emailOrContactPhoneRequired.Message) .WithErrorCode(emailOrContactPhoneRequired.Code); RuleFor(a => a.Dto).CustomAsync(uniqueIndexValidator.ValidateExisting); } }