using FluentValidation; namespace DocumentOperator.Application.CheckPdfAttachments.Queries; /// /// Validator for CheckPdfAttachmentsQuery /// Ensures exactly one input type (PdfBytes OR Base64Pdf) is provided /// public class CheckPdfAttachmentsQueryValidator : AbstractValidator { public CheckPdfAttachmentsQueryValidator() { // Rule 1: Exactly ONE input must be provided (XOR logic) RuleFor(x => x) .Must(x => (x.PdfBytes != null && x.PdfBytes.Length > 0) ^ (!string.IsNullOrWhiteSpace(x.Base64Pdf))) .WithMessage("Either PdfBytes or Base64Pdf must be provided, but not both"); // Rule 2: Base64 format validation (if provided) RuleFor(x => x.Base64Pdf) .Must(BeValidBase64) .When(x => !string.IsNullOrWhiteSpace(x.Base64Pdf)) .WithMessage("Base64Pdf must be a valid Base64 string"); } /// /// Validates if a string is a valid Base64 format /// private bool BeValidBase64(string? base64) { if (string.IsNullOrWhiteSpace(base64)) return true; // Skip validation if null/empty (handled by Rule 1) try { Convert.FromBase64String(base64); return true; } catch (FormatException) { return false; } } }