d4107f6f89
feat(api): Add annotation endpoints to PdfOperationsController
...
- Add POST /api/pdf/operations/annotate (multipart/form-data)
- Add POST /api/pdf/operations/annotate (application/json with Base64)
- Create AddAnnotationMultipartRequest DTO (wrapper for 10+ form parameters)
- Create AddAnnotationBase64Command DTO (Base64 PDF + annotation parameters)
- Add unique operation names (AnnotateFromFile, AnnotateFromBase64) for Swagger
- Rename MergePdfsRequest -> MergePdfsBase64Request for clarity
- Add Name attributes to merge endpoints (MergeFromFiles, MergeFromBase64) to fix Swagger conflict
- Base64 FormatException wrapped in BadRequestException
2026-07-21 12:28:43 +02:00
5c3fafff1b
feat: Add PdfOperationsController with dual-input merge endpoints
...
- Add PdfOperationsController.cs with route '/api/pdf/operations'
- MergeFromFiles: POST /merge (multipart/form-data) - accepts List<IFormFile>
- MergeFromBase64: POST /merge (application/json) - accepts MergePdfsRequest DTO
- Returns merged PDF as FileContentResult (application/pdf)
- Supports optional page ranges via JSON endpoint only (multipart binding complex)
- XML documentation with response codes (200, 400, 500)
- Uses primary constructor pattern
2026-07-21 10:21:27 +02:00
34e38f19e5
feat: Add PdfAttachmentController extract endpoints (multipart + Base64)
2026-07-21 09:26:34 +02:00
b4befde418
refactor(api): migrate controllers to Stream API with Base64 validation
...
PdfValidationController:
- ValidateFromFile: IFormFile.OpenReadStream() direct usage (no byte[] copy)
- ValidateFromBase64: try-catch Convert.FromBase64String → BadRequestException
- ValidatePdfAFromFile: IFormFile.OpenReadStream() direct usage
- ValidatePdfAFromBase64: try-catch Convert.FromBase64String → BadRequestException
PdfAttachmentController:
- CheckAttachmentsFromBase64: try-catch Convert.FromBase64String → BadRequestException
SwissQrCodeController:
- ExtractFromBase64: try-catch Convert.FromBase64String → BadRequestException
All controllers: Add using DocumentOperator.Domain.Common.Exceptions for BadRequestException
2026-07-20 16:32:03 +02:00
9db15f7025
feat: Add PdfAttachmentController with CheckAttachments endpoints
...
- Add POST /api/pdf/attachments/check endpoint (multipart/form-data)
- Add POST /api/pdf/attachments/check endpoint (application/json with Base64)
- Dual input support: IFormFile (file upload) and Base64 JSON
- Controller converts IFormFile → byte[] and sends to MediatR
- Complete XML documentation with Swagger examples
- Primary constructor pattern used
2026-07-20 11:56:12 +02:00
4085a88485
Update XML docs for raw param in SwissQrCodeController
...
Removed detailed description of the `raw` parameter in XML
documentation for two methods in `SwissQrCodeController`.
Updated `<returns>` tag to simplify the explanation by
removing conditional details based on the `raw` parameter.
These changes affect methods handling multipart/form-data
PDF input and Base64 JSON input.
2026-07-20 10:51:30 +02:00
a315fbf890
feat: Add raw parameter to SwissQrCodeController endpoints
...
- Add 'raw' query parameter to both ExtractFromFile and ExtractFromBase64 methods
- Returns raw QR text lines when raw=true, parsed Bill object when raw=false (default)
- Remove obsolete 'references' parameter (not part of QR extraction logic)
- Add XML documentation for raw parameter
- Update ExceptionHandlingMiddleware to handle BadRequestException
2026-07-16 15:48:09 +02:00
cd50d45bd5
feat: Add PDF/A validation endpoint (Feature 3)
...
Domain layer:
- PdfAMetadata value object (isValid, pdfVersion, pageCount, encrypted, pdfaVersion, pdfaCompliant, errors, warnings)
Infrastructure layer:
- IPdfProcessor.ValidatePdfAAsync() interface method
- DevExpressPdfProcessor.ValidatePdfAAsync() implementation
- DetectEncryption() - scans PDF raw data for /Encrypt keyword
- DetectPdfAConformance() - parses XMP metadata (pdfaid:part, pdfaid:conformance)
- Validation: encrypted PDF cannot be PDF/A compliant
Application layer:
- ValidatePdfAQuery + ValidatePdfAQueryHandler (co-located)
- ValidatePdfAQueryValidator (FluentValidation: PdfBytes XOR Base64Pdf)
- PdfAValidationResult DTO
- AutoMapper: PdfAMetadata -> PdfAValidationResult
API layer:
- PdfValidationController.ValidatePdfAFromFile() (multipart/form-data)
- PdfValidationController.ValidatePdfAFromBase64() (application/json)
- XML documentation with response codes
Result:
- POST /api/pdf/validation/validate-pdfa (both multipart and JSON)
- Returns: conformance level, errors, warnings
- Build: 0 errors, 4 warnings (DevExpress eval)
- Tests: 20/20 passing
Next: Integration tests + Swagger test case
2026-07-09 12:59:24 +02:00
57e36fc004
refactor: Migrate from Minimal API to Controller-based API
...
Architecture decision change:
- Previous: Minimal API (DocumentEndpoints.cs) - WRONG approach
- Required: Controller-based API (per CONTROLLER_ENDPOINTS.md)
New controllers:
- PdfValidationController:
- POST /api/pdf/validation/validate
- Accepts BOTH IFormFile (multipart) AND Base64 JSON
- Returns PdfValidationResult
- SwissQrCodeController:
- POST /api/swissqrcode/extract
- Accepts BOTH IFormFile (multipart) AND Base64 JSON
- Returns SwissQrCodeExtractionResult
Controller best practices:
- Primary constructors (C# 12)
- Thin controllers (pass request to MediatR directly)
- No manual mapping (AutoMapper handles domain -> DTO)
- XML documentation for Swagger
- [ProducesResponseType] attributes
Deleted:
- API/Endpoints/v1/DocumentEndpoints.cs (Minimal API)
- ROADMAP.md (conflicting guidance with CONTROLLER_ENDPOINTS.md)
Result: Controller-based API, dual input support (multipart + JSON)
2026-07-07 19:01:20 +02:00