using DocumentService.Application.Common.Configuration; using DocumentService.Application.Common.DTOs; using DocumentService.Application.Common.Interfaces; using MediatR; using Microsoft.Extensions.Options; namespace DocumentService.Application.HasZugferd.Queries; /// /// Query for checking if PDF contains ZUGFeRD XML attachment /// public record HasZugferdQuery : IRequest { /// /// PDF as stream (caller is responsible for disposal) /// public required Stream PdfStream { get; init; } } /// /// Handler for HasZugferdQuery /// Checks if PDF contains ZUGFeRD/Factur-X XML attachment /// public class HasZugferdQueryHandler( IPdfProcessor pdfProcessor, IOptions settings) : IRequestHandler { private readonly ZugferdSettings _settings = settings.Value; /// /// Checks if PDF contains ZUGFeRD XML and returns metadata /// public async Task Handle(HasZugferdQuery request, CancellationToken cancellationToken) { // Get all attachments var attachmentInfo = await pdfProcessor.CheckAttachmentsAsync(request.PdfStream); // Check for ZUGFeRD/Factur-X XML files using configured names and patterns var zugferdAttachment = attachmentInfo.Attachments.FirstOrDefault(a => _settings.ZugferdFileNames.Any(name => a.FileName.Equals(name, StringComparison.OrdinalIgnoreCase)) || _settings.ZugferdFileNamePatterns.Any(pattern => a.FileName.Contains(pattern, StringComparison.OrdinalIgnoreCase))); if (zugferdAttachment != null) { return new ZugferdCheckResult { HasZugferd = true, ZugferdFileName = zugferdAttachment.FileName, ZugferdFileSize = zugferdAttachment.SizeBytes, ZugferdMimeType = zugferdAttachment.MimeType }; } return new ZugferdCheckResult { HasZugferd = false }; } }