using DocumentService.Application.Common.DTOs;
using DocumentService.Application.ExtractZugferd;
using DocumentService.Client.Interfaces;
using DocumentService.Application.Common.DTOs.Requests;
using Microsoft.Extensions.Logging;
using System.Net.Http;
namespace DocumentService.Client.Clients;
///
/// Implementation of ZUGFeRD client (detection and extraction).
///
public class ZugferdClient(HttpClient httpClient, ILogger logger) : BaseDocumentClient(httpClient, logger), IZugferdClient
{
///
public async Task CheckAsync(Stream pdfStream, CancellationToken cancellationToken = default)
{
var result = await SendMultipartAsync(
"/api/pdf/zugferd/has-zugferd",
pdfStream,
"document.pdf",
cancellationToken);
return result ?? throw new InvalidOperationException("API returned null response");
}
///
public async Task CheckAsync(byte[] pdfBytes, CancellationToken cancellationToken = default)
{
var request = new HasZugferdRequest { Base64Pdf = ToBase64(pdfBytes) };
var result = await SendJsonAsync(
"/api/pdf/zugferd/has-zugferd",
request,
cancellationToken);
return result ?? throw new InvalidOperationException("API returned null response");
}
///
public async Task ExtractAsync(Stream pdfStream, CancellationToken cancellationToken = default)
{
// asFile=true returns the XML file directly (application/xml stream)
return await SendMultipartForStreamAsync(
"/api/pdf/zugferd/extract?asFile=true",
pdfStream,
"document.pdf",
cancellationToken);
}
///
public async Task ExtractAsync(byte[] pdfBytes, CancellationToken cancellationToken = default)
{
var request = new ExtractZugferdRequest { Base64Pdf = ToBase64(pdfBytes) };
// format=file returns the XML file directly (application/xml stream)
return await SendJsonForStreamAsync(
"/api/pdf/zugferd/extract?format=file",
request,
cancellationToken);
}
///
public async Task ExtractAsResultAsync(Stream pdfStream, CancellationToken cancellationToken = default)
{
// asFile=false returns JSON with metadata + XML content
var result = await SendMultipartAsync(
"/api/pdf/zugferd/extract?asFile=false",
pdfStream,
"document.pdf",
cancellationToken);
return result ?? throw new InvalidOperationException("API returned null response");
}
///
public async Task ExtractAsResultAsync(byte[] pdfBytes, CancellationToken cancellationToken = default)
{
var request = new ExtractZugferdRequest { Base64Pdf = ToBase64(pdfBytes) };
// format=json returns JSON with metadata + XML content
var result = await SendJsonAsync(
"/api/pdf/zugferd/extract?format=json",
request,
cancellationToken);
return result ?? throw new InvalidOperationException("API returned null response");
}
}