using AutoMapper; using DocumentOperator.Application.Common.DTOs; using DocumentOperator.Application.Common.Interfaces; using MediatR; namespace DocumentOperator.Application.SwissQrCode.Queries; /// /// Query for extracting Swiss QR Code from PDF (supports both byte array and Base64 input) /// public record ExtractSwissQrCodeQuery : IRequest { /// /// PDF as byte array (direct upload) /// public byte[]? PdfBytes { get; init; } /// /// PDF as Base64 string (API clients) /// public string? Base64Pdf { get; init; } /// /// Optional reference strings (passed through to response for external tracking) /// public IReadOnlyList? References { get; init; } } /// /// Handler for ExtractSwissQrCodeQuery /// Orchestrates Swiss QR Code extraction using ISwissQrCodeProcessor and AutoMapper /// public class ExtractSwissQrCodeQueryHandler(ISwissQrCodeProcessor qrCodeProcessor, IMapper mapper) : IRequestHandler { /// /// Extracts and parses Swiss QR Code from the last page of the PDF /// public async Task Handle(ExtractSwissQrCodeQuery request, CancellationToken cancellationToken) { // Use byte[] if available, otherwise convert Base64 byte[] pdfBytes = request.PdfBytes ?? Convert.FromBase64String(request.Base64Pdf!); // Extract and parse Swiss QR Code from last page (can throw PdfProcessingException or QrCodeNotFoundException) var qrCodeData = await qrCodeProcessor.ExtractSwissQrCodeAsync(pdfBytes, cancellationToken); // Map domain value object to DTO using AutoMapper var qrCodeDto = mapper.Map(qrCodeData); // Return references (passed through) + QR code data return new SwissQrCodeExtractionResult( References: request.References ?? [], QrCodeData: qrCodeDto ); } }