using DocumentOperator.Application.Common.DTOs; using DocumentOperator.Application.Features.Documents.ValidatePdf; using DocumentOperator.Domain.Models.ValueObjects; using MediatR; using Microsoft.AspNetCore.Mvc; namespace DocumentOperator.API.Endpoints.v1; /// /// Document endpoints (Minimal API) /// public static class DocumentEndpoints { /// /// Maps all document-related endpoints /// public static void MapDocumentEndpoints(this IEndpointRouteBuilder app) { var group = app.MapGroup("/api/v1/documents") .WithTags("Documents"); // POST /api/v1/documents/validate group.MapPost("/validate", ValidatePdf) .WithName("ValidatePdf") .WithSummary("Validates a PDF document and returns metadata") .WithDescription("Validates the PDF format and extracts metadata (page count, file size, PDF version, attachments)") .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status400BadRequest) .Produces(StatusCodes.Status500InternalServerError); } /// /// Validates a PDF document and returns metadata /// /// PDF as Base64 string /// MediatR instance /// Cancellation token /// PDF metadata (page count, file size, etc.) /// PDF is valid, metadata returned /// Invalid PDF or Base64 format /// Internal server error during validation private static async Task ValidatePdf( ValidatePdfRequest request, IMediator mediator, CancellationToken cancellationToken) { // DTO → Query (Value Objects erstellen - kann DomainValidationException werfen!) var query = new ValidatePdfQuery( Base64String.Create(request.Base64Pdf) ); // MediatR Handler aufrufen (ValidationBehavior → Handler) var metadata = await mediator.Send(query, cancellationToken); // PdfMetadata → Response DTO var response = new ValidatePdfResponse( metadata.PageCount, metadata.FileSizeBytes, metadata.FileSizeMB, metadata.PdfVersion, metadata.HasAttachments, metadata.AttachmentCount ); return Results.Ok(response); } }