From da83e67017c6b0ded02fd4fc6d0cc2da2a817cec Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com.> Date: Wed, 17 Sep 2025 13:35:40 +0100 Subject: [PATCH] fixes and cleanups --- .../software/common/model/api/PDFFile.java | 5 +-- .../software/SPDF/config/OpenApiConfig.java | 2 +- .../api/pipeline/PipelineController.java | 35 ------------------- .../model/api/EditTableOfContentsRequest.java | 3 +- .../SPDF/model/api/HandleDataRequest.java | 7 ++-- .../api/general/BookletImpositionRequest.java | 1 - .../general/MergeMultiplePagesRequest.java | 3 +- .../model/api/general/RotatePDFRequest.java | 5 ++- .../model/api/misc/AddPageNumbersRequest.java | 3 +- .../SPDF/model/api/misc/AddStampRequest.java | 3 +- .../model/api/misc/OptimizePdfRequest.java | 3 +- .../api/security/AddPasswordRequest.java | 1 - .../src/main/resources/application.properties | 2 ++ .../software/proprietary/model/Team.java | 3 ++ .../proprietary/security/model/Authority.java | 3 ++ .../proprietary/security/model/User.java | 3 ++ 16 files changed, 26 insertions(+), 56 deletions(-) diff --git a/app/common/src/main/java/stirling/software/common/model/api/PDFFile.java b/app/common/src/main/java/stirling/software/common/model/api/PDFFile.java index cc564f81e..9ccf00aaa 100644 --- a/app/common/src/main/java/stirling/software/common/model/api/PDFFile.java +++ b/app/common/src/main/java/stirling/software/common/model/api/PDFFile.java @@ -12,10 +12,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @EqualsAndHashCode public class PDFFile { - @Schema( - description = "The input PDF file", - contentMediaType = "application/pdf", - format = "binary") + @Schema(description = "The input PDF file", format = "binary") private MultipartFile fileInput; @Schema( diff --git a/app/core/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java b/app/core/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java index 0a0d9118a..97e287778 100644 --- a/app/core/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java +++ b/app/core/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java @@ -52,7 +52,7 @@ public class OpenApiConfig { .email("contact@stirlingpdf.com")) .description(DEFAULT_DESCRIPTION); - OpenAPI openAPI = new OpenAPI().info(info); + OpenAPI openAPI = new OpenAPI().info(info).openapi("3.0.3"); // Add server configuration from environment variable String swaggerServerUrl = System.getenv("SWAGGER_SERVER_URL"); diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java index 5d21cf060..bebd21201 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java @@ -21,9 +21,6 @@ import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.ExampleObject; -import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -59,38 +56,6 @@ public class PipelineController { "This endpoint processes multiple PDF files through a configurable pipeline of operations. " + "Users provide files and a JSON configuration defining the sequence of operations to perform. " + "Input:PDF Output:PDF/ZIP Type:MIMO") - @RequestBody( - content = - @Content( - mediaType = "multipart/form-data", - examples = - @ExampleObject( - name = "Email Preparation Pipeline", - summary = - "Repair, sanitize, and compress PDFs for email", - value = - "{\n" - + " \"name\": \"Prepare-pdfs-for-email\",\n" - + " \"pipeline\": [\n" - + " {\n" - + " \"operation\": \"/api/v1/misc/repair\",\n" - + " \"parameters\": {}\n" - + " },\n" - + " {\n" - + " \"operation\": \"/api/v1/security/sanitize-pdf\",\n" - + " \"parameters\": {\n" - + " \"removeJavaScript\": true,\n" - + " \"removeEmbeddedFiles\": false\n" - + " }\n" - + " },\n" - + " {\n" - + " \"operation\": \"/api/v1/misc/compress-pdf\",\n" - + " \"parameters\": {\n" - + " \"optimizeLevel\": 2\n" - + " }\n" - + " }\n" - + " ]\n" - + "}"))) public ResponseEntity handleData(@ModelAttribute HandleDataRequest request) throws JsonMappingException, JsonProcessingException { MultipartFile[] files = request.getFileInput(); diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/EditTableOfContentsRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/EditTableOfContentsRequest.java index 51e3bc159..312557b5e 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/EditTableOfContentsRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/EditTableOfContentsRequest.java @@ -13,8 +13,9 @@ public class EditTableOfContentsRequest extends PDFFile { @Schema( description = "Bookmark structure in JSON format", + type = "string", example = - "[{\"title\":\"Chapter 1\",\"pageNumber\":1,\"children\":[{\"title\":\"Section 1.1\",\"pageNumber\":2}]}]") + "[{\\\"title\\\":\\\"Chapter 1\\\",\\\"pageNumber\\\":1,\\\"children\\\":[{\\\"title\\\":\\\"Section 1.1\\\",\\\"pageNumber\\\":2}]}]") private String bookmarkData; @Schema( diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java index 7f425dc04..8799980f5 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java @@ -15,8 +15,11 @@ public class HandleDataRequest { private MultipartFile[] fileInput; @Schema( - description = "JSON String", - defaultValue = "{}", + description = + "Pipeline configuration in JSON format containing name and operations list", + type = "string", + example = + "{\\\"name\\\":\\\"Prepare-pdfs-for-email\\\",\\\"pipeline\\\":[{\\\"operation\\\":\\\"/api/v1/misc/repair\\\",\\\"parameters\\\":{}},{\\\"operation\\\":\\\"/api/v1/security/sanitize-pdf\\\",\\\"parameters\\\":{\\\"removeJavaScript\\\":true,\\\"removeEmbeddedFiles\\\":false}},{\\\"operation\\\":\\\"/api/v1/misc/compress-pdf\\\",\\\"parameters\\\":{\\\"optimizeLevel\\\":2}}]}", requiredMode = Schema.RequiredMode.REQUIRED) private String json; } diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/general/BookletImpositionRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/general/BookletImpositionRequest.java index 71c0873f1..e8b0b3ab5 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/general/BookletImpositionRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/general/BookletImpositionRequest.java @@ -22,7 +22,6 @@ public class BookletImpositionRequest extends PDFFile { @Schema( description = "The number of pages to fit onto a single sheet in the output PDF.", type = "integer", - defaultValue = "2", requiredMode = Schema.RequiredMode.REQUIRED, allowableValues = {"2", "4"}) private int pagesPerSheet = 2; diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java index df54fd741..972db7ce3 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java @@ -14,10 +14,9 @@ public class MergeMultiplePagesRequest extends PDFFile { @Schema( description = "The number of pages to fit onto a single sheet in the output PDF.", type = "integer", - defaultValue = "2", requiredMode = Schema.RequiredMode.REQUIRED, allowableValues = {"2", "3", "4", "9", "16"}) - private int pagesPerSheet; + private int pagesPerSheet = 2; @Schema(description = "Boolean for if you wish to add border around the pages") private Boolean addBorder; diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java index db687fdda..030a0df42 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java @@ -16,7 +16,6 @@ public class RotatePDFRequest extends PDFFile { "The angle by which to rotate the PDF file. This should be a multiple of 90.", type = "integer", requiredMode = Schema.RequiredMode.REQUIRED, - allowableValues = {"0", "90", "180", "270"}, - defaultValue = "90") - private Integer angle; + allowableValues = {"0", "90", "180", "270"}) + private Integer angle = 90; } diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java index 0dc33d0ac..bbf3602d1 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java @@ -39,9 +39,8 @@ public class AddPageNumbersRequest extends PDFWithPageNums { + " 7=bottom-left, 8=bottom-center, 9=bottom-right)", type = "integer", allowableValues = {"1", "2", "3", "4", "5", "6", "7", "8", "9"}, - defaultValue = "8", requiredMode = RequiredMode.REQUIRED) - private int position; + private int position = 8; @Schema( description = "Starting number for page numbering", diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java index 4a2659fd3..d12104a79 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java @@ -56,9 +56,8 @@ public class AddStampRequest extends PDFWithPageNums { + " 7: top-left, 8: top-center, 9: top-right)", type = "integer", allowableValues = {"1", "2", "3", "4", "5", "6", "7", "8", "9"}, - defaultValue = "5", requiredMode = Schema.RequiredMode.REQUIRED) - private int position; + private int position = 5; @Schema( description = diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java index 1486cf6ec..bf96dd217 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java @@ -16,10 +16,9 @@ public class OptimizePdfRequest extends PDFFile { "The level of optimization to apply to the PDF file. Higher values indicate" + " greater compression but may reduce quality.", type = "integer", - defaultValue = "5", requiredMode = Schema.RequiredMode.REQUIRED, allowableValues = {"1", "2", "3", "4", "5", "6", "7", "8", "9"}) - private Integer optimizeLevel; + private Integer optimizeLevel = 5; @Schema( description = "The expected output size, e.g. '100MB', '25KB', etc.", diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java index 6a707db30..541a8717f 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java @@ -29,7 +29,6 @@ public class AddPasswordRequest extends PDFFile { description = "The length of the encryption key", type = "integer", allowableValues = {"40", "128", "256"}, - defaultValue = "256", requiredMode = Schema.RequiredMode.REQUIRED) private int keyLength = 256; diff --git a/app/core/src/main/resources/application.properties b/app/core/src/main/resources/application.properties index a631b8b14..1f4e831df 100644 --- a/app/core/src/main/resources/application.properties +++ b/app/core/src/main/resources/application.properties @@ -49,6 +49,8 @@ springdoc.api-docs.path=/v1/api-docs # Set the URL of the OpenAPI JSON for the Swagger UI springdoc.swagger-ui.url=/v1/api-docs springdoc.swagger-ui.path=/index.html +# Force OpenAPI 3.0 specification version +springdoc.api-docs.version=OPENAPI_3_0 posthog.api.key=phc_fiR65u5j6qmXTYL56MNrLZSWqLaDW74OrZH0Insd2xq posthog.host=https://eu.i.posthog.com diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/model/Team.java b/app/proprietary/src/main/java/stirling/software/proprietary/model/Team.java index 5157b3233..119c90955 100644 --- a/app/proprietary/src/main/java/stirling/software/proprietary/model/Team.java +++ b/app/proprietary/src/main/java/stirling/software/proprietary/model/Team.java @@ -4,6 +4,8 @@ import java.io.Serializable; import java.util.HashSet; import java.util.Set; +import com.fasterxml.jackson.annotation.JsonIgnore; + import jakarta.persistence.*; import lombok.*; @@ -30,6 +32,7 @@ public class Team implements Serializable { private String name; @OneToMany(mappedBy = "team", cascade = CascadeType.ALL, orphanRemoval = true) + @JsonIgnore private Set users = new HashSet<>(); public void addUser(User user) { diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/security/model/Authority.java b/app/proprietary/src/main/java/stirling/software/proprietary/security/model/Authority.java index a32e7d7ca..9adcce1ad 100644 --- a/app/proprietary/src/main/java/stirling/software/proprietary/security/model/Authority.java +++ b/app/proprietary/src/main/java/stirling/software/proprietary/security/model/Authority.java @@ -4,6 +4,8 @@ import java.io.Serializable; import org.springframework.security.core.GrantedAuthority; +import com.fasterxml.jackson.annotation.JsonIgnore; + import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -33,6 +35,7 @@ public class Authority implements GrantedAuthority, Serializable { @ManyToOne @JoinColumn(name = "user_id") + @JsonIgnore private User user; public Authority() {} diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/security/model/User.java b/app/proprietary/src/main/java/stirling/software/proprietary/security/model/User.java index 7d1b235cd..616067bed 100644 --- a/app/proprietary/src/main/java/stirling/software/proprietary/security/model/User.java +++ b/app/proprietary/src/main/java/stirling/software/proprietary/security/model/User.java @@ -9,6 +9,8 @@ import java.util.stream.Collectors; import org.springframework.security.core.userdetails.UserDetails; +import com.fasterxml.jackson.annotation.JsonIgnore; + import jakarta.persistence.*; import lombok.EqualsAndHashCode; @@ -62,6 +64,7 @@ public class User implements UserDetails, Serializable { @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "team_id") + @JsonIgnore private Team team; @ElementCollection