From bc273c7f4f0c70f4243ca6e41ff25a0cfc8daac1 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 21 Jul 2026 10:21:10 +0200 Subject: [PATCH] feat: Add MergePdfsCommand with merged Command/Handler/Validator - Add MergePdfsCommand.cs (Vertical Slice pattern) - Command: IRequest with PdfStreams + PageRanges properties - Handler: Calls IPdfProcessor.MergePdfsAsync, uses primary constructor - Validator: Validates minimum 2 PDFs, page ranges count matches PDF count - All 3 classes in single file (Command/Handler/Validator merged) --- .../MergePdfs/MergePdfsCommand.cs | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 DocumentOperator.Application/MergePdfs/MergePdfsCommand.cs diff --git a/DocumentOperator.Application/MergePdfs/MergePdfsCommand.cs b/DocumentOperator.Application/MergePdfs/MergePdfsCommand.cs new file mode 100644 index 0000000..77c8f75 --- /dev/null +++ b/DocumentOperator.Application/MergePdfs/MergePdfsCommand.cs @@ -0,0 +1,53 @@ +using DocumentOperator.Application.Common.Interfaces; +using FluentValidation; +using MediatR; + +namespace DocumentOperator.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"); + } +}