mirror of
https://github.com/arsvendg/Stirling-PDF.git
synced 2026-07-14 10:34:06 +02:00
SaaS Consolidation (#6384)
Co-authored-by: ConnorYoh <[email protected]>
This commit is contained in:
co-authored by
ConnorYoh
parent
089de247b4
commit
9d081d1792
@@ -265,6 +265,8 @@ docs/type3/signatures/
|
|||||||
# Type3 sample PDFs (development only)
|
# Type3 sample PDFs (development only)
|
||||||
**/type3/samples/
|
**/type3/samples/
|
||||||
|
|
||||||
|
**/application-dev-local.properties
|
||||||
|
|
||||||
# Claude
|
# Claude
|
||||||
.claude/
|
.claude/
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ Portions of this software are licensed as follows:
|
|||||||
|
|
||||||
* All content that resides under the "app/proprietary/" directory of this repository,
|
* All content that resides under the "app/proprietary/" directory of this repository,
|
||||||
if that directory exists, is licensed under the license defined in "app/proprietary/LICENSE".
|
if that directory exists, is licensed under the license defined in "app/proprietary/LICENSE".
|
||||||
|
* All content that resides under the "app/saas/" directory of this repository,
|
||||||
|
if that directory exists, is licensed under the license defined in "app/saas/LICENSE".
|
||||||
* All content that resides under the "engine/" directory of this repository,
|
* All content that resides under the "engine/" directory of this repository,
|
||||||
if that directory exists, is licensed under the license defined in "engine/LICENSE".
|
if that directory exists, is licensed under the license defined in "engine/LICENSE".
|
||||||
* All content that resides under the "frontend/src/proprietary/" directory of this repository,
|
* All content that resides under the "frontend/src/proprietary/" directory of this repository,
|
||||||
|
|||||||
@@ -59,4 +59,7 @@ dependencies {
|
|||||||
exclude group: 'org.bouncycastle', module: 'bcprov-jdk15on'
|
exclude group: 'org.bouncycastle', module: 'bcprov-jdk15on'
|
||||||
exclude group: 'com.google.code.gson', module: 'gson'
|
exclude group: 'com.google.code.gson', module: 'gson'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ArchUnit: enforces module dependency direction (see ArchitectureTest)
|
||||||
|
testImplementation 'com.tngtech.archunit:archunit-junit5:1.4.2'
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -75,8 +75,8 @@ public @interface AutoJobPostMapping {
|
|||||||
boolean queueable() default false;
|
boolean queueable() default false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Relative resource weight (1–100) used by the scheduler to prioritise / throttle jobs. Values
|
* Relative resource weight (1-100). See {@link
|
||||||
* below 1 are clamped to 1, values above 100 to 100.
|
* stirling.software.common.enumeration.ResourceWeight} for the standard tiers.
|
||||||
*/
|
*/
|
||||||
int resourceWeight() default 50;
|
int resourceWeight() default 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package stirling.software.common.enumeration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Standard resource-weight tiers for {@link
|
||||||
|
* stirling.software.common.annotations.AutoJobPostMapping#resourceWeight()}.
|
||||||
|
*/
|
||||||
|
public final class ResourceWeight {
|
||||||
|
|
||||||
|
/** Lightweight: rotate, page numbers, extract pages, permissions, etc. */
|
||||||
|
public static final int SMALL_WEIGHT = 1;
|
||||||
|
|
||||||
|
/** Medium: merge, split, multi-tool batch. */
|
||||||
|
public static final int MEDIUM_WEIGHT = 3;
|
||||||
|
|
||||||
|
/** Heavy: compress, OCR (small), conversions, raster. */
|
||||||
|
public static final int LARGE_WEIGHT = 5;
|
||||||
|
|
||||||
|
/** Extra heavy: OCR on large files, full-document re-render, AI-assisted edits. */
|
||||||
|
public static final int XLARGE_WEIGHT = 10;
|
||||||
|
|
||||||
|
private ResourceWeight() {}
|
||||||
|
}
|
||||||
@@ -97,7 +97,14 @@ public class ApplicationProperties {
|
|||||||
EncodedResource encodedResource = new EncodedResource(resource);
|
EncodedResource encodedResource = new EncodedResource(resource);
|
||||||
PropertySource<?> propertySource =
|
PropertySource<?> propertySource =
|
||||||
new YamlPropertySourceFactory().createPropertySource(null, encodedResource);
|
new YamlPropertySourceFactory().createPropertySource(null, encodedResource);
|
||||||
environment.getPropertySources().addFirst(propertySource);
|
|
||||||
|
boolean saasActive = Arrays.asList(environment.getActiveProfiles()).contains("saas");
|
||||||
|
if (saasActive) {
|
||||||
|
// Saas-pinned values in application-saas.properties must beat settings.yml.
|
||||||
|
environment.getPropertySources().addLast(propertySource);
|
||||||
|
} else {
|
||||||
|
environment.getPropertySources().addFirst(propertySource);
|
||||||
|
}
|
||||||
|
|
||||||
log.debug("Loaded properties: {}", propertySource.getSource());
|
log.debug("Loaded properties: {}", propertySource.getSource());
|
||||||
|
|
||||||
|
|||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
package stirling.software.common.model.enumeration;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
/** Team invitation status */
|
||||||
|
@Getter
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public enum InvitationStatus {
|
||||||
|
PENDING("PENDING"),
|
||||||
|
ACCEPTED("ACCEPTED"),
|
||||||
|
REJECTED("REJECTED"),
|
||||||
|
CANCELLED("CANCELLED"),
|
||||||
|
EXPIRED("EXPIRED");
|
||||||
|
|
||||||
|
private final String statusName;
|
||||||
|
|
||||||
|
public static InvitationStatus fromString(String statusName) {
|
||||||
|
for (InvitationStatus status : InvitationStatus.values()) {
|
||||||
|
if (status.getStatusName().equalsIgnoreCase(statusName)) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("No InvitationStatus defined for name: " + statusName);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,6 +16,9 @@ public enum Role {
|
|||||||
// Unlimited access
|
// Unlimited access
|
||||||
USER("ROLE_USER", Integer.MAX_VALUE, Integer.MAX_VALUE, "adminUserSettings.user"),
|
USER("ROLE_USER", Integer.MAX_VALUE, Integer.MAX_VALUE, "adminUserSettings.user"),
|
||||||
|
|
||||||
|
// Paid tier; set by Stripe webhooks under saas mode.
|
||||||
|
PRO_USER("ROLE_PRO_USER", Integer.MAX_VALUE, Integer.MAX_VALUE, "adminUserSettings.proUser"),
|
||||||
|
|
||||||
// 40 API calls Per Day, 40 web calls
|
// 40 API calls Per Day, 40 web calls
|
||||||
LIMITED_API_USER("ROLE_LIMITED_API_USER", 40, 40, "adminUserSettings.apiUser"),
|
LIMITED_API_USER("ROLE_LIMITED_API_USER", 40, 40, "adminUserSettings.apiUser"),
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package stirling.software.common.model.enumeration;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Team membership roles LEADER: Can invite/remove members, manage settings, view usage, manage
|
||||||
|
* billing MEMBER: Regular team member with standard access
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public enum TeamRole {
|
||||||
|
LEADER("LEADER"),
|
||||||
|
MEMBER("MEMBER");
|
||||||
|
|
||||||
|
private final String roleName;
|
||||||
|
|
||||||
|
public static TeamRole fromString(String roleName) {
|
||||||
|
for (TeamRole role : TeamRole.values()) {
|
||||||
|
if (role.getRoleName().equalsIgnoreCase(roleName)) {
|
||||||
|
return role;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("No TeamRole defined for name: " + roleName);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
package stirling.software.common.architecture;
|
||||||
|
|
||||||
|
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import com.tngtech.archunit.core.domain.JavaClasses;
|
||||||
|
import com.tngtech.archunit.core.importer.ClassFileImporter;
|
||||||
|
import com.tngtech.archunit.core.importer.ImportOption;
|
||||||
|
import com.tngtech.archunit.lang.ArchRule;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependency-direction guardrails. Allowed direction: {@code saas → proprietary → common}
|
||||||
|
* and {@code stirling-pdf → proprietary → common}.
|
||||||
|
*/
|
||||||
|
class ArchitectureTest {
|
||||||
|
|
||||||
|
private static final JavaClasses commonClasses =
|
||||||
|
new ClassFileImporter()
|
||||||
|
.withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_JARS)
|
||||||
|
.withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
|
||||||
|
.importPackages("stirling.software.common");
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void commonDoesNotDependOnCore() {
|
||||||
|
ArchRule rule =
|
||||||
|
noClasses()
|
||||||
|
.that()
|
||||||
|
.resideInAPackage("stirling.software.common..")
|
||||||
|
.should()
|
||||||
|
.dependOnClassesThat()
|
||||||
|
.resideInAPackage("stirling.software.SPDF..");
|
||||||
|
rule.check(commonClasses);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void commonDoesNotDependOnProprietary() {
|
||||||
|
ArchRule rule =
|
||||||
|
noClasses()
|
||||||
|
.that()
|
||||||
|
.resideInAPackage("stirling.software.common..")
|
||||||
|
.should()
|
||||||
|
.dependOnClassesThat()
|
||||||
|
.resideInAPackage("stirling.software.proprietary..");
|
||||||
|
rule.check(commonClasses);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void commonDoesNotDependOnSaas() {
|
||||||
|
ArchRule rule =
|
||||||
|
noClasses()
|
||||||
|
.that()
|
||||||
|
.resideInAPackage("stirling.software.common..")
|
||||||
|
.should()
|
||||||
|
.dependOnClassesThat()
|
||||||
|
.resideInAPackage("stirling.software.saas..");
|
||||||
|
rule.check(commonClasses);
|
||||||
|
}
|
||||||
|
}
|
||||||
+32
-7
@@ -39,12 +39,14 @@ spotless {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
if (System.getenv('DISABLE_ADDITIONAL_FEATURES') != 'true'
|
if (!gradle.ext.disableAdditional) {
|
||||||
|| (project.hasProperty('DISABLE_ADDITIONAL_FEATURES')
|
|
||||||
&& System.getProperty('DISABLE_ADDITIONAL_FEATURES') != 'true')) {
|
|
||||||
implementation project(':proprietary')
|
implementation project(':proprietary')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (gradle.ext.enableSaas) {
|
||||||
|
implementation project(':saas')
|
||||||
|
}
|
||||||
|
|
||||||
implementation project(':common')
|
implementation project(':common')
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-jetty'
|
implementation 'org.springframework.boot:spring-boot-starter-jetty'
|
||||||
implementation 'org.eclipse.jetty.http2:jetty-http2-server'
|
implementation 'org.eclipse.jetty.http2:jetty-http2-server'
|
||||||
@@ -173,6 +175,23 @@ springBoot {
|
|||||||
// Frontend build tasks - only enabled with -PbuildWithFrontend=true
|
// Frontend build tasks - only enabled with -PbuildWithFrontend=true
|
||||||
def buildWithFrontend = project.hasProperty('buildWithFrontend') && project.property('buildWithFrontend') == 'true'
|
def buildWithFrontend = project.hasProperty('buildWithFrontend') && project.property('buildWithFrontend') == 'true'
|
||||||
def buildPrototypes = project.hasProperty('prototypesMode') && project.property('prototypesMode') == 'true'
|
def buildPrototypes = project.hasProperty('prototypesMode') && project.property('prototypesMode') == 'true'
|
||||||
|
|
||||||
|
// Vite mode: -PprototypesMode > -PfrontendMode > enableSaas > disableAdditional > proprietary.
|
||||||
|
def frontendModeOverride = project.findProperty('frontendMode')?.toString()?.toLowerCase()
|
||||||
|
def frontendMode
|
||||||
|
if (buildPrototypes) {
|
||||||
|
frontendMode = 'prototypes'
|
||||||
|
} else if (frontendModeOverride) {
|
||||||
|
frontendMode = frontendModeOverride
|
||||||
|
} else if (gradle.ext.enableSaas) {
|
||||||
|
frontendMode = 'saas'
|
||||||
|
} else if (gradle.ext.disableAdditional) {
|
||||||
|
frontendMode = 'core'
|
||||||
|
} else {
|
||||||
|
frontendMode = 'proprietary'
|
||||||
|
}
|
||||||
|
def frontendBuildTask = "frontend:build:${frontendMode}"
|
||||||
|
|
||||||
def frontendDir = file('../../frontend')
|
def frontendDir = file('../../frontend')
|
||||||
def frontendDistDir = file('../../frontend/dist')
|
def frontendDistDir = file('../../frontend/dist')
|
||||||
def resourcesStaticDir = file('src/main/resources/static')
|
def resourcesStaticDir = file('src/main/resources/static')
|
||||||
@@ -241,7 +260,7 @@ tasks.register('npmBuild', Exec) {
|
|||||||
group = 'frontend'
|
group = 'frontend'
|
||||||
description = 'Build frontend application'
|
description = 'Build frontend application'
|
||||||
workingDir file('../..')
|
workingDir file('../..')
|
||||||
commandLine = buildPrototypes ? ['task', 'frontend:build:prototypes'] : ['task', 'frontend:build']
|
commandLine = ['task', frontendBuildTask]
|
||||||
inputs.dir(new File(frontendDir, 'src'))
|
inputs.dir(new File(frontendDir, 'src'))
|
||||||
inputs.dir(new File(frontendDir, 'public'))
|
inputs.dir(new File(frontendDir, 'public'))
|
||||||
inputs.file(new File(frontendDir, 'package.json'))
|
inputs.file(new File(frontendDir, 'package.json'))
|
||||||
@@ -256,7 +275,7 @@ tasks.register('npmBuild', Exec) {
|
|||||||
environment 'VITE_API_BASE_URL', '/'
|
environment 'VITE_API_BASE_URL', '/'
|
||||||
|
|
||||||
doFirst {
|
doFirst {
|
||||||
println "Building frontend application for production (VITE_API_BASE_URL=/)"
|
println "Building frontend application for production (mode=${frontendMode}, VITE_API_BASE_URL=/)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,6 +284,7 @@ tasks.register('copyFrontendAssets', Copy) {
|
|||||||
group = 'frontend'
|
group = 'frontend'
|
||||||
description = 'Copy frontend build to static resources'
|
description = 'Copy frontend build to static resources'
|
||||||
dependsOn npmBuild
|
dependsOn npmBuild
|
||||||
|
dependsOn cleanFrontendAssets
|
||||||
from(frontendDistDir) {
|
from(frontendDistDir) {
|
||||||
// Exclude files that conflict with backend static resources
|
// Exclude files that conflict with backend static resources
|
||||||
exclude 'robots.txt' // Backend already has this
|
exclude 'robots.txt' // Backend already has this
|
||||||
@@ -305,7 +325,7 @@ tasks.named('copyFrontendAssets').configure {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (buildWithFrontend) {
|
if (buildWithFrontend) {
|
||||||
println "Frontend build enabled - JAR will include React frontend"
|
println "Frontend build enabled - JAR will include React frontend (mode=${frontendMode})"
|
||||||
processResources.dependsOn copyFrontendAssets
|
processResources.dependsOn copyFrontendAssets
|
||||||
} else {
|
} else {
|
||||||
println "Frontend build disabled - JAR will be backend-only with API landing page"
|
println "Frontend build disabled - JAR will be backend-only with API landing page"
|
||||||
@@ -314,4 +334,9 @@ if (buildWithFrontend) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bootJar.dependsOn ':common:jar'
|
bootJar.dependsOn ':common:jar'
|
||||||
bootJar.dependsOn ':proprietary:jar'
|
if (!gradle.ext.disableAdditional) {
|
||||||
|
bootJar.dependsOn ':proprietary:jar'
|
||||||
|
}
|
||||||
|
if (gradle.ext.enableSaas) {
|
||||||
|
bootJar.dependsOn ':saas:jar'
|
||||||
|
}
|
||||||
|
|||||||
@@ -35,7 +35,8 @@ import stirling.software.common.model.ApplicationProperties;
|
|||||||
scanBasePackages = {
|
scanBasePackages = {
|
||||||
"stirling.software.SPDF",
|
"stirling.software.SPDF",
|
||||||
"stirling.software.common",
|
"stirling.software.common",
|
||||||
"stirling.software.proprietary"
|
"stirling.software.proprietary",
|
||||||
|
"stirling.software.saas"
|
||||||
})
|
})
|
||||||
public class SPDFApplication {
|
public class SPDFApplication {
|
||||||
|
|
||||||
@@ -205,15 +206,22 @@ public class SPDFApplication {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. Detect if SecurityConfiguration is present on classpath
|
// 2. Detect classpath shape and pick the matching profile chain.
|
||||||
if (isClassPresent(
|
boolean hasSaas = isClassPresent("stirling.software.saas.security.SupabaseSecurityConfig");
|
||||||
"stirling.software.proprietary.security.configuration.SecurityConfiguration")) {
|
boolean hasSecurity =
|
||||||
|
isClassPresent(
|
||||||
|
"stirling.software.proprietary.security.configuration.SecurityConfiguration");
|
||||||
|
|
||||||
|
if (hasSaas) {
|
||||||
|
log.info("SaaS features in jar");
|
||||||
|
return new String[] {"security", "saas"};
|
||||||
|
}
|
||||||
|
if (hasSecurity) {
|
||||||
log.info("Additional features in jar");
|
log.info("Additional features in jar");
|
||||||
return new String[] {"security"};
|
return new String[] {"security"};
|
||||||
} else {
|
|
||||||
log.info("Without additional features in jar");
|
|
||||||
return new String[] {"default"};
|
|
||||||
}
|
}
|
||||||
|
log.info("Without additional features in jar");
|
||||||
|
return new String[] {"default"};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isClassPresent(String className) {
|
private static boolean isClassPresent(String className) {
|
||||||
|
|||||||
+31
-8
@@ -23,6 +23,7 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import stirling.software.SPDF.config.swagger.JsonDataResponse;
|
import stirling.software.SPDF.config.swagger.JsonDataResponse;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.AnalysisApi;
|
import stirling.software.common.annotations.api.AnalysisApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.PDFFile;
|
import stirling.software.common.model.api.PDFFile;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
|
|
||||||
@@ -32,7 +33,10 @@ public class AnalysisController {
|
|||||||
|
|
||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/page-count", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/page-count",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@JsonDataResponse
|
@JsonDataResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Get PDF page count",
|
summary = "Get PDF page count",
|
||||||
@@ -43,7 +47,10 @@ public class AnalysisController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/basic-info", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/basic-info",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@JsonDataResponse
|
@JsonDataResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Get basic PDF information",
|
summary = "Get basic PDF information",
|
||||||
@@ -60,7 +67,8 @@ public class AnalysisController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
value = "/document-properties",
|
value = "/document-properties",
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@JsonDataResponse
|
@JsonDataResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Get PDF document properties",
|
summary = "Get PDF document properties",
|
||||||
@@ -90,7 +98,10 @@ public class AnalysisController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/page-dimensions", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/page-dimensions",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@JsonDataResponse
|
@JsonDataResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Get page dimensions for all pages",
|
summary = "Get page dimensions for all pages",
|
||||||
@@ -110,7 +121,10 @@ public class AnalysisController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/form-fields", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/form-fields",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@JsonDataResponse
|
@JsonDataResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Get form field information",
|
summary = "Get form field information",
|
||||||
@@ -134,7 +148,10 @@ public class AnalysisController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/annotation-info", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/annotation-info",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@JsonDataResponse
|
@JsonDataResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Get annotation information",
|
summary = "Get annotation information",
|
||||||
@@ -159,7 +176,10 @@ public class AnalysisController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/font-info", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/font-info",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@JsonDataResponse
|
@JsonDataResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Get font information",
|
summary = "Get font information",
|
||||||
@@ -185,7 +205,10 @@ public class AnalysisController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/security-info", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/security-info",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@JsonDataResponse
|
@JsonDataResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Get security information",
|
summary = "Get security information",
|
||||||
|
|||||||
+3
-1
@@ -28,6 +28,7 @@ import lombok.RequiredArgsConstructor;
|
|||||||
|
|
||||||
import stirling.software.SPDF.model.api.general.BookletImpositionRequest;
|
import stirling.software.SPDF.model.api.general.BookletImpositionRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.TempFileManager;
|
import stirling.software.common.util.TempFileManager;
|
||||||
@@ -44,7 +45,8 @@ public class BookletImpositionController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
value = "/booklet-imposition",
|
value = "/booklet-imposition",
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Create a booklet with proper page imposition",
|
summary = "Create a booklet with proper page imposition",
|
||||||
description =
|
description =
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import stirling.software.SPDF.config.EndpointConfiguration;
|
|||||||
import stirling.software.SPDF.model.api.general.CropPdfForm;
|
import stirling.software.SPDF.model.api.general.CropPdfForm;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -126,7 +127,10 @@ public class CropController {
|
|||||||
return endpointConfiguration.isGroupEnabled("Ghostscript");
|
return endpointConfiguration.isGroupEnabled("Ghostscript");
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/crop", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/crop",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Crops a PDF document",
|
summary = "Crops a PDF document",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-2
@@ -25,6 +25,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import stirling.software.SPDF.model.api.EditTableOfContentsRequest;
|
import stirling.software.SPDF.model.api.EditTableOfContentsRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.TempFileManager;
|
import stirling.software.common.util.TempFileManager;
|
||||||
@@ -44,7 +45,8 @@ public class EditTableOfContentsController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
value = "/extract-bookmarks",
|
value = "/extract-bookmarks",
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Extract PDF Bookmarks",
|
summary = "Extract PDF Bookmarks",
|
||||||
description = "Extracts bookmarks/table of contents from a PDF document as JSON.")
|
description = "Extracts bookmarks/table of contents from a PDF document as JSON.")
|
||||||
@@ -147,7 +149,8 @@ public class EditTableOfContentsController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
value = "/edit-table-of-contents",
|
value = "/edit-table-of-contents",
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Edit Table of Contents",
|
summary = "Edit Table of Contents",
|
||||||
description = "Add or edit bookmarks/table of contents in a PDF document.")
|
description = "Add or edit bookmarks/table of contents in a PDF document.")
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
|||||||
import stirling.software.SPDF.model.api.general.MergePdfsRequest;
|
import stirling.software.SPDF.model.api.general.MergePdfsRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -271,7 +272,10 @@ public class MergeController {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/merge-pdfs")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/merge-pdfs",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Merge multiple PDF files into one",
|
summary = "Merge multiple PDF files into one",
|
||||||
|
|||||||
+3
-1
@@ -24,6 +24,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import stirling.software.SPDF.model.api.general.MergeMultiplePagesRequest;
|
import stirling.software.SPDF.model.api.general.MergeMultiplePagesRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.GeneralFormCopyUtils;
|
import stirling.software.common.util.GeneralFormCopyUtils;
|
||||||
@@ -41,7 +42,8 @@ public class MultiPageLayoutController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
value = "/multi-page-layout",
|
value = "/multi-page-layout",
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Merge multiple pages of a PDF document into a single page",
|
summary = "Merge multiple pages of a PDF document into a single page",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -25,6 +25,7 @@ import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
|||||||
import stirling.software.SPDF.model.api.general.OverlayPdfsRequest;
|
import stirling.software.SPDF.model.api.general.OverlayPdfsRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -39,7 +40,10 @@ public class PdfOverlayController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/overlay-pdfs", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/overlay-pdfs",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Overlay PDF files in various modes",
|
summary = "Overlay PDF files in various modes",
|
||||||
|
|||||||
+5
-1
@@ -28,6 +28,7 @@ import stirling.software.SPDF.config.swagger.MultiFileResponse;
|
|||||||
import stirling.software.SPDF.model.api.general.PosterPdfRequest;
|
import stirling.software.SPDF.model.api.general.PosterPdfRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -43,7 +44,10 @@ public class PosterPdfController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/split-for-poster-print", consumes = "multipart/form-data")
|
@AutoJobPostMapping(
|
||||||
|
value = "/split-for-poster-print",
|
||||||
|
consumes = "multipart/form-data",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@MultiFileResponse
|
@MultiFileResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Split large PDF pages into smaller printable chunks",
|
summary = "Split large PDF pages into smaller printable chunks",
|
||||||
|
|||||||
+9
-2
@@ -28,6 +28,7 @@ import stirling.software.SPDF.model.api.PDFWithPageNums;
|
|||||||
import stirling.software.SPDF.model.api.general.RearrangePagesRequest;
|
import stirling.software.SPDF.model.api.general.RearrangePagesRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.FormUtils;
|
import stirling.software.common.util.FormUtils;
|
||||||
@@ -43,7 +44,10 @@ public class RearrangePagesPDFController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/remove-pages")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/remove-pages",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Remove pages from a PDF file",
|
summary = "Remove pages from a PDF file",
|
||||||
@@ -224,7 +228,10 @@ public class RearrangePagesPDFController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/rearrange-pages")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/rearrange-pages",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Rearrange pages in a PDF file",
|
summary = "Rearrange pages in a PDF file",
|
||||||
|
|||||||
+5
-1
@@ -19,6 +19,7 @@ import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
|||||||
import stirling.software.SPDF.model.api.general.RotatePDFRequest;
|
import stirling.software.SPDF.model.api.general.RotatePDFRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -32,7 +33,10 @@ public class RotationController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/rotate-pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/rotate-pdf",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Rotate a PDF file",
|
summary = "Rotate a PDF file",
|
||||||
|
|||||||
+5
-1
@@ -25,6 +25,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import stirling.software.SPDF.model.api.general.ScalePagesRequest;
|
import stirling.software.SPDF.model.api.general.ScalePagesRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -114,7 +115,10 @@ public class ScalePagesController {
|
|||||||
return sizeMap;
|
return sizeMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/scale-pages", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/scale-pages",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Change the size of a PDF page/document",
|
summary = "Change the size of a PDF page/document",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+4
-1
@@ -16,6 +16,7 @@ import stirling.software.SPDF.config.EndpointConfiguration;
|
|||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.SettingsApi;
|
import stirling.software.common.annotations.api.SettingsApi;
|
||||||
import stirling.software.common.configuration.InstallationPathConfig;
|
import stirling.software.common.configuration.InstallationPathConfig;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.ApplicationProperties;
|
import stirling.software.common.model.ApplicationProperties;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
|
|
||||||
@@ -27,7 +28,9 @@ public class SettingsController {
|
|||||||
private final ApplicationProperties applicationProperties;
|
private final ApplicationProperties applicationProperties;
|
||||||
private final EndpointConfiguration endpointConfiguration;
|
private final EndpointConfiguration endpointConfiguration;
|
||||||
|
|
||||||
@AutoJobPostMapping("/update-enable-analytics")
|
@AutoJobPostMapping(
|
||||||
|
value = "/update-enable-analytics",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@Hidden
|
@Hidden
|
||||||
public ResponseEntity<Map<String, Object>> updateApiKey(@RequestParam Boolean enabled)
|
public ResponseEntity<Map<String, Object>> updateApiKey(@RequestParam Boolean enabled)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|||||||
+5
-1
@@ -28,6 +28,7 @@ import stirling.software.SPDF.config.swagger.MultiFileResponse;
|
|||||||
import stirling.software.SPDF.model.api.SplitPagesRequest;
|
import stirling.software.SPDF.model.api.SplitPagesRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.FormUtils;
|
import stirling.software.common.util.FormUtils;
|
||||||
@@ -44,7 +45,10 @@ public class SplitPDFController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/split-pages")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/split-pages",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@MultiFileResponse
|
@MultiFileResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Split a PDF file into separate documents",
|
summary = "Split a PDF file into separate documents",
|
||||||
|
|||||||
+3
-1
@@ -30,6 +30,7 @@ import stirling.software.SPDF.config.swagger.MultiFileResponse;
|
|||||||
import stirling.software.SPDF.model.api.SplitPdfByChaptersRequest;
|
import stirling.software.SPDF.model.api.SplitPdfByChaptersRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.PdfMetadata;
|
import stirling.software.common.model.PdfMetadata;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.service.PdfMetadataService;
|
import stirling.software.common.service.PdfMetadataService;
|
||||||
@@ -120,7 +121,8 @@ public class SplitPdfByChaptersController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
value = "/split-pdf-by-chapters",
|
value = "/split-pdf-by-chapters",
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@MultiFileResponse
|
@MultiFileResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Split PDFs by Chapters",
|
summary = "Split PDFs by Chapters",
|
||||||
|
|||||||
+3
-1
@@ -33,6 +33,7 @@ import stirling.software.SPDF.model.SplitTypes;
|
|||||||
import stirling.software.SPDF.model.api.SplitPdfBySectionsRequest;
|
import stirling.software.SPDF.model.api.SplitPdfBySectionsRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -50,7 +51,8 @@ public class SplitPdfBySectionsController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
value = "/split-pdf-by-sections")
|
value = "/split-pdf-by-sections",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@MultiFileResponse
|
@MultiFileResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Split PDF pages into smaller sections",
|
summary = "Split PDF pages into smaller sections",
|
||||||
|
|||||||
+3
-1
@@ -29,6 +29,7 @@ import stirling.software.SPDF.config.swagger.MultiFileResponse;
|
|||||||
import stirling.software.SPDF.model.api.general.SplitPdfBySizeOrCountRequest;
|
import stirling.software.SPDF.model.api.general.SplitPdfBySizeOrCountRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.FormUtils;
|
import stirling.software.common.util.FormUtils;
|
||||||
@@ -47,7 +48,8 @@ public class SplitPdfBySizeController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
value = "/split-by-size-or-count",
|
value = "/split-by-size-or-count",
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@MultiFileResponse
|
@MultiFileResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Auto split PDF pages into separate documents based on size or count",
|
summary = "Auto split PDF pages into separate documents based on size or count",
|
||||||
|
|||||||
+3
-1
@@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.PDFFile;
|
import stirling.software.common.model.api.PDFFile;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -35,7 +36,8 @@ public class ToSinglePageController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
value = "/pdf-to-single-page")
|
value = "/pdf-to-single-page",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert a multi-page PDF into a single long page PDF",
|
summary = "Convert a multi-page PDF into a single long page PDF",
|
||||||
|
|||||||
+5
-1
@@ -28,6 +28,7 @@ import stirling.software.SPDF.config.EndpointConfiguration;
|
|||||||
import stirling.software.SPDF.model.api.converters.ConvertEbookToPdfRequest;
|
import stirling.software.SPDF.model.api.converters.ConvertEbookToPdfRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.ProcessExecutor;
|
import stirling.software.common.util.ProcessExecutor;
|
||||||
@@ -56,7 +57,10 @@ public class ConvertEbookToPDFController {
|
|||||||
return endpointConfiguration.isGroupEnabled("Ghostscript");
|
return endpointConfiguration.isGroupEnabled("Ghostscript");
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/ebook/pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/ebook/pdf",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert an eBook file to PDF",
|
summary = "Convert an eBook file to PDF",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -25,6 +25,7 @@ import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
|||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
import stirling.software.common.configuration.RuntimePathConfig;
|
import stirling.software.common.configuration.RuntimePathConfig;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.converters.EmlToPdfRequest;
|
import stirling.software.common.model.api.converters.EmlToPdfRequest;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.CustomHtmlSanitizer;
|
import stirling.software.common.util.CustomHtmlSanitizer;
|
||||||
@@ -43,7 +44,10 @@ public class ConvertEmlToPDF {
|
|||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
private final CustomHtmlSanitizer customHtmlSanitizer;
|
private final CustomHtmlSanitizer customHtmlSanitizer;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/eml/pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/eml/pdf",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert EML/MSG to PDF",
|
summary = "Convert EML/MSG to PDF",
|
||||||
|
|||||||
+5
-1
@@ -17,6 +17,7 @@ import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
|||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
import stirling.software.common.configuration.RuntimePathConfig;
|
import stirling.software.common.configuration.RuntimePathConfig;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.converters.HTMLToPdfRequest;
|
import stirling.software.common.model.api.converters.HTMLToPdfRequest;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.*;
|
import stirling.software.common.util.*;
|
||||||
@@ -33,7 +34,10 @@ public class ConvertHtmlToPDF {
|
|||||||
|
|
||||||
private final CustomHtmlSanitizer customHtmlSanitizer;
|
private final CustomHtmlSanitizer customHtmlSanitizer;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/html/pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/html/pdf",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF",
|
summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF",
|
||||||
|
|||||||
+9
-2
@@ -40,6 +40,7 @@ import stirling.software.SPDF.model.api.converters.ConvertToImageRequest;
|
|||||||
import stirling.software.SPDF.model.api.converters.ConvertToPdfRequest;
|
import stirling.software.SPDF.model.api.converters.ConvertToPdfRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.CbrUtils;
|
import stirling.software.common.util.CbrUtils;
|
||||||
import stirling.software.common.util.CbzUtils;
|
import stirling.software.common.util.CbzUtils;
|
||||||
@@ -72,7 +73,10 @@ public class ConvertImgPDFController {
|
|||||||
return endpointConfiguration.isGroupEnabled("Ghostscript");
|
return endpointConfiguration.isGroupEnabled("Ghostscript");
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/img")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/pdf/img",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@MultiFileResponse
|
@MultiFileResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert PDF to image(s)",
|
summary = "Convert PDF to image(s)",
|
||||||
@@ -239,7 +243,10 @@ public class ConvertImgPDFController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/img/pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/img/pdf",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert images to a PDF file",
|
summary = "Convert images to a PDF file",
|
||||||
|
|||||||
+5
-1
@@ -26,6 +26,7 @@ import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
|||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
import stirling.software.common.configuration.RuntimePathConfig;
|
import stirling.software.common.configuration.RuntimePathConfig;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.GeneralFile;
|
import stirling.software.common.model.api.GeneralFile;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.*;
|
import stirling.software.common.util.*;
|
||||||
@@ -41,7 +42,10 @@ public class ConvertMarkdownToPdf {
|
|||||||
|
|
||||||
private final CustomHtmlSanitizer customHtmlSanitizer;
|
private final CustomHtmlSanitizer customHtmlSanitizer;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/markdown/pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/markdown/pdf",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert a Markdown file to PDF",
|
summary = "Convert a Markdown file to PDF",
|
||||||
|
|||||||
+5
-1
@@ -29,6 +29,7 @@ import stirling.software.SPDF.config.EndpointConfiguration;
|
|||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
import stirling.software.common.configuration.RuntimePathConfig;
|
import stirling.software.common.configuration.RuntimePathConfig;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.GeneralFile;
|
import stirling.software.common.model.api.GeneralFile;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.CustomHtmlSanitizer;
|
import stirling.software.common.util.CustomHtmlSanitizer;
|
||||||
@@ -200,7 +201,10 @@ public class ConvertOfficeController {
|
|||||||
.matches();
|
.matches();
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/file/pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/file/pdf",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert a file to a PDF using LibreOffice",
|
summary = "Convert a file to a PDF using LibreOffice",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -27,6 +27,7 @@ import stirling.software.SPDF.model.api.converters.ConvertPdfToEpubRequest.Outpu
|
|||||||
import stirling.software.SPDF.model.api.converters.ConvertPdfToEpubRequest.TargetDevice;
|
import stirling.software.SPDF.model.api.converters.ConvertPdfToEpubRequest.TargetDevice;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.ProcessExecutor;
|
import stirling.software.common.util.ProcessExecutor;
|
||||||
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
|
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
|
||||||
@@ -81,7 +82,10 @@ public class ConvertPDFToEpubController {
|
|||||||
return command;
|
return command;
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/epub")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/pdf/epub",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert PDF to EPUB/AZW3",
|
summary = "Convert PDF to EPUB/AZW3",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -25,6 +25,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import stirling.software.SPDF.model.api.PDFWithPageNums;
|
import stirling.software.SPDF.model.api.PDFWithPageNums;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.TempFile;
|
import stirling.software.common.util.TempFile;
|
||||||
@@ -45,7 +46,10 @@ public class ConvertPDFToExcelController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/pdf/xlsx", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/pdf/xlsx",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert a PDF to an Excel spreadsheet (XLSX)",
|
summary = "Convert a PDF to an Excel spreadsheet (XLSX)",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -13,6 +13,7 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
import stirling.software.common.configuration.RuntimePathConfig;
|
import stirling.software.common.configuration.RuntimePathConfig;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.PDFFile;
|
import stirling.software.common.model.api.PDFFile;
|
||||||
import stirling.software.common.util.PDFToFile;
|
import stirling.software.common.util.PDFToFile;
|
||||||
import stirling.software.common.util.TempFileManager;
|
import stirling.software.common.util.TempFileManager;
|
||||||
@@ -24,7 +25,10 @@ public class ConvertPDFToHtml {
|
|||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
private final RuntimePathConfig runtimePathConfig;
|
private final RuntimePathConfig runtimePathConfig;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/html")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/pdf/html",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert PDF to HTML",
|
summary = "Convert PDF to HTML",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+17
-4
@@ -22,6 +22,7 @@ import stirling.software.SPDF.model.api.converters.PdfToWordRequest;
|
|||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
import stirling.software.common.configuration.RuntimePathConfig;
|
import stirling.software.common.configuration.RuntimePathConfig;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.PDFFile;
|
import stirling.software.common.model.api.PDFFile;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -38,7 +39,10 @@ public class ConvertPDFToOffice {
|
|||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
private final RuntimePathConfig runtimePathConfig;
|
private final RuntimePathConfig runtimePathConfig;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/presentation")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/pdf/presentation",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert PDF to Presentation format",
|
summary = "Convert PDF to Presentation format",
|
||||||
description =
|
description =
|
||||||
@@ -53,7 +57,10 @@ public class ConvertPDFToOffice {
|
|||||||
return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "impress_pdf_import");
|
return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "impress_pdf_import");
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/text")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/pdf/text",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert PDF to Text or RTF format",
|
summary = "Convert PDF to Text or RTF format",
|
||||||
description =
|
description =
|
||||||
@@ -83,7 +90,10 @@ public class ConvertPDFToOffice {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/word")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/pdf/word",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert PDF to Word document",
|
summary = "Convert PDF to Word document",
|
||||||
description =
|
description =
|
||||||
@@ -97,7 +107,10 @@ public class ConvertPDFToOffice {
|
|||||||
return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "writer_pdf_import");
|
return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "writer_pdf_import");
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/xml")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/pdf/xml",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert PDF to XML",
|
summary = "Convert PDF to XML",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -90,6 +90,7 @@ import stirling.software.SPDF.model.api.converters.PdfToPdfARequest;
|
|||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
import stirling.software.common.configuration.RuntimePathConfig;
|
import stirling.software.common.configuration.RuntimePathConfig;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.ProcessExecutor;
|
import stirling.software.common.util.ProcessExecutor;
|
||||||
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
|
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
|
||||||
@@ -572,7 +573,10 @@ public class ConvertPDFToPDFA {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/pdfa")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/pdf/pdfa",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert a PDF to a PDF/A or PDF/X",
|
summary = "Convert a PDF to a PDF/A or PDF/X",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+17
-5
@@ -32,6 +32,7 @@ import stirling.software.SPDF.model.json.PdfJsonMetadata;
|
|||||||
import stirling.software.SPDF.service.PdfJsonConversionService;
|
import stirling.software.SPDF.service.PdfJsonConversionService;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.GeneralFile;
|
import stirling.software.common.model.api.GeneralFile;
|
||||||
import stirling.software.common.model.api.PDFFile;
|
import stirling.software.common.model.api.PDFFile;
|
||||||
import stirling.software.common.service.JobOwnershipService;
|
import stirling.software.common.service.JobOwnershipService;
|
||||||
@@ -54,7 +55,10 @@ public class ConvertPdfJsonController {
|
|||||||
@Autowired(required = false)
|
@Autowired(required = false)
|
||||||
private JobOwnershipService jobOwnershipService;
|
private JobOwnershipService jobOwnershipService;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = "multipart/form-data", value = "/pdf/text-editor")
|
@AutoJobPostMapping(
|
||||||
|
consumes = "multipart/form-data",
|
||||||
|
value = "/pdf/text-editor",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert PDF to Text Editor Format",
|
summary = "Convert PDF to Text Editor Format",
|
||||||
description =
|
description =
|
||||||
@@ -92,7 +96,10 @@ public class ConvertPdfJsonController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = "multipart/form-data", value = "/text-editor/pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = "multipart/form-data",
|
||||||
|
value = "/text-editor/pdf",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert Text Editor Format to PDF",
|
summary = "Convert Text Editor Format to PDF",
|
||||||
@@ -123,7 +130,10 @@ public class ConvertPdfJsonController {
|
|||||||
return WebResponseUtils.pdfFileToWebResponse(tempOut, docName);
|
return WebResponseUtils.pdfFileToWebResponse(tempOut, docName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = "multipart/form-data", value = "/pdf/text-editor/metadata")
|
@AutoJobPostMapping(
|
||||||
|
consumes = "multipart/form-data",
|
||||||
|
value = "/pdf/text-editor/metadata",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Extract PDF metadata for text editor lazy loading",
|
summary = "Extract PDF metadata for text editor lazy loading",
|
||||||
description =
|
description =
|
||||||
@@ -165,7 +175,8 @@ public class ConvertPdfJsonController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
value = "/pdf/text-editor/partial/{jobId}",
|
value = "/pdf/text-editor/partial/{jobId}",
|
||||||
consumes = MediaType.APPLICATION_JSON_VALUE)
|
consumes = MediaType.APPLICATION_JSON_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Apply incremental edits from text editor to a cached PDF",
|
summary = "Apply incremental edits from text editor to a cached PDF",
|
||||||
@@ -269,7 +280,8 @@ public class ConvertPdfJsonController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
value = "/pdf/text-editor/clear-cache/{jobId}",
|
value = "/pdf/text-editor/clear-cache/{jobId}",
|
||||||
consumes = MediaType.ALL_VALUE)
|
consumes = MediaType.ALL_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Clear cached PDF document for text editor",
|
summary = "Clear cached PDF document for text editor",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+4
-1
@@ -49,7 +49,10 @@ public class ConvertPdfToVideoController {
|
|||||||
|
|
||||||
// ffmpeg disabled due to raised CVEs
|
// ffmpeg disabled due to raised CVEs
|
||||||
/*
|
/*
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/video")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/pdf/video",
|
||||||
|
resourceWeight = ResourceWeight.XLARGE_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert PDF to Video Slideshow",
|
summary = "Convert PDF to Video Slideshow",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -28,6 +28,7 @@ import stirling.software.SPDF.model.api.converters.SvgToPdfRequest;
|
|||||||
import stirling.software.SPDF.utils.SvgToPdf;
|
import stirling.software.SPDF.utils.SvgToPdf;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.SvgSanitizer;
|
import stirling.software.common.util.SvgSanitizer;
|
||||||
@@ -44,7 +45,10 @@ public class ConvertSvgToPDF {
|
|||||||
private final SvgSanitizer svgSanitizer;
|
private final SvgSanitizer svgSanitizer;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/svg/pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/svg/pdf",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@MultiFileResponse
|
@MultiFileResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert SVG to PDF",
|
summary = "Convert SVG to PDF",
|
||||||
|
|||||||
+5
-1
@@ -32,6 +32,7 @@ import stirling.software.SPDF.model.api.converters.UrlToPdfRequest;
|
|||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
import stirling.software.common.configuration.RuntimePathConfig;
|
import stirling.software.common.configuration.RuntimePathConfig;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.ApplicationProperties;
|
import stirling.software.common.model.ApplicationProperties;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
@@ -57,7 +58,10 @@ public class ConvertWebsiteToPDF {
|
|||||||
|
|
||||||
private static final Pattern NUMERIC_HTML_ENTITY_PATTERN = Pattern.compile("&#(x?[0-9a-f]+);");
|
private static final Pattern NUMERIC_HTML_ENTITY_PATTERN = Pattern.compile("&#(x?[0-9a-f]+);");
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/url/pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/url/pdf",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert a URL to a PDF",
|
summary = "Convert a URL to a PDF",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -30,6 +30,7 @@ import stirling.software.SPDF.pdf.parser.PdfModels.TableFragment;
|
|||||||
import stirling.software.SPDF.pdf.parser.TabulaTableParser;
|
import stirling.software.SPDF.pdf.parser.TabulaTableParser;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.WebResponseUtils;
|
import stirling.software.common.util.WebResponseUtils;
|
||||||
@@ -42,7 +43,10 @@ public class ExtractCSVController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TabulaTableParser tabulaTableParser;
|
private final TabulaTableParser tabulaTableParser;
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/pdf/csv", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/pdf/csv",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@CsvConversionResponse
|
@CsvConversionResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Extracts a CSV document from a PDF",
|
summary = "Extracts a CSV document from a PDF",
|
||||||
|
|||||||
+9
-2
@@ -26,6 +26,7 @@ import stirling.software.SPDF.config.EndpointConfiguration;
|
|||||||
import stirling.software.SPDF.model.api.converters.PdfVectorExportRequest;
|
import stirling.software.SPDF.model.api.converters.PdfVectorExportRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.ConvertApi;
|
import stirling.software.common.annotations.api.ConvertApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.ProcessExecutor;
|
import stirling.software.common.util.ProcessExecutor;
|
||||||
@@ -45,7 +46,10 @@ public class PdfVectorExportController {
|
|||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
private final EndpointConfiguration endpointConfiguration;
|
private final EndpointConfiguration endpointConfiguration;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/vector/pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/vector/pdf",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert PostScript formats to PDF",
|
summary = "Convert PostScript formats to PDF",
|
||||||
description =
|
description =
|
||||||
@@ -92,7 +96,10 @@ public class PdfVectorExportController {
|
|||||||
return WebResponseUtils.pdfFileToWebResponse(outputTemp, outputName);
|
return WebResponseUtils.pdfFileToWebResponse(outputTemp, outputName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/vector")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/pdf/vector",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert PDF to vector format",
|
summary = "Convert PDF to vector format",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+17
-6
@@ -27,6 +27,7 @@ import stirling.software.SPDF.model.api.filter.PageRotationRequest;
|
|||||||
import stirling.software.SPDF.model.api.filter.PageSizeRequest;
|
import stirling.software.SPDF.model.api.filter.PageSizeRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.FilterApi;
|
import stirling.software.common.annotations.api.FilterApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.PdfUtils;
|
import stirling.software.common.util.PdfUtils;
|
||||||
@@ -42,7 +43,8 @@ public class FilterController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
value = "/filter-contains-text")
|
value = "/filter-contains-text",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Checks if a PDF contains set text, returns true if does",
|
summary = "Checks if a PDF contains set text, returns true if does",
|
||||||
description = "Input:PDF Output:Boolean Type:SISO")
|
description = "Input:PDF Output:Boolean Type:SISO")
|
||||||
@@ -75,7 +77,8 @@ public class FilterController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
value = "/filter-contains-image")
|
value = "/filter-contains-image",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Checks if a PDF contains an image",
|
summary = "Checks if a PDF contains an image",
|
||||||
description = "Input:PDF Output:Boolean Type:SISO")
|
description = "Input:PDF Output:Boolean Type:SISO")
|
||||||
@@ -107,7 +110,8 @@ public class FilterController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
value = "/filter-page-count")
|
value = "/filter-page-count",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Checks if a PDF is greater, less or equal to a setPageCount",
|
summary = "Checks if a PDF is greater, less or equal to a setPageCount",
|
||||||
description = "Input:PDF Output:Boolean Type:SISO")
|
description = "Input:PDF Output:Boolean Type:SISO")
|
||||||
@@ -138,7 +142,10 @@ public class FilterController {
|
|||||||
: ResponseEntity.noContent().build();
|
: ResponseEntity.noContent().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/filter-page-size")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/filter-page-size",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Checks if a PDF is of a certain size",
|
summary = "Checks if a PDF is of a certain size",
|
||||||
description = "Input:PDF Output:Boolean Type:SISO")
|
description = "Input:PDF Output:Boolean Type:SISO")
|
||||||
@@ -175,7 +182,10 @@ public class FilterController {
|
|||||||
: ResponseEntity.noContent().build();
|
: ResponseEntity.noContent().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/filter-file-size")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/filter-file-size",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Checks if a PDF is a set file size",
|
summary = "Checks if a PDF is a set file size",
|
||||||
description = "Input:PDF Output:Boolean Type:SISO")
|
description = "Input:PDF Output:Boolean Type:SISO")
|
||||||
@@ -205,7 +215,8 @@ public class FilterController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
value = "/filter-page-rotation")
|
value = "/filter-page-rotation",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Checks if a PDF is of a certain rotation",
|
summary = "Checks if a PDF is of a certain rotation",
|
||||||
description = "Input:PDF Output:Boolean Type:SISO")
|
description = "Input:PDF Output:Boolean Type:SISO")
|
||||||
|
|||||||
+5
-1
@@ -23,6 +23,7 @@ import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
|||||||
import stirling.software.SPDF.model.api.misc.AddCommentsRequest;
|
import stirling.software.SPDF.model.api.misc.AddCommentsRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.comments.AnnotationLocation;
|
import stirling.software.common.model.api.comments.AnnotationLocation;
|
||||||
import stirling.software.common.model.api.comments.StickyNoteSpec;
|
import stirling.software.common.model.api.comments.StickyNoteSpec;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
@@ -66,7 +67,10 @@ public class AddCommentsController {
|
|||||||
private final PdfTextLocator pdfTextLocator;
|
private final PdfTextLocator pdfTextLocator;
|
||||||
private final ObjectMapper objectMapper;
|
private final ObjectMapper objectMapper;
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/add-comments", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/add-comments",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Add sticky-note comments to a PDF at specified positions or anchored text",
|
summary = "Add sticky-note comments to a PDF at specified positions or anchored text",
|
||||||
|
|||||||
+5
-1
@@ -28,6 +28,7 @@ import stirling.software.SPDF.model.api.misc.RenameAttachmentRequest;
|
|||||||
import stirling.software.SPDF.service.AttachmentServiceInterface;
|
import stirling.software.SPDF.service.AttachmentServiceInterface;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -48,7 +49,10 @@ public class AttachmentController {
|
|||||||
|
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/add-attachments")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/add-attachments",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Add attachments to PDF",
|
summary = "Add attachments to PDF",
|
||||||
|
|||||||
+5
-1
@@ -23,6 +23,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import stirling.software.SPDF.model.api.misc.ExtractHeaderRequest;
|
import stirling.software.SPDF.model.api.misc.ExtractHeaderRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.RegexPatternUtils;
|
import stirling.software.common.util.RegexPatternUtils;
|
||||||
import stirling.software.common.util.TempFileManager;
|
import stirling.software.common.util.TempFileManager;
|
||||||
@@ -39,7 +40,10 @@ public class AutoRenameController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/auto-rename")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/auto-rename",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Extract header from PDF file",
|
summary = "Extract header from PDF file",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -38,6 +38,7 @@ import stirling.software.SPDF.config.swagger.MultiFileResponse;
|
|||||||
import stirling.software.SPDF.model.api.misc.AutoSplitPdfRequest;
|
import stirling.software.SPDF.model.api.misc.AutoSplitPdfRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.ApplicationProperties;
|
import stirling.software.common.model.ApplicationProperties;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
@@ -267,7 +268,10 @@ public class AutoSplitPdfController {
|
|||||||
return QR_DETECTION_DPI;
|
return QR_DETECTION_DPI;
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/auto-split-pdf", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/auto-split-pdf",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@MultiFileResponse
|
@MultiFileResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Auto split PDF pages into separate documents",
|
summary = "Auto split PDF pages into separate documents",
|
||||||
|
|||||||
+5
-1
@@ -31,6 +31,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import stirling.software.SPDF.model.api.misc.RemoveBlankPagesRequest;
|
import stirling.software.SPDF.model.api.misc.RemoveBlankPagesRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.ApplicationProperties;
|
import stirling.software.common.model.ApplicationProperties;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ApplicationContextProvider;
|
import stirling.software.common.util.ApplicationContextProvider;
|
||||||
@@ -81,7 +82,10 @@ public class BlankPageController {
|
|||||||
return whitePixelPercentage >= whitePercent;
|
return whitePixelPercentage >= whitePercent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/remove-blanks")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/remove-blanks",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Remove blank pages from a PDF file",
|
summary = "Remove blank pages from a PDF file",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -49,6 +49,7 @@ import stirling.software.SPDF.config.EndpointConfiguration;
|
|||||||
import stirling.software.SPDF.model.api.misc.OptimizePdfRequest;
|
import stirling.software.SPDF.model.api.misc.OptimizePdfRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.service.LineArtConversionService;
|
import stirling.software.common.service.LineArtConversionService;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
@@ -922,7 +923,10 @@ public class CompressController {
|
|||||||
return Math.min(9, currentLevel + 1);
|
return Math.min(9, currentLevel + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/compress-pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/compress-pdf",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Optimize PDF file",
|
summary = "Optimize PDF file",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -22,6 +22,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
|
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.PDFFile;
|
import stirling.software.common.model.api.PDFFile;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
@@ -38,7 +39,10 @@ public class DecompressPdfController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/decompress-pdf", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/decompress-pdf",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Decompress PDF streams",
|
summary = "Decompress PDF streams",
|
||||||
description = "Fully decompresses all PDF streams including text content")
|
description = "Fully decompresses all PDF streams including text content")
|
||||||
|
|||||||
+3
-1
@@ -32,6 +32,7 @@ import stirling.software.SPDF.config.swagger.MultiFileResponse;
|
|||||||
import stirling.software.SPDF.model.api.misc.ExtractImageScansRequest;
|
import stirling.software.SPDF.model.api.misc.ExtractImageScansRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.ApplicationProperties;
|
import stirling.software.common.model.ApplicationProperties;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ApplicationContextProvider;
|
import stirling.software.common.util.ApplicationContextProvider;
|
||||||
@@ -56,7 +57,8 @@ public class ExtractImageScansController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
value = "/extract-image-scans")
|
value = "/extract-image-scans",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@MultiFileResponse
|
@MultiFileResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Extract image scans from an input file",
|
summary = "Extract image scans from an input file",
|
||||||
|
|||||||
+5
-1
@@ -34,6 +34,7 @@ import stirling.software.SPDF.config.swagger.MultiFileResponse;
|
|||||||
import stirling.software.SPDF.model.api.PDFExtractImagesRequest;
|
import stirling.software.SPDF.model.api.PDFExtractImagesRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -49,7 +50,10 @@ public class ExtractImagesController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/extract-images")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/extract-images",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@MultiFileResponse
|
@MultiFileResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Extract images from a PDF file",
|
summary = "Extract images from a PDF file",
|
||||||
|
|||||||
+5
-1
@@ -27,6 +27,7 @@ import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
|||||||
import stirling.software.SPDF.model.api.misc.FlattenRequest;
|
import stirling.software.SPDF.model.api.misc.FlattenRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.ApplicationProperties;
|
import stirling.software.common.model.ApplicationProperties;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ApplicationContextProvider;
|
import stirling.software.common.util.ApplicationContextProvider;
|
||||||
@@ -42,7 +43,10 @@ public class FlattenController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/flatten")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/flatten",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Flatten PDF form fields or full page",
|
summary = "Flatten PDF form fields or full page",
|
||||||
|
|||||||
+5
-1
@@ -25,6 +25,7 @@ import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
|||||||
import stirling.software.SPDF.model.api.misc.MetadataRequest;
|
import stirling.software.SPDF.model.api.misc.MetadataRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.service.PdfMetadataService;
|
import stirling.software.common.service.PdfMetadataService;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -56,7 +57,10 @@ public class MetadataController {
|
|||||||
binder.registerCustomEditor(Map.class, "allRequestParams", new StringToMapPropertyEditor());
|
binder.registerCustomEditor(Map.class, "allRequestParams", new StringToMapPropertyEditor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/update-metadata")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/update-metadata",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Update metadata of a PDF file",
|
summary = "Update metadata of a PDF file",
|
||||||
|
|||||||
+5
-1
@@ -38,6 +38,7 @@ import stirling.software.SPDF.model.api.misc.ProcessPdfWithOcrRequest;
|
|||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
import stirling.software.common.configuration.RuntimePathConfig;
|
import stirling.software.common.configuration.RuntimePathConfig;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.ApplicationProperties;
|
import stirling.software.common.model.ApplicationProperties;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
@@ -82,7 +83,10 @@ public class OCRController {
|
|||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/ocr-pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/ocr-pdf",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Process a PDF file with OCR",
|
summary = "Process a PDF file with OCR",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -22,6 +22,7 @@ import stirling.software.SPDF.model.api.misc.OverlayImageRequest;
|
|||||||
import stirling.software.SPDF.utils.SvgOverlayUtil;
|
import stirling.software.SPDF.utils.SvgOverlayUtil;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.TempFile;
|
import stirling.software.common.util.TempFile;
|
||||||
@@ -36,7 +37,10 @@ public class OverlayImageController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/add-image")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/add-image",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Overlay image onto a PDF file",
|
summary = "Overlay image onto a PDF file",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -26,6 +26,7 @@ import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
|||||||
import stirling.software.SPDF.model.api.misc.AddPageNumbersRequest;
|
import stirling.software.SPDF.model.api.misc.AddPageNumbersRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.TempFile;
|
import stirling.software.common.util.TempFile;
|
||||||
@@ -39,7 +40,10 @@ public class PageNumbersController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/add-page-numbers", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/add-page-numbers",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Add page numbers to a PDF document",
|
summary = "Add page numbers to a PDF document",
|
||||||
|
|||||||
+5
-1
@@ -25,6 +25,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
|
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.GeneralApi;
|
import stirling.software.common.annotations.api.GeneralApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.PDFFile;
|
import stirling.software.common.model.api.PDFFile;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
@@ -41,7 +42,10 @@ public class RemoveImagesController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/remove-image-pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/remove-image-pdf",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Remove images from PDF",
|
summary = "Remove images from PDF",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -19,6 +19,7 @@ import stirling.software.SPDF.config.EndpointConfiguration;
|
|||||||
import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.PDFFile;
|
import stirling.software.common.model.api.PDFFile;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
@@ -46,7 +47,10 @@ public class RepairController {
|
|||||||
return endpointConfiguration.isGroupEnabled("qpdf");
|
return endpointConfiguration.isGroupEnabled("qpdf");
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/repair")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/repair",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Repair a PDF file",
|
summary = "Repair a PDF file",
|
||||||
|
|||||||
+3
-1
@@ -19,6 +19,7 @@ import stirling.software.SPDF.model.api.misc.ReplaceAndInvertColorRequest;
|
|||||||
import stirling.software.SPDF.service.misc.ReplaceAndInvertColorService;
|
import stirling.software.SPDF.service.misc.ReplaceAndInvertColorService;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.TempFile;
|
import stirling.software.common.util.TempFile;
|
||||||
import stirling.software.common.util.TempFileManager;
|
import stirling.software.common.util.TempFileManager;
|
||||||
@@ -33,7 +34,8 @@ public class ReplaceAndInvertColorController {
|
|||||||
|
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
value = "/replace-invert-pdf")
|
value = "/replace-invert-pdf",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Replace-Invert Color PDF",
|
summary = "Replace-Invert Color PDF",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -46,6 +46,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import stirling.software.SPDF.model.api.misc.ScannerEffectRequest;
|
import stirling.software.SPDF.model.api.misc.ScannerEffectRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.ApplicationProperties;
|
import stirling.software.common.model.ApplicationProperties;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ApplicationContextProvider;
|
import stirling.software.common.util.ApplicationContextProvider;
|
||||||
@@ -559,7 +560,10 @@ public class ScannerEffectController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/scanner-effect", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/scanner-effect",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Apply scanner effect to PDF",
|
summary = "Apply scanner effect to PDF",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -21,6 +21,7 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import stirling.software.SPDF.config.swagger.JavaScriptResponse;
|
import stirling.software.SPDF.config.swagger.JavaScriptResponse;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.PDFFile;
|
import stirling.software.common.model.api.PDFFile;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.TempFile;
|
import stirling.software.common.util.TempFile;
|
||||||
@@ -34,7 +35,10 @@ public class ShowJavascript {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/show-javascript")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/show-javascript",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@JavaScriptResponse
|
@JavaScriptResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Grabs all JS from a PDF and returns a single JS file with all code",
|
summary = "Grabs all JS from a PDF and returns a single JS file with all code",
|
||||||
|
|||||||
+5
-1
@@ -46,6 +46,7 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import stirling.software.SPDF.model.api.misc.AddStampRequest;
|
import stirling.software.SPDF.model.api.misc.AddStampRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -86,7 +87,10 @@ public class StampController {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/add-stamp")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/add-stamp",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Add stamp to a PDF file",
|
summary = "Add stamp to a PDF file",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+5
-1
@@ -23,6 +23,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.MiscApi;
|
import stirling.software.common.annotations.api.MiscApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.PDFFile;
|
import stirling.software.common.model.api.PDFFile;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -42,7 +43,10 @@ public class UnlockPDFFormsController {
|
|||||||
this.tempFileManager = tempFileManager;
|
this.tempFileManager = tempFileManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/unlock-pdf-forms")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/unlock-pdf-forms",
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Remove read-only property from form fields",
|
summary = "Remove read-only property from form fields",
|
||||||
|
|||||||
+5
-1
@@ -26,6 +26,7 @@ import stirling.software.SPDF.model.PipelineResult;
|
|||||||
import stirling.software.SPDF.model.api.HandleDataRequest;
|
import stirling.software.SPDF.model.api.HandleDataRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.PipelineApi;
|
import stirling.software.common.annotations.api.PipelineApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.PostHogService;
|
import stirling.software.common.service.PostHogService;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.TempFile;
|
import stirling.software.common.util.TempFile;
|
||||||
@@ -49,7 +50,10 @@ public class PipelineController {
|
|||||||
|
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/handleData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/handleData",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@MultiFileResponse
|
@MultiFileResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Execute automated PDF processing pipeline",
|
summary = "Execute automated PDF processing pipeline",
|
||||||
|
|||||||
+3
-1
@@ -75,6 +75,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
||||||
import stirling.software.SPDF.model.api.security.SignPDFWithCertRequest;
|
import stirling.software.SPDF.model.api.security.SignPDFWithCertRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.service.ServerCertificateServiceInterface;
|
import stirling.software.common.service.ServerCertificateServiceInterface;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
@@ -160,7 +161,8 @@ public class CertSignController {
|
|||||||
MediaType.MULTIPART_FORM_DATA_VALUE,
|
MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
MediaType.APPLICATION_FORM_URLENCODED_VALUE
|
MediaType.APPLICATION_FORM_URLENCODED_VALUE
|
||||||
},
|
},
|
||||||
value = "/cert-sign")
|
value = "/cert-sign",
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Sign PDF with a Digital Certificate",
|
summary = "Sign PDF with a Digital Certificate",
|
||||||
|
|||||||
+5
-1
@@ -56,6 +56,7 @@ import stirling.software.SPDF.model.api.security.PDFVerificationResult;
|
|||||||
import stirling.software.SPDF.service.VeraPDFService;
|
import stirling.software.SPDF.service.VeraPDFService;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.SecurityApi;
|
import stirling.software.common.annotations.api.SecurityApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.PDFFile;
|
import stirling.software.common.model.api.PDFFile;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
@@ -1061,7 +1062,10 @@ public class GetInfoOnPDF {
|
|||||||
return stats;
|
return stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/get-info-on-pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/get-info-on-pdf",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Get comprehensive PDF information",
|
summary = "Get comprehensive PDF information",
|
||||||
description =
|
description =
|
||||||
|
|||||||
+9
-2
@@ -20,6 +20,7 @@ import stirling.software.SPDF.model.api.security.AddPasswordRequest;
|
|||||||
import stirling.software.SPDF.model.api.security.PDFPasswordRequest;
|
import stirling.software.SPDF.model.api.security.PDFPasswordRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.SecurityApi;
|
import stirling.software.common.annotations.api.SecurityApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -33,7 +34,10 @@ public class PasswordController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/remove-password")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/remove-password",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Remove password from a PDF file",
|
summary = "Remove password from a PDF file",
|
||||||
@@ -62,7 +66,10 @@ public class PasswordController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/add-password")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/add-password",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Add password to a PDF file",
|
summary = "Add password to a PDF file",
|
||||||
|
|||||||
+9
-2
@@ -59,6 +59,7 @@ import stirling.software.SPDF.utils.text.TextFinderUtils;
|
|||||||
import stirling.software.SPDF.utils.text.WidthCalculator;
|
import stirling.software.SPDF.utils.text.WidthCalculator;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.SecurityApi;
|
import stirling.software.common.annotations.api.SecurityApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.security.RedactionArea;
|
import stirling.software.common.model.api.security.RedactionArea;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
@@ -101,7 +102,10 @@ public class RedactController {
|
|||||||
new StringToArrayListPropertyEditor<>(RedactionArea.class));
|
new StringToArrayListPropertyEditor<>(RedactionArea.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/redact", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/redact",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
operationId = "redactPdfManual",
|
operationId = "redactPdfManual",
|
||||||
@@ -494,7 +498,10 @@ public class RedactController {
|
|||||||
return pageNumbers;
|
return pageNumbers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(value = "/auto-redact", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/auto-redact",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.LARGE_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Redact PDF automatically",
|
summary = "Redact PDF automatically",
|
||||||
|
|||||||
+5
-1
@@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.SecurityApi;
|
import stirling.software.common.annotations.api.SecurityApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.api.PDFFile;
|
import stirling.software.common.model.api.PDFFile;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -33,7 +34,10 @@ public class RemoveCertSignController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/remove-cert-sign")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/remove-cert-sign",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Remove digital signature from PDF",
|
summary = "Remove digital signature from PDF",
|
||||||
|
|||||||
+5
-1
@@ -39,6 +39,7 @@ import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
|||||||
import stirling.software.SPDF.model.api.security.SanitizePdfRequest;
|
import stirling.software.SPDF.model.api.security.SanitizePdfRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.SecurityApi;
|
import stirling.software.common.annotations.api.SecurityApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.TempFileManager;
|
import stirling.software.common.util.TempFileManager;
|
||||||
@@ -52,7 +53,10 @@ public class SanitizeController {
|
|||||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/sanitize-pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/sanitize-pdf",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Sanitize a PDF file",
|
summary = "Sanitize a PDF file",
|
||||||
|
|||||||
+5
-1
@@ -43,6 +43,7 @@ import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
|||||||
import stirling.software.SPDF.model.api.security.TimestampPdfRequest;
|
import stirling.software.SPDF.model.api.security.TimestampPdfRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.SecurityApi;
|
import stirling.software.common.annotations.api.SecurityApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.model.ApplicationProperties;
|
import stirling.software.common.model.ApplicationProperties;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
@@ -78,7 +79,10 @@ public class TimestampController {
|
|||||||
private final ApplicationProperties applicationProperties;
|
private final ApplicationProperties applicationProperties;
|
||||||
private final TempFileManager tempFileManager;
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/timestamp-pdf")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/timestamp-pdf",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Add RFC 3161 document timestamp to a PDF",
|
summary = "Add RFC 3161 document timestamp to a PDF",
|
||||||
|
|||||||
+3
-1
@@ -42,6 +42,7 @@ import stirling.software.SPDF.model.api.security.SignatureValidationResult;
|
|||||||
import stirling.software.SPDF.service.CertificateValidationService;
|
import stirling.software.SPDF.service.CertificateValidationService;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.SecurityApi;
|
import stirling.software.common.annotations.api.SecurityApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
|
|
||||||
@@ -74,7 +75,8 @@ public class ValidateSignatureController {
|
|||||||
+ " Input:PDF Output:JSON Type:SISO")
|
+ " Input:PDF Output:JSON Type:SISO")
|
||||||
@AutoJobPostMapping(
|
@AutoJobPostMapping(
|
||||||
value = "/validate-signature",
|
value = "/validate-signature",
|
||||||
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
public ResponseEntity<List<SignatureValidationResult>> validateSignature(
|
public ResponseEntity<List<SignatureValidationResult>> validateSignature(
|
||||||
@ModelAttribute SignatureValidationRequest request) throws IOException {
|
@ModelAttribute SignatureValidationRequest request) throws IOException {
|
||||||
List<SignatureValidationResult> results = new ArrayList<>();
|
List<SignatureValidationResult> results = new ArrayList<>();
|
||||||
|
|||||||
+5
-1
@@ -21,6 +21,7 @@ import stirling.software.SPDF.model.api.security.PDFVerificationResult;
|
|||||||
import stirling.software.SPDF.service.VeraPDFService;
|
import stirling.software.SPDF.service.VeraPDFService;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.SecurityApi;
|
import stirling.software.common.annotations.api.SecurityApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.util.ExceptionUtils;
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
|
|
||||||
@SecurityApi
|
@SecurityApi
|
||||||
@@ -37,7 +38,10 @@ public class VerifyPDFController {
|
|||||||
+ "Automatically detects PDF/A, PDF/UA-1, PDF/UA-2, and WTPDF standards "
|
+ "Automatically detects PDF/A, PDF/UA-1, PDF/UA-2, and WTPDF standards "
|
||||||
+ "from the document's XMP metadata and validates compliance. "
|
+ "from the document's XMP metadata and validates compliance. "
|
||||||
+ "Input:PDF Output:JSON Type:SISO")
|
+ "Input:PDF Output:JSON Type:SISO")
|
||||||
@AutoJobPostMapping(value = "/verify-pdf", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@AutoJobPostMapping(
|
||||||
|
value = "/verify-pdf",
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
resourceWeight = ResourceWeight.SMALL_WEIGHT)
|
||||||
public ResponseEntity<List<PDFVerificationResult>> verifyPDF(
|
public ResponseEntity<List<PDFVerificationResult>> verifyPDF(
|
||||||
@ModelAttribute PDFVerificationRequest request) {
|
@ModelAttribute PDFVerificationRequest request) {
|
||||||
|
|
||||||
|
|||||||
+5
-1
@@ -42,6 +42,7 @@ import stirling.software.SPDF.config.swagger.StandardPdfResponse;
|
|||||||
import stirling.software.SPDF.model.api.security.AddWatermarkRequest;
|
import stirling.software.SPDF.model.api.security.AddWatermarkRequest;
|
||||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||||
import stirling.software.common.annotations.api.SecurityApi;
|
import stirling.software.common.annotations.api.SecurityApi;
|
||||||
|
import stirling.software.common.enumeration.ResourceWeight;
|
||||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
import stirling.software.common.util.GeneralUtils;
|
import stirling.software.common.util.GeneralUtils;
|
||||||
import stirling.software.common.util.PdfUtils;
|
import stirling.software.common.util.PdfUtils;
|
||||||
@@ -68,7 +69,10 @@ public class WatermarkController {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/add-watermark")
|
@AutoJobPostMapping(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
|
||||||
|
value = "/add-watermark",
|
||||||
|
resourceWeight = ResourceWeight.MEDIUM_WEIGHT)
|
||||||
@StandardPdfResponse
|
@StandardPdfResponse
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Add watermark to a PDF file",
|
summary = "Add watermark to a PDF file",
|
||||||
|
|||||||
+39
@@ -0,0 +1,39 @@
|
|||||||
|
package stirling.software.proprietary.audit;
|
||||||
|
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.Hidden;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
import stirling.software.proprietary.config.AuditConfigurationProperties;
|
||||||
|
import stirling.software.proprietary.security.config.EnterpriseEndpoint;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@EnterpriseEndpoint
|
||||||
|
public class AuditDashboardWebController {
|
||||||
|
private final AuditConfigurationProperties auditConfig;
|
||||||
|
|
||||||
|
/** Display the audit dashboard. */
|
||||||
|
@GetMapping("/audit")
|
||||||
|
@Hidden
|
||||||
|
public String showDashboard(Model model) {
|
||||||
|
model.addAttribute("auditEnabled", auditConfig.isEnabled());
|
||||||
|
model.addAttribute("auditLevel", auditConfig.getAuditLevel());
|
||||||
|
model.addAttribute("auditLevelInt", auditConfig.getLevel());
|
||||||
|
model.addAttribute("retentionDays", auditConfig.getRetentionDays());
|
||||||
|
|
||||||
|
// Add audit level enum values for display
|
||||||
|
model.addAttribute("auditLevels", AuditLevel.values());
|
||||||
|
|
||||||
|
// Add audit event types for the dropdown
|
||||||
|
model.addAttribute("auditEventTypes", AuditEventType.values());
|
||||||
|
|
||||||
|
return "audit/dashboard";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -50,13 +50,7 @@ public class AsyncConfig {
|
|||||||
return adapter;
|
return adapter;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Propagates the request's SecurityContext onto background AI-orchestration threads. */
|
||||||
* AI orchestration runs on a background executor, so the incoming request's {@code
|
|
||||||
* SecurityContext} must be propagated for downstream calls to see the authenticated user.
|
|
||||||
* Without this, {@code JobOwnershipService} scopes job keys without a user prefix and
|
|
||||||
* authenticated downloads fail with 403; {@code InternalApiClient} also falls back to the
|
|
||||||
* internal-API-user key instead of the caller's.
|
|
||||||
*/
|
|
||||||
@Bean(name = "aiStreamExecutor")
|
@Bean(name = "aiStreamExecutor")
|
||||||
public Executor aiStreamExecutor() {
|
public Executor aiStreamExecutor() {
|
||||||
TaskExecutorAdapter adapter =
|
TaskExecutorAdapter adapter =
|
||||||
|
|||||||
+4
-4
@@ -27,7 +27,7 @@ import stirling.software.common.service.TaskManager;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RequestMapping("/api/v1/admin")
|
@RequestMapping("/api/v1/admin")
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@Tag(name = "Admin Job Management", description = "Admin-only Job Management APIs")
|
@Tag(name = "Admin Job Management", description = "Admin-only Job Management APIs")
|
||||||
public class AdminJobController {
|
public class AdminJobController {
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ public class AdminJobController {
|
|||||||
*/
|
*/
|
||||||
@GetMapping("/job/stats")
|
@GetMapping("/job/stats")
|
||||||
@Operation(summary = "Get job statistics")
|
@Operation(summary = "Get job statistics")
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
public ResponseEntity<JobStats> getJobStats() {
|
public ResponseEntity<JobStats> getJobStats() {
|
||||||
JobStats stats = taskManager.getJobStats();
|
JobStats stats = taskManager.getJobStats();
|
||||||
log.info(
|
log.info(
|
||||||
@@ -58,7 +58,7 @@ public class AdminJobController {
|
|||||||
*/
|
*/
|
||||||
@GetMapping("/job/queue/stats")
|
@GetMapping("/job/queue/stats")
|
||||||
@Operation(summary = "Get job queue statistics")
|
@Operation(summary = "Get job queue statistics")
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
public ResponseEntity<?> getQueueStats() {
|
public ResponseEntity<?> getQueueStats() {
|
||||||
Map<String, Object> queueStats = jobQueue.getQueueStats();
|
Map<String, Object> queueStats = jobQueue.getQueueStats();
|
||||||
log.info("Admin requested queue stats: {} queued jobs", queueStats.get("queuedJobs"));
|
log.info("Admin requested queue stats: {} queued jobs", queueStats.get("queuedJobs"));
|
||||||
@@ -72,7 +72,7 @@ public class AdminJobController {
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/job/cleanup")
|
@PostMapping("/job/cleanup")
|
||||||
@Operation(summary = "Cleanup old jobs")
|
@Operation(summary = "Cleanup old jobs")
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
public ResponseEntity<?> cleanupOldJobs() {
|
public ResponseEntity<?> cleanupOldJobs() {
|
||||||
int beforeCount = taskManager.getJobStats().getTotalJobs();
|
int beforeCount = taskManager.getJobStats().getTotalJobs();
|
||||||
taskManager.cleanupOldJobs();
|
taskManager.cleanupOldJobs();
|
||||||
|
|||||||
+1
-1
@@ -52,7 +52,7 @@ import tools.jackson.databind.ObjectMapper;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/v1/audit")
|
@RequestMapping("/api/v1/audit")
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@EnterpriseEndpoint
|
@EnterpriseEndpoint
|
||||||
@Tag(name = "Audit", description = "Only Enterprise - Audit related operations")
|
@Tag(name = "Audit", description = "Only Enterprise - Audit related operations")
|
||||||
|
|||||||
+7
-7
@@ -46,7 +46,7 @@ import stirling.software.proprietary.security.model.User;
|
|||||||
import stirling.software.proprietary.security.model.dto.AdminUserSummary;
|
import stirling.software.proprietary.security.model.dto.AdminUserSummary;
|
||||||
import stirling.software.proprietary.security.repository.TeamRepository;
|
import stirling.software.proprietary.security.repository.TeamRepository;
|
||||||
import stirling.software.proprietary.security.saml2.CustomSaml2AuthenticatedPrincipal;
|
import stirling.software.proprietary.security.saml2.CustomSaml2AuthenticatedPrincipal;
|
||||||
import stirling.software.proprietary.security.service.DatabaseService;
|
import stirling.software.proprietary.security.service.DatabaseServiceInterface;
|
||||||
import stirling.software.proprietary.security.service.LoginAttemptService;
|
import stirling.software.proprietary.security.service.LoginAttemptService;
|
||||||
import stirling.software.proprietary.security.service.MfaService;
|
import stirling.software.proprietary.security.service.MfaService;
|
||||||
import stirling.software.proprietary.security.service.TeamService;
|
import stirling.software.proprietary.security.service.TeamService;
|
||||||
@@ -66,7 +66,7 @@ public class ProprietaryUIDataController {
|
|||||||
private final UserRepository userRepository;
|
private final UserRepository userRepository;
|
||||||
private final TeamRepository teamRepository;
|
private final TeamRepository teamRepository;
|
||||||
private final SessionRepository sessionRepository;
|
private final SessionRepository sessionRepository;
|
||||||
private final DatabaseService databaseService;
|
private final DatabaseServiceInterface databaseService;
|
||||||
private final boolean runningEE;
|
private final boolean runningEE;
|
||||||
private final ObjectMapper objectMapper;
|
private final ObjectMapper objectMapper;
|
||||||
private final UserLicenseSettingsService licenseSettingsService;
|
private final UserLicenseSettingsService licenseSettingsService;
|
||||||
@@ -81,7 +81,7 @@ public class ProprietaryUIDataController {
|
|||||||
UserRepository userRepository,
|
UserRepository userRepository,
|
||||||
TeamRepository teamRepository,
|
TeamRepository teamRepository,
|
||||||
SessionRepository sessionRepository,
|
SessionRepository sessionRepository,
|
||||||
DatabaseService databaseService,
|
DatabaseServiceInterface databaseService,
|
||||||
ObjectMapper objectMapper,
|
ObjectMapper objectMapper,
|
||||||
@Qualifier("runningEE") boolean runningEE,
|
@Qualifier("runningEE") boolean runningEE,
|
||||||
UserLicenseSettingsService licenseSettingsService,
|
UserLicenseSettingsService licenseSettingsService,
|
||||||
@@ -251,7 +251,7 @@ public class ProprietaryUIDataController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/admin-settings")
|
@GetMapping("/admin-settings")
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@Operation(summary = "Get admin settings data")
|
@Operation(summary = "Get admin settings data")
|
||||||
public ResponseEntity<AdminSettingsData> getAdminSettingsData(Authentication authentication) {
|
public ResponseEntity<AdminSettingsData> getAdminSettingsData(Authentication authentication) {
|
||||||
List<User> allUsers = userRepository.findAllWithTeam();
|
List<User> allUsers = userRepository.findAllWithTeam();
|
||||||
@@ -450,7 +450,7 @@ public class ProprietaryUIDataController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/teams")
|
@GetMapping("/teams")
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@Operation(summary = "Get teams list data")
|
@Operation(summary = "Get teams list data")
|
||||||
public ResponseEntity<TeamsData> getTeamsData() {
|
public ResponseEntity<TeamsData> getTeamsData() {
|
||||||
List<TeamWithUserCountDTO> allTeamsWithCounts = teamRepository.findAllTeamsWithUserCount();
|
List<TeamWithUserCountDTO> allTeamsWithCounts = teamRepository.findAllTeamsWithUserCount();
|
||||||
@@ -476,7 +476,7 @@ public class ProprietaryUIDataController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/teams/{id}")
|
@GetMapping("/teams/{id}")
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@Operation(summary = "Get team details data")
|
@Operation(summary = "Get team details data")
|
||||||
public ResponseEntity<TeamDetailsData> getTeamDetailsData(@PathVariable("id") Long id) {
|
public ResponseEntity<TeamDetailsData> getTeamDetailsData(@PathVariable("id") Long id) {
|
||||||
Team team =
|
Team team =
|
||||||
@@ -520,7 +520,7 @@ public class ProprietaryUIDataController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/database")
|
@GetMapping("/database")
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@Operation(summary = "Get database management data")
|
@Operation(summary = "Get database management data")
|
||||||
public ResponseEntity<DatabaseData> getDatabaseData() {
|
public ResponseEntity<DatabaseData> getDatabaseData() {
|
||||||
List<FileInfo> backupList = databaseService.getBackupList();
|
List<FileInfo> backupList = databaseService.getBackupList();
|
||||||
|
|||||||
+2
@@ -1,5 +1,6 @@
|
|||||||
package stirling.software.proprietary.security;
|
package stirling.software.proprietary.security;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -8,6 +9,7 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import stirling.software.proprietary.security.filter.IPRateLimitingFilter;
|
import stirling.software.proprietary.security.filter.IPRateLimitingFilter;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
|
@Profile("!saas")
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class RateLimitResetScheduler {
|
public class RateLimitResetScheduler {
|
||||||
|
|
||||||
|
|||||||
+2
@@ -12,6 +12,7 @@ import org.springframework.boot.persistence.autoconfigure.EntityScan;
|
|||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Primary;
|
import org.springframework.context.annotation.Primary;
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -71,6 +72,7 @@ public class DatabaseConfig {
|
|||||||
@Bean
|
@Bean
|
||||||
@Qualifier("dataSource")
|
@Qualifier("dataSource")
|
||||||
@Primary
|
@Primary
|
||||||
|
@Profile("!saas")
|
||||||
public DataSource dataSource() throws UnsupportedProviderException {
|
public DataSource dataSource() throws UnsupportedProviderException {
|
||||||
DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create();
|
DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create();
|
||||||
|
|
||||||
|
|||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
package stirling.software.proprietary.security.configuration;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
|
|
||||||
|
/** Standalone {@link PasswordEncoder} bean. */
|
||||||
|
@Configuration
|
||||||
|
public class PasswordEncoderConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public PasswordEncoder passwordEncoder() {
|
||||||
|
return new BCryptPasswordEncoder();
|
||||||
|
}
|
||||||
|
}
|
||||||
+8
-10
@@ -9,6 +9,7 @@ import org.springframework.context.annotation.Bean;
|
|||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.DependsOn;
|
import org.springframework.context.annotation.DependsOn;
|
||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
import org.springframework.core.annotation.Order;
|
import org.springframework.core.annotation.Order;
|
||||||
import org.springframework.security.authentication.ProviderManager;
|
import org.springframework.security.authentication.ProviderManager;
|
||||||
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
|
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
|
||||||
@@ -20,7 +21,6 @@ import org.springframework.security.config.annotation.web.configurers.CsrfConfig
|
|||||||
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer.FrameOptionsConfig;
|
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer.FrameOptionsConfig;
|
||||||
import org.springframework.security.config.http.SessionCreationPolicy;
|
import org.springframework.security.config.http.SessionCreationPolicy;
|
||||||
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
|
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
|
||||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
||||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
|
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
|
||||||
import org.springframework.security.saml2.provider.service.authentication.OpenSaml5AuthenticationProvider;
|
import org.springframework.security.saml2.provider.service.authentication.OpenSaml5AuthenticationProvider;
|
||||||
@@ -69,6 +69,7 @@ import stirling.software.proprietary.security.session.SessionPersistentRegistry;
|
|||||||
@EnableWebSecurity
|
@EnableWebSecurity
|
||||||
@EnableMethodSecurity
|
@EnableMethodSecurity
|
||||||
@DependsOn("runningProOrHigher")
|
@DependsOn("runningProOrHigher")
|
||||||
|
@Profile("!saas")
|
||||||
public class SecurityConfiguration {
|
public class SecurityConfiguration {
|
||||||
|
|
||||||
private final CustomUserDetailsService userDetailsService;
|
private final CustomUserDetailsService userDetailsService;
|
||||||
@@ -91,6 +92,7 @@ public class SecurityConfiguration {
|
|||||||
private final stirling.software.proprietary.service.UserLicenseSettingsService
|
private final stirling.software.proprietary.service.UserLicenseSettingsService
|
||||||
licenseSettingsService;
|
licenseSettingsService;
|
||||||
private final ClientRegistrationRepository clientRegistrationRepository;
|
private final ClientRegistrationRepository clientRegistrationRepository;
|
||||||
|
private final PasswordEncoder passwordEncoder;
|
||||||
|
|
||||||
public SecurityConfiguration(
|
public SecurityConfiguration(
|
||||||
PersistentLoginRepository persistentLoginRepository,
|
PersistentLoginRepository persistentLoginRepository,
|
||||||
@@ -112,8 +114,8 @@ public class SecurityConfiguration {
|
|||||||
@Autowired(required = false)
|
@Autowired(required = false)
|
||||||
OpenSaml5AuthenticationRequestResolver saml2AuthenticationRequestResolver,
|
OpenSaml5AuthenticationRequestResolver saml2AuthenticationRequestResolver,
|
||||||
@Autowired(required = false) ClientRegistrationRepository clientRegistrationRepository,
|
@Autowired(required = false) ClientRegistrationRepository clientRegistrationRepository,
|
||||||
stirling.software.proprietary.service.UserLicenseSettingsService
|
stirling.software.proprietary.service.UserLicenseSettingsService licenseSettingsService,
|
||||||
licenseSettingsService) {
|
PasswordEncoder passwordEncoder) {
|
||||||
this.userDetailsService = userDetailsService;
|
this.userDetailsService = userDetailsService;
|
||||||
this.userService = userService;
|
this.userService = userService;
|
||||||
this.loginEnabledValue = loginEnabledValue;
|
this.loginEnabledValue = loginEnabledValue;
|
||||||
@@ -132,11 +134,7 @@ public class SecurityConfiguration {
|
|||||||
this.saml2AuthenticationRequestResolver = saml2AuthenticationRequestResolver;
|
this.saml2AuthenticationRequestResolver = saml2AuthenticationRequestResolver;
|
||||||
this.clientRegistrationRepository = clientRegistrationRepository;
|
this.clientRegistrationRepository = clientRegistrationRepository;
|
||||||
this.licenseSettingsService = licenseSettingsService;
|
this.licenseSettingsService = licenseSettingsService;
|
||||||
}
|
this.passwordEncoder = passwordEncoder;
|
||||||
|
|
||||||
@Bean
|
|
||||||
public static PasswordEncoder passwordEncoder() {
|
|
||||||
return new BCryptPasswordEncoder();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -293,7 +291,7 @@ public class SecurityConfiguration {
|
|||||||
|
|
||||||
http.addFilterBefore(
|
http.addFilterBefore(
|
||||||
userAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
|
userAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
|
||||||
// TODO: IPRateLimitingFilter disabled — limit is 1M (no-op) and raw Filter
|
// TODO: IPRateLimitingFilter disabled (limit is 1M, no-op) and raw Filter
|
||||||
// impl causes Spring Security async dispatch bug (response already committed
|
// impl causes Spring Security async dispatch bug (response already committed
|
||||||
// errors on StreamingResponseBody endpoints). Re-enable once converted to
|
// errors on StreamingResponseBody endpoints). Re-enable once converted to
|
||||||
// OncePerRequestFilter with proper config-driven limits.
|
// OncePerRequestFilter with proper config-driven limits.
|
||||||
@@ -462,7 +460,7 @@ public class SecurityConfiguration {
|
|||||||
|
|
||||||
public DaoAuthenticationProvider daoAuthenticationProvider() {
|
public DaoAuthenticationProvider daoAuthenticationProvider() {
|
||||||
DaoAuthenticationProvider provider = new DaoAuthenticationProvider(userDetailsService);
|
DaoAuthenticationProvider provider = new DaoAuthenticationProvider(userDetailsService);
|
||||||
provider.setPasswordEncoder(passwordEncoder());
|
provider.setPasswordEncoder(passwordEncoder);
|
||||||
return provider;
|
return provider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-7
@@ -4,7 +4,6 @@ import static stirling.software.proprietary.security.configuration.ee.KeygenLice
|
|||||||
|
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Primary;
|
|
||||||
import org.springframework.context.annotation.Profile;
|
import org.springframework.context.annotation.Profile;
|
||||||
import org.springframework.core.Ordered;
|
import org.springframework.core.Ordered;
|
||||||
import org.springframework.core.annotation.Order;
|
import org.springframework.core.annotation.Order;
|
||||||
@@ -28,28 +27,26 @@ public class EEAppConfig {
|
|||||||
migrateEnterpriseSettingsToPremium(this.applicationProperties);
|
migrateEnterpriseSettingsToPremium(this.applicationProperties);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Profile("security")
|
@Profile("security & !saas")
|
||||||
@Bean(name = "runningProOrHigher")
|
@Bean(name = "runningProOrHigher")
|
||||||
@Primary
|
|
||||||
public boolean runningProOrHigher() {
|
public boolean runningProOrHigher() {
|
||||||
License license = licenseKeyChecker.getPremiumLicenseEnabledResult();
|
License license = licenseKeyChecker.getPremiumLicenseEnabledResult();
|
||||||
return license == License.SERVER || license == License.ENTERPRISE;
|
return license == License.SERVER || license == License.ENTERPRISE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Profile("security")
|
@Profile("security & !saas")
|
||||||
@Bean(name = "license")
|
@Bean(name = "license")
|
||||||
@Primary
|
|
||||||
public String licenseType() {
|
public String licenseType() {
|
||||||
return licenseKeyChecker.getPremiumLicenseEnabledResult().name();
|
return licenseKeyChecker.getPremiumLicenseEnabledResult().name();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Profile("security")
|
@Profile("security & !saas")
|
||||||
@Bean(name = "runningEE")
|
@Bean(name = "runningEE")
|
||||||
@Primary
|
|
||||||
public boolean runningEnterprise() {
|
public boolean runningEnterprise() {
|
||||||
return licenseKeyChecker.getPremiumLicenseEnabledResult() == License.ENTERPRISE;
|
return licenseKeyChecker.getPremiumLicenseEnabledResult() == License.ENTERPRISE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Profile("security & !saas")
|
||||||
@Bean(name = "SSOAutoLogin")
|
@Bean(name = "SSOAutoLogin")
|
||||||
public boolean ssoAutoLogin() {
|
public boolean ssoAutoLogin() {
|
||||||
return applicationProperties.getPremium().getProFeatures().isSsoAutoLogin();
|
return applicationProperties.getPremium().getProFeatures().isSsoAutoLogin();
|
||||||
|
|||||||
+1
-1
@@ -40,7 +40,7 @@ import stirling.software.proprietary.security.configuration.ee.LicenseKeyChecker
|
|||||||
@RestController
|
@RestController
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RequestMapping("/api/v1/admin")
|
@RequestMapping("/api/v1/admin")
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@Tag(name = "Admin License Management", description = "Admin-only License Management APIs")
|
@Tag(name = "Admin License Management", description = "Admin-only License Management APIs")
|
||||||
public class AdminLicenseController {
|
public class AdminLicenseController {
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -51,7 +51,7 @@ import tools.jackson.databind.ObjectMapper;
|
|||||||
|
|
||||||
@AdminApi
|
@AdminApi
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class AdminSettingsController {
|
public class AdminSettingsController {
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -585,7 +585,7 @@ public class AuthController {
|
|||||||
* @param username Username of the user to disable MFA for
|
* @param username Username of the user to disable MFA for
|
||||||
* @return Response indicating success or failure
|
* @return Response indicating success or failure
|
||||||
*/
|
*/
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/mfa/disable/admin/{username}")
|
@PostMapping("/mfa/disable/admin/{username}")
|
||||||
public ResponseEntity<?> disableMfaByAdmin(@PathVariable String username) {
|
public ResponseEntity<?> disableMfaByAdmin(@PathVariable String username) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
+1
-1
@@ -29,7 +29,7 @@ import stirling.software.proprietary.security.service.DatabaseService;
|
|||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@DatabaseApi
|
@DatabaseApi
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@Conditional(H2SQLCondition.class)
|
@Conditional(H2SQLCondition.class)
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class DatabaseController {
|
public class DatabaseController {
|
||||||
|
|||||||
+4
-4
@@ -52,7 +52,7 @@ public class InviteLinkController {
|
|||||||
* @param request The HTTP request
|
* @param request The HTTP request
|
||||||
* @return ResponseEntity with the invite link or error
|
* @return ResponseEntity with the invite link or error
|
||||||
*/
|
*/
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/generate")
|
@PostMapping("/generate")
|
||||||
public ResponseEntity<?> generateInviteLink(
|
public ResponseEntity<?> generateInviteLink(
|
||||||
@RequestParam(name = "email", required = false) String email,
|
@RequestParam(name = "email", required = false) String email,
|
||||||
@@ -257,7 +257,7 @@ public class InviteLinkController {
|
|||||||
*
|
*
|
||||||
* @return List of active invite tokens
|
* @return List of active invite tokens
|
||||||
*/
|
*/
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
public ResponseEntity<?> listInviteLinks() {
|
public ResponseEntity<?> listInviteLinks() {
|
||||||
try {
|
try {
|
||||||
@@ -297,7 +297,7 @@ public class InviteLinkController {
|
|||||||
* @param inviteId The invite token ID to revoke
|
* @param inviteId The invite token ID to revoke
|
||||||
* @return Success or error response
|
* @return Success or error response
|
||||||
*/
|
*/
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@DeleteMapping("/revoke/{inviteId}")
|
@DeleteMapping("/revoke/{inviteId}")
|
||||||
public ResponseEntity<?> revokeInviteLink(@PathVariable Long inviteId) {
|
public ResponseEntity<?> revokeInviteLink(@PathVariable Long inviteId) {
|
||||||
try {
|
try {
|
||||||
@@ -324,7 +324,7 @@ public class InviteLinkController {
|
|||||||
*
|
*
|
||||||
* @return Number of deleted tokens
|
* @return Number of deleted tokens
|
||||||
*/
|
*/
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/cleanup")
|
@PostMapping("/cleanup")
|
||||||
public ResponseEntity<?> cleanupExpiredInvites() {
|
public ResponseEntity<?> cleanupExpiredInvites() {
|
||||||
try {
|
try {
|
||||||
|
|||||||
+4
-4
@@ -30,7 +30,7 @@ public class TeamController {
|
|||||||
private final TeamRepository teamRepository;
|
private final TeamRepository teamRepository;
|
||||||
private final UserRepository userRepository;
|
private final UserRepository userRepository;
|
||||||
|
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/create")
|
@PostMapping("/create")
|
||||||
public ResponseEntity<?> createTeam(@RequestParam("name") String name) {
|
public ResponseEntity<?> createTeam(@RequestParam("name") String name) {
|
||||||
if (teamRepository.existsByNameIgnoreCase(name)) {
|
if (teamRepository.existsByNameIgnoreCase(name)) {
|
||||||
@@ -43,7 +43,7 @@ public class TeamController {
|
|||||||
return ResponseEntity.ok(Map.of("message", "Team created successfully"));
|
return ResponseEntity.ok(Map.of("message", "Team created successfully"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/rename")
|
@PostMapping("/rename")
|
||||||
public ResponseEntity<?> renameTeam(
|
public ResponseEntity<?> renameTeam(
|
||||||
@RequestParam("teamId") Long teamId, @RequestParam("newName") String newName) {
|
@RequestParam("teamId") Long teamId, @RequestParam("newName") String newName) {
|
||||||
@@ -69,7 +69,7 @@ public class TeamController {
|
|||||||
return ResponseEntity.ok(Map.of("message", "Team renamed successfully"));
|
return ResponseEntity.ok(Map.of("message", "Team renamed successfully"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/delete")
|
@PostMapping("/delete")
|
||||||
@Transactional
|
@Transactional
|
||||||
public ResponseEntity<?> deleteTeam(@RequestParam("teamId") Long teamId) {
|
public ResponseEntity<?> deleteTeam(@RequestParam("teamId") Long teamId) {
|
||||||
@@ -100,7 +100,7 @@ public class TeamController {
|
|||||||
return ResponseEntity.ok(Map.of("message", "Team deleted successfully"));
|
return ResponseEntity.ok(Map.of("message", "Team deleted successfully"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/addUser")
|
@PostMapping("/addUser")
|
||||||
@Transactional
|
@Transactional
|
||||||
public ResponseEntity<?> addUserToTeam(
|
public ResponseEntity<?> addUserToTeam(
|
||||||
|
|||||||
+2
-2
@@ -47,7 +47,7 @@ public class UIDataTessdataController {
|
|||||||
private static final long REMOTE_TESSDATA_TTL_MS = 10 * 60 * 1000; // 10 minutes
|
private static final long REMOTE_TESSDATA_TTL_MS = 10 * 60 * 1000; // 10 minutes
|
||||||
|
|
||||||
@GetMapping("/tessdata-languages")
|
@GetMapping("/tessdata-languages")
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@Operation(summary = "List installed and remotely available tessdata languages")
|
@Operation(summary = "List installed and remotely available tessdata languages")
|
||||||
public ResponseEntity<TessdataLanguagesResponse> getTessdataLanguages() {
|
public ResponseEntity<TessdataLanguagesResponse> getTessdataLanguages() {
|
||||||
TessdataLanguagesResponse response = new TessdataLanguagesResponse();
|
TessdataLanguagesResponse response = new TessdataLanguagesResponse();
|
||||||
@@ -58,7 +58,7 @@ public class UIDataTessdataController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/tessdata/download")
|
@PostMapping("/tessdata/download")
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@Operation(summary = "Download selected tessdata languages from the official repository")
|
@Operation(summary = "Download selected tessdata languages from the official repository")
|
||||||
public ResponseEntity<Map<String, Object>> downloadTessdataLanguages(
|
public ResponseEntity<Map<String, Object>> downloadTessdataLanguages(
|
||||||
@RequestBody TessdataDownloadRequest request) {
|
@RequestBody TessdataDownloadRequest request) {
|
||||||
|
|||||||
+7
-7
@@ -360,7 +360,7 @@ public class UserController {
|
|||||||
return ResponseEntity.ok(Map.of("message", "Settings updated successfully"));
|
return ResponseEntity.ok(Map.of("message", "Settings updated successfully"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/admin/saveUser")
|
@PostMapping("/admin/saveUser")
|
||||||
public ResponseEntity<?> saveUser(
|
public ResponseEntity<?> saveUser(
|
||||||
@RequestParam(name = "username", required = true) String username,
|
@RequestParam(name = "username", required = true) String username,
|
||||||
@@ -468,7 +468,7 @@ public class UserController {
|
|||||||
return ResponseEntity.ok(Map.of("message", "User created successfully"));
|
return ResponseEntity.ok(Map.of("message", "User created successfully"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/admin/inviteUsers")
|
@PostMapping("/admin/inviteUsers")
|
||||||
public ResponseEntity<?> inviteUsers(
|
public ResponseEntity<?> inviteUsers(
|
||||||
@RequestParam(name = "emails", required = true) String emails,
|
@RequestParam(name = "emails", required = true) String emails,
|
||||||
@@ -585,7 +585,7 @@ public class UserController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/admin/changeRole")
|
@PostMapping("/admin/changeRole")
|
||||||
@Transactional
|
@Transactional
|
||||||
public ResponseEntity<?> changeRole(
|
public ResponseEntity<?> changeRole(
|
||||||
@@ -651,7 +651,7 @@ public class UserController {
|
|||||||
return ResponseEntity.ok(Map.of("message", "User role updated successfully"));
|
return ResponseEntity.ok(Map.of("message", "User role updated successfully"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/admin/changePasswordForUser")
|
@PostMapping("/admin/changePasswordForUser")
|
||||||
public ResponseEntity<?> changePasswordForUser(
|
public ResponseEntity<?> changePasswordForUser(
|
||||||
@RequestParam(name = "username") String username,
|
@RequestParam(name = "username") String username,
|
||||||
@@ -725,7 +725,7 @@ public class UserController {
|
|||||||
return ResponseEntity.ok(Map.of("message", "User password updated successfully"));
|
return ResponseEntity.ok(Map.of("message", "User password updated successfully"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/admin/changeUserEnabled/{username}")
|
@PostMapping("/admin/changeUserEnabled/{username}")
|
||||||
public ResponseEntity<?> changeUserEnabled(
|
public ResponseEntity<?> changeUserEnabled(
|
||||||
@PathVariable("username") String username,
|
@PathVariable("username") String username,
|
||||||
@@ -777,7 +777,7 @@ public class UserController {
|
|||||||
Map.of("message", "User " + (enabled ? "enabled" : "disabled") + " successfully"));
|
Map.of("message", "User " + (enabled ? "enabled" : "disabled") + " successfully"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/admin/unlockUser/{username}")
|
@PostMapping("/admin/unlockUser/{username}")
|
||||||
@Audited(type = AuditEventType.SETTINGS_CHANGED, level = AuditLevel.BASIC)
|
@Audited(type = AuditEventType.SETTINGS_CHANGED, level = AuditLevel.BASIC)
|
||||||
public ResponseEntity<?> unlockUser(@PathVariable("username") String username) {
|
public ResponseEntity<?> unlockUser(@PathVariable("username") String username) {
|
||||||
@@ -785,7 +785,7 @@ public class UserController {
|
|||||||
return ResponseEntity.ok(Map.of("message", "User account unlocked successfully"));
|
return ResponseEntity.ok(Map.of("message", "User account unlocked successfully"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@PostMapping("/admin/deleteUser/{username}")
|
@PostMapping("/admin/deleteUser/{username}")
|
||||||
@Audited(type = AuditEventType.USER_PROFILE_UPDATE, level = AuditLevel.BASIC)
|
@Audited(type = AuditEventType.USER_PROFILE_UPDATE, level = AuditLevel.BASIC)
|
||||||
public ResponseEntity<?> deleteUser(
|
public ResponseEntity<?> deleteUser(
|
||||||
|
|||||||
+1
-1
@@ -24,7 +24,7 @@ import stirling.software.proprietary.security.service.DatabaseService;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
@Controller
|
@Controller
|
||||||
@RequestMapping("/api/v1/database")
|
@RequestMapping("/api/v1/database")
|
||||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
@PreAuthorize("hasRole('ADMIN')")
|
||||||
@EnterpriseEndpoint
|
@EnterpriseEndpoint
|
||||||
@Conditional(H2SQLCondition.class)
|
@Conditional(H2SQLCondition.class)
|
||||||
@Tag(name = "Database", description = "Database APIs for backup, import, and management")
|
@Tag(name = "Database", description = "Database APIs for backup, import, and management")
|
||||||
|
|||||||
+18
-7
@@ -1,23 +1,34 @@
|
|||||||
package stirling.software.proprietary.security.database;
|
package stirling.software.proprietary.security.database;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import org.springframework.context.annotation.Condition;
|
import org.springframework.context.annotation.Condition;
|
||||||
import org.springframework.context.annotation.ConditionContext;
|
import org.springframework.context.annotation.ConditionContext;
|
||||||
import org.springframework.core.type.AnnotatedTypeMetadata;
|
import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||||
|
|
||||||
|
/** Returns {@code true} when the active deployment is genuinely on H2. */
|
||||||
public class H2SQLCondition implements Condition {
|
public class H2SQLCondition implements Condition {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
|
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
|
||||||
var env = context.getEnvironment();
|
var env = context.getEnvironment();
|
||||||
boolean enableCustomDatabase =
|
|
||||||
env.getProperty("system.datasource.enableCustomDatabase", Boolean.class, false);
|
|
||||||
|
|
||||||
// If custom database is not enabled, H2 is used by default
|
if (Arrays.asList(env.getActiveProfiles()).contains("saas")) {
|
||||||
if (!enableCustomDatabase) {
|
return false;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String dataSourceType = env.getProperty("system.datasource.type", String.class, "");
|
// Legacy custom-DB block, if explicitly enabled, is authoritative.
|
||||||
return "h2".equalsIgnoreCase(dataSourceType);
|
boolean enableCustomDatabase =
|
||||||
|
env.getProperty("system.datasource.enableCustomDatabase", Boolean.class, false);
|
||||||
|
if (enableCustomDatabase) {
|
||||||
|
String dataSourceType = env.getProperty("system.datasource.type", String.class, "");
|
||||||
|
return "h2".equalsIgnoreCase(dataSourceType);
|
||||||
|
}
|
||||||
|
|
||||||
|
String springDsUrl = env.getProperty("spring.datasource.url", String.class, "");
|
||||||
|
if (springDsUrl == null || springDsUrl.isBlank()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return springDsUrl.startsWith("jdbc:h2:");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+26
@@ -1,7 +1,10 @@
|
|||||||
package stirling.software.proprietary.security.database.repository;
|
package stirling.software.proprietary.security.database.repository;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.data.jpa.repository.Modifying;
|
import org.springframework.data.jpa.repository.Modifying;
|
||||||
@@ -26,6 +29,10 @@ public interface UserRepository extends JpaRepository<User, Long> {
|
|||||||
|
|
||||||
Optional<User> findByApiKey(String apiKey);
|
Optional<User> findByApiKey(String apiKey);
|
||||||
|
|
||||||
|
Optional<User> findByEmail(String email);
|
||||||
|
|
||||||
|
Optional<User> findBySupabaseId(UUID supabaseId);
|
||||||
|
|
||||||
Optional<User> findBySsoProviderAndSsoProviderId(String ssoProvider, String ssoProviderId);
|
Optional<User> findBySsoProviderAndSsoProviderId(String ssoProvider, String ssoProviderId);
|
||||||
|
|
||||||
List<User> findByAuthenticationTypeIgnoreCase(String authenticationType);
|
List<User> findByAuthenticationTypeIgnoreCase(String authenticationType);
|
||||||
@@ -92,4 +99,23 @@ public interface UserRepository extends JpaRepository<User, Long> {
|
|||||||
nativeQuery = true)
|
nativeQuery = true)
|
||||||
void deleteSettingsByUserIdAndKeys(
|
void deleteSettingsByUserIdAndKeys(
|
||||||
@Param("userId") Long userId, @Param("keys") List<String> keys);
|
@Param("userId") Long userId, @Param("keys") List<String> keys);
|
||||||
|
|
||||||
|
/** Anonymous users (no username) created before the cut-off, streamed for batch cleanup. */
|
||||||
|
@Query("SELECT u.id FROM User u WHERE u.username IS NULL AND u.createdAt < :cutoffDate")
|
||||||
|
Stream<Long> findByUsernameIsNullAndCreatedAtBefore(
|
||||||
|
@Param("cutoffDate") LocalDateTime cutoffDate);
|
||||||
|
|
||||||
|
/** Users with an API key but no row in {@code user_credits}. */
|
||||||
|
@Query(
|
||||||
|
value =
|
||||||
|
"SELECT u.* FROM users u "
|
||||||
|
+ "LEFT JOIN user_credits uc ON uc.user_id = u.user_id "
|
||||||
|
+ "WHERE u.api_key IS NOT NULL AND uc.user_id IS NULL",
|
||||||
|
nativeQuery = true)
|
||||||
|
List<User> findUsersWithApiKeyButNoCredits();
|
||||||
|
|
||||||
|
/** Single-shot UPDATE that reassigns a user to a different team. */
|
||||||
|
@Modifying
|
||||||
|
@Query("UPDATE User u SET u.team.id = :teamId WHERE u.id = :userId")
|
||||||
|
int updateUserTeamId(@Param("userId") Long userId, @Param("teamId") Long teamId);
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user