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; } } /// /// 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 PDF (default: scans all pages starting with last) /// Returns both parsed Bill DTO and raw QR text lines /// public async Task Handle(ExtractSwissQrCodeQuery request, CancellationToken cancellationToken) { // Use byte[] if available, otherwise convert Base64 byte[] pdfBytes = request.PdfBytes ?? Convert.FromBase64String(request.Base64Pdf!); // Extract: returns (Bill, RawLines) var (bill, rawLines) = await qrCodeProcessor.ExtractSwissQrCodeAsync(pdfBytes, pageNumbers: null, cancellationToken); // Map Codecrete Bill to DTO using AutoMapper var billDto = mapper.Map(bill); // Return references (passed through) + Bill DTO + raw lines return new SwissQrCodeExtractionResult( Bill: billDto, RawLines: rawLines ); } }