diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java index 391eb8f0e..2e9e0806a 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java @@ -15,6 +15,9 @@ import org.springframework.web.multipart.MultipartFile; import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -42,6 +45,16 @@ public class FilterController { @Operation( summary = "Checks if a PDF contains set text, returns true if does", description = "Input:PDF Output:Boolean Type:SISO") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + description = "PDF passed filter", + content = @Content(mediaType = MediaType.APPLICATION_PDF_VALUE)), + @ApiResponse( + responseCode = "204", + description = "PDF did not pass filter", + content = @Content()) + }) public ResponseEntity containsText(@ModelAttribute ContainsTextRequest request) throws IOException, InterruptedException { MultipartFile inputFile = request.getFileInput(); @@ -54,148 +67,184 @@ public class FilterController { pdfDocument, Filenames.toSimpleFileName(inputFile.getOriginalFilename())); } } - return null; + return ResponseEntity.noContent().build(); } - // TODO + @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/filter-contains-image") @Operation( summary = "Checks if a PDF contains an image", description = "Input:PDF Output:Boolean Type:SISO") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + description = "PDF passed filter", + content = @Content(mediaType = MediaType.APPLICATION_PDF_VALUE)), + @ApiResponse( + responseCode = "204", + description = "PDF did not pass filter", + content = @Content()) + }) public ResponseEntity containsImage(@ModelAttribute PDFWithPageNums request) throws IOException, InterruptedException { MultipartFile inputFile = request.getFileInput(); String pageNumber = request.getPageNumbers(); - PDDocument pdfDocument = pdfDocumentFactory.load(inputFile); - if (PdfUtils.hasImages(pdfDocument, pageNumber)) - return WebResponseUtils.pdfDocToWebResponse( - pdfDocument, Filenames.toSimpleFileName(inputFile.getOriginalFilename())); - return null; + try (PDDocument pdfDocument = pdfDocumentFactory.load(inputFile)) { + if (PdfUtils.hasImages(pdfDocument, pageNumber)) { + return WebResponseUtils.pdfDocToWebResponse( + pdfDocument, Filenames.toSimpleFileName(inputFile.getOriginalFilename())); + } + } + return ResponseEntity.noContent().build(); } @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/filter-page-count") @Operation( summary = "Checks if a PDF is greater, less or equal to a setPageCount", description = "Input:PDF Output:Boolean Type:SISO") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + description = "PDF passed filter", + content = @Content(mediaType = MediaType.APPLICATION_PDF_VALUE)), + @ApiResponse( + responseCode = "204", + description = "PDF did not pass filter", + content = @Content()) + }) public ResponseEntity pageCount(@ModelAttribute PDFComparisonAndCount request) throws IOException, InterruptedException { MultipartFile inputFile = request.getFileInput(); int pageCount = request.getPageCount(); String comparator = request.getComparator(); - // Load the PDF - PDDocument document = pdfDocumentFactory.load(inputFile); - int actualPageCount = document.getNumberOfPages(); - // Perform the comparison - boolean valid = - switch (comparator) { - case "Greater" -> actualPageCount > pageCount; - case "Equal" -> actualPageCount == pageCount; - case "Less" -> actualPageCount < pageCount; - default -> - throw ExceptionUtils.createInvalidArgumentException( - "comparator", comparator); - }; - if (valid) return WebResponseUtils.multiPartFileToWebResponse(inputFile); - return null; + boolean valid; + try (PDDocument document = pdfDocumentFactory.load(inputFile)) { + int actualPageCount = document.getNumberOfPages(); + valid = compare(actualPageCount, pageCount, comparator); + } + + return valid + ? WebResponseUtils.multiPartFileToWebResponse(inputFile) + : ResponseEntity.noContent().build(); } @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/filter-page-size") @Operation( summary = "Checks if a PDF is of a certain size", description = "Input:PDF Output:Boolean Type:SISO") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + description = "PDF passed filter", + content = @Content(mediaType = MediaType.APPLICATION_PDF_VALUE)), + @ApiResponse( + responseCode = "204", + description = "PDF did not pass filter", + content = @Content()) + }) public ResponseEntity pageSize(@ModelAttribute PageSizeRequest request) throws IOException, InterruptedException { MultipartFile inputFile = request.getFileInput(); String standardPageSize = request.getStandardPageSize(); String comparator = request.getComparator(); - // Load the PDF - PDDocument document = pdfDocumentFactory.load(inputFile); + final boolean valid; + try (PDDocument document = pdfDocumentFactory.load(inputFile)) { + PDPage firstPage = document.getPage(0); + PDRectangle actualPageSize = firstPage.getMediaBox(); - PDPage firstPage = document.getPage(0); - PDRectangle actualPageSize = firstPage.getMediaBox(); + float actualArea = actualPageSize.getWidth() * actualPageSize.getHeight(); + PDRectangle standardSize = PdfUtils.textToPageSize(standardPageSize); + float standardArea = standardSize.getWidth() * standardSize.getHeight(); - // Calculate the area of the actual page size - float actualArea = actualPageSize.getWidth() * actualPageSize.getHeight(); + valid = compare(actualArea, standardArea, comparator); + } - // Get the standard size and calculate its area - PDRectangle standardSize = PdfUtils.textToPageSize(standardPageSize); - float standardArea = standardSize.getWidth() * standardSize.getHeight(); - - // Perform the comparison - boolean valid = - switch (comparator) { - case "Greater" -> actualArea > standardArea; - case "Equal" -> actualArea == standardArea; - case "Less" -> actualArea < standardArea; - default -> - throw ExceptionUtils.createInvalidArgumentException( - "comparator", comparator); - }; - - if (valid) return WebResponseUtils.multiPartFileToWebResponse(inputFile); - return null; + return valid + ? WebResponseUtils.multiPartFileToWebResponse(inputFile) + : ResponseEntity.noContent().build(); } @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/filter-file-size") @Operation( summary = "Checks if a PDF is a set file size", description = "Input:PDF Output:Boolean Type:SISO") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + description = "PDF passed filter", + content = @Content(mediaType = MediaType.APPLICATION_PDF_VALUE)), + @ApiResponse( + responseCode = "204", + description = "PDF did not pass filter", + content = @Content()) + }) public ResponseEntity fileSize(@ModelAttribute FileSizeRequest request) throws IOException, InterruptedException { MultipartFile inputFile = request.getFileInput(); long fileSize = request.getFileSize(); String comparator = request.getComparator(); - // Get the file size + long actualFileSize = inputFile.getSize(); + boolean valid = compare(actualFileSize, fileSize, comparator); - // Perform the comparison - boolean valid = - switch (comparator) { - case "Greater" -> actualFileSize > fileSize; - case "Equal" -> actualFileSize == fileSize; - case "Less" -> actualFileSize < fileSize; - default -> - throw ExceptionUtils.createInvalidArgumentException( - "comparator", comparator); - }; - - if (valid) return WebResponseUtils.multiPartFileToWebResponse(inputFile); - return null; + return valid + ? WebResponseUtils.multiPartFileToWebResponse(inputFile) + : ResponseEntity.noContent().build(); } @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/filter-page-rotation") @Operation( summary = "Checks if a PDF is of a certain rotation", description = "Input:PDF Output:Boolean Type:SISO") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + description = "PDF passed filter", + content = @Content(mediaType = MediaType.APPLICATION_PDF_VALUE)), + @ApiResponse( + responseCode = "204", + description = "PDF did not pass filter", + content = @Content()) + }) public ResponseEntity pageRotation(@ModelAttribute PageRotationRequest request) throws IOException, InterruptedException { MultipartFile inputFile = request.getFileInput(); int rotation = request.getRotation(); String comparator = request.getComparator(); - // Load the PDF - PDDocument document = pdfDocumentFactory.load(inputFile); + boolean valid; + try (PDDocument document = pdfDocumentFactory.load(inputFile)) { + PDPage firstPage = document.getPage(0); + int actualRotation = firstPage.getRotation(); + valid = compare(actualRotation, rotation, comparator); + } - // Get the rotation of the first page - PDPage firstPage = document.getPage(0); - int actualRotation = firstPage.getRotation(); + return valid + ? WebResponseUtils.multiPartFileToWebResponse(inputFile) + : ResponseEntity.noContent().build(); + } - // Perform the comparison - boolean valid = - switch (comparator) { - case "Greater" -> actualRotation > rotation; - case "Equal" -> actualRotation == rotation; - case "Less" -> actualRotation < rotation; - default -> - throw ExceptionUtils.createInvalidArgumentException( - "comparator", comparator); - }; - - if (valid) return WebResponseUtils.multiPartFileToWebResponse(inputFile); - return null; + /** + * Compares two values based on the provided comparator. + * + * @param The type of the values being compared. + * @param actual The actual value. + * @param expected The expected value. + * @param comparator The comparator to use (e.g., "Greater", "Less", "Equal"). + * @return True if the comparison is valid, false otherwise. + */ + private static > boolean compare( + T actual, T expected, String comparator) { + return switch (comparator) { + case "Greater" -> actual.compareTo(expected) > 0; + case "Equal" -> actual.compareTo(expected) == 0; + case "Less" -> actual.compareTo(expected) < 0; + default -> + throw ExceptionUtils.createInvalidArgumentException("comparator", comparator); + }; } }