using DocumentService.Application.Common.Interfaces; using FluentValidation; using MediatR; namespace DocumentService.Application.MergePdfs; /// /// Command to merge multiple PDF documents into a single PDF. /// public record MergePdfsCommand : IRequest { /// /// PDF streams to merge. Minimum 2 required. Each must be at Position=0. /// public required IReadOnlyList PdfStreams { get; init; } /// /// Optional page ranges per PDF (null = all pages). /// Format: "1-3,5" means pages 1, 2, 3, and 5. /// If provided, array length must match PdfStreams length. /// public IReadOnlyList? PageRanges { get; init; } } /// /// Handler for MergePdfsCommand. /// Delegates PDF merge operation to infrastructure layer. /// public class MergePdfsCommandHandler(IPdfProcessor pdfProcessor) : IRequestHandler { public async Task Handle(MergePdfsCommand request, CancellationToken cancellationToken) { return await pdfProcessor.MergePdfsAsync(request.PdfStreams, request.PageRanges); } } /// /// Validator for MergePdfsCommand. /// public class MergePdfsCommandValidator : AbstractValidator { public MergePdfsCommandValidator() { RuleFor(x => x.PdfStreams) .NotNull() .WithMessage("PDF streams are required"); RuleFor(x => x.PdfStreams) .Must(streams => streams != null && streams.Count >= 2) .WithMessage("At least 2 PDF files are required for merging"); } }