Relocated the `WorkflowsClientExtensions` class from `WorkflowsClient.cs` to `IWorkflowsClient.cs` to improve discoverability by defining it alongside the `IWorkflowsClient` interface. The `InspectSwissQrCodeAsync` extension method was moved as part of this change. Its functionality remains unchanged, as it still opens a `FileStream` for the provided file path and delegates to the `IWorkflowsClient.InspectSwissQrCodeAsync(Stream, bool, CancellationToken)` method.
71 lines
3.3 KiB
C#
71 lines
3.3 KiB
C#
using DocumentService.Application.Common.DTOs;
|
||
using DocumentService.Client.Models.Results;
|
||
|
||
namespace DocumentService.Client.Interfaces;
|
||
|
||
/// <summary>
|
||
/// Orchestrated multi-step workflows that combine multiple DocumentService operations into
|
||
/// a single, higher-level call. Prefer these over manually chaining individual clients.
|
||
/// </summary>
|
||
public interface IWorkflowsClient
|
||
{
|
||
/// <summary>
|
||
/// Validates the PDF and attempts Swiss QR Code extraction in a single call,
|
||
/// returning both results together. The method never throws on invalid documents –
|
||
/// the caller receives the full <see cref="PdfValidationResult"/> regardless of outcome,
|
||
/// enabling detailed logging, diagnostics, or batch processing without try/catch.
|
||
/// </summary>
|
||
/// <param name="pdfBytes">PDF file as byte array.</param>
|
||
/// <param name="raw">
|
||
/// <c>false</c> (default) – returns a parsed <see cref="SwissQrCodeExtractionResult.Bill"/> object.<br/>
|
||
/// <c>true</c> – returns raw QR text lines without parsing.
|
||
/// </param>
|
||
/// <param name="cancellationToken">Cancellation token.</param>
|
||
/// <returns>
|
||
/// A <see cref="SwissQrCodeResult"/> containing the <see cref="PdfValidationResult"/>
|
||
/// (always populated) and the <see cref="SwissQrCodeExtractionResult"/> (<c>null</c> if the
|
||
/// document was invalid).
|
||
/// </returns>
|
||
Task<SwissQrCodeResult> InspectSwissQrCodeAsync(
|
||
byte[] pdfBytes,
|
||
bool raw = false,
|
||
CancellationToken cancellationToken = default);
|
||
|
||
/// <inheritdoc cref="InspectSwissQrCodeAsync(byte[], bool, CancellationToken)"/>
|
||
/// <param name="pdfStream">PDF file as a stream.</param>
|
||
/// <param name="raw"><inheritdoc cref="InspectSwissQrCodeAsync(byte[], bool, CancellationToken)" path="/param[@name=''raw'']"/></param>
|
||
/// <param name="cancellationToken">Cancellation token.</param>
|
||
Task<SwissQrCodeResult> InspectSwissQrCodeAsync(
|
||
Stream pdfStream,
|
||
bool raw = false,
|
||
CancellationToken cancellationToken = default);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Convenience extensions for <see cref="IWorkflowsClient"/> that accept a file path as input.
|
||
/// Defined alongside <see cref="IWorkflowsClient"/> so they are discoverable without an additional using directive.
|
||
/// </summary>
|
||
public static class WorkflowsClientExtensions
|
||
{
|
||
/// <summary>
|
||
/// Validates the PDF at <paramref name="filePath"/> and attempts Swiss QR Code extraction
|
||
/// in a single call. Opens a <see cref="FileStream"/> and delegates to
|
||
/// <see cref="IWorkflowsClient.InspectSwissQrCodeAsync(Stream, bool, CancellationToken)"/>.
|
||
/// </summary>
|
||
/// <param name="client">The workflows client.</param>
|
||
/// <param name="filePath">Absolute or relative path to the PDF file.</param>
|
||
/// <param name="raw">
|
||
/// <c>false</c> (default) – returns a parsed Bill object.<br/>
|
||
/// <c>true</c> – returns raw QR text lines without parsing.
|
||
/// </param>
|
||
/// <param name="cancellationToken">Cancellation token.</param>
|
||
public static async Task<SwissQrCodeResult> InspectSwissQrCodeAsync(
|
||
this IWorkflowsClient client,
|
||
string filePath,
|
||
bool raw = false,
|
||
CancellationToken cancellationToken = default)
|
||
{
|
||
using var stream = File.OpenRead(filePath);
|
||
return await client.InspectSwissQrCodeAsync(stream, raw, cancellationToken);
|
||
}
|
||
} |