using AutoMapper; using DocumentService.Application.Common.DTOs; using DocumentService.Application.Common.Interfaces; using MediatR; namespace DocumentService.Application.SwissQrCode.Queries; /// /// Query for extracting Swiss QR Code from PDF (Stream-based) /// public record ExtractSwissQrCodeQuery : IRequest { /// /// PDF as stream (caller is responsible for disposal) /// public required Stream PdfStream { 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) { // Extract: returns (Bill, RawLines) - pass stream directly var (bill, rawLines) = await qrCodeProcessor.ExtractSwissQrCodeAsync(request.PdfStream, 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 ); } }