Initial Commit

This commit is contained in:
Timo Bejan 2021-09-14 12:02:35 +03:00
commit a2ee61c087
234 changed files with 13120 additions and 0 deletions

28
.gitignore vendored Normal file
View File

@ -0,0 +1,28 @@
!.gitignore
*.project
*.classpath
**/.settings/
**/target/
**/logs/
**/.metadata/
**/bin/
**/tmp/
**/.apt_generated/
.factorypath
.springBeans
.checkstyle
.eclipse-pmd
.pmdruleset.xml
.pmd
**/.idea/
*.iml
*.pid
*~
**/.DS_Store/
**/.DS_Store
**/classpath-data.json
**/dependencies-and-licenses-overview.txt

12
CHANGELOG.md Normal file
View File

@ -0,0 +1,12 @@
# Changelog
All notable changes to this project will be documented in this file.
## [Unreleased]
### Fixed
### Added
### Changed
### Removed

37
bamboo-specs/pom.xml Normal file
View File

@ -0,0 +1,37 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atlassian.bamboo</groupId>
<artifactId>bamboo-specs-parent</artifactId>
<version>7.2.2</version>
<relativePath/>
</parent>
<artifactId>bamboo-specs</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.atlassian.bamboo</groupId>
<artifactId>bamboo-specs-api</artifactId>
</dependency>
<dependency>
<groupId>com.atlassian.bamboo</groupId>
<artifactId>bamboo-specs</artifactId>
</dependency>
<!-- Test dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- run 'mvn test' to perform offline validation of the plan -->
<!-- run 'mvn -Ppublish-specs' to upload the plan to your Bamboo server -->
</project>

View File

@ -0,0 +1,118 @@
package buildjob;
import com.atlassian.bamboo.specs.api.BambooSpec;
import com.atlassian.bamboo.specs.api.builders.BambooKey;
import com.atlassian.bamboo.specs.api.builders.docker.DockerConfiguration;
import com.atlassian.bamboo.specs.api.builders.permission.PermissionType;
import com.atlassian.bamboo.specs.api.builders.permission.Permissions;
import com.atlassian.bamboo.specs.api.builders.permission.PlanPermissions;
import com.atlassian.bamboo.specs.api.builders.plan.Job;
import com.atlassian.bamboo.specs.api.builders.plan.Plan;
import com.atlassian.bamboo.specs.api.builders.plan.PlanIdentifier;
import com.atlassian.bamboo.specs.api.builders.plan.Stage;
import com.atlassian.bamboo.specs.api.builders.plan.branches.BranchCleanup;
import com.atlassian.bamboo.specs.api.builders.plan.branches.PlanBranchManagement;
import com.atlassian.bamboo.specs.api.builders.plan.configuration.ConcurrentBuilds;
import com.atlassian.bamboo.specs.api.builders.project.Project;
import com.atlassian.bamboo.specs.builders.task.*;
import com.atlassian.bamboo.specs.builders.trigger.BitbucketServerTrigger;
import com.atlassian.bamboo.specs.model.task.InjectVariablesScope;
import com.atlassian.bamboo.specs.model.task.ScriptTaskProperties.Location;
import com.atlassian.bamboo.specs.util.BambooServer;
import static com.atlassian.bamboo.specs.builders.task.TestParserTask.createJUnitParserTask;
/**
* Plan configuration for Bamboo.
* Learn more on: <a href="https://confluence.atlassian.com/display/BAMBOO/Bamboo+Specs">https://confluence.atlassian.com/display/BAMBOO/Bamboo+Specs</a>
*/
@BambooSpec
public class PlanSpec {
private static final String SERVICE_NAME = "persistence-service";
private static final String SERVICE_KEY = SERVICE_NAME.toUpperCase().replaceAll("-", "");
/**
* Run main to publish plan on Bamboo
*/
public static void main(final String[] args) throws Exception {
//By default credentials are read from the '.credentials' file.
BambooServer bambooServer = new BambooServer("http://localhost:8085");
Plan plan = new PlanSpec().createPlan();
bambooServer.publish(plan);
PlanPermissions planPermission = new PlanSpec().createPlanPermission(plan.getIdentifier());
bambooServer.publish(planPermission);
}
private PlanPermissions createPlanPermission(PlanIdentifier planIdentifier) {
Permissions permission = new Permissions()
.userPermissions("atlbamboo", PermissionType.EDIT, PermissionType.VIEW, PermissionType.ADMIN, PermissionType.CLONE, PermissionType.BUILD)
.groupPermissions("red-backend", PermissionType.EDIT, PermissionType.VIEW, PermissionType.CLONE, PermissionType.BUILD)
.loggedInUserPermissions(PermissionType.VIEW)
.anonymousUserPermissionView();
return new PlanPermissions(planIdentifier.getProjectKey(), planIdentifier.getPlanKey()).permissions(permission);
}
private Project project() {
return new Project()
.name("RED")
.key(new BambooKey("RED"));
}
public Plan createPlan() {
return new Plan(
project(),
SERVICE_NAME, new BambooKey(SERVICE_KEY))
.description("Plan created from (enter repository url of your plan)")
.stages(new Stage("Default Stage")
.jobs(new Job("Default Job",
new BambooKey("JOB1"))
.tasks(
new ScriptTask()
.description("Clean")
.inlineBody("#!/bin/bash\n" +
"set -e\n" +
"rm -rf ./*"),
new VcsCheckoutTask()
.description("Checkout Default Repository")
.checkoutItems(new CheckoutItem().defaultRepository()),
new ScriptTask()
.description("Build")
.location(Location.FILE)
.fileFromPath("bamboo-specs/src/main/resources/scripts/build-java.sh")
.argument(SERVICE_NAME),
createJUnitParserTask()
.description("Resultparser")
.resultDirectories("**/test-reports/*.xml, **/target/surefire-reports/*.xml, **/target/failsafe-reports/*.xml")
.enabled(true),
new InjectVariablesTask()
.description("Inject git Tag")
.path("git.tag")
.namespace("g")
.scope(InjectVariablesScope.LOCAL),
new VcsTagTask()
.description("${bamboo.g.gitTag}")
.tagName("${bamboo.g.gitTag}")
.defaultRepository())
.dockerConfiguration(
new DockerConfiguration()
.image("nexus.iqser.com:5001/infra/maven:3.6.2-jdk-13-3.0.0")
.dockerRunArguments("--net=host")
.volume("/etc/maven/settings.xml", "/usr/share/maven/ref/settings.xml")
.volume("/var/run/docker.sock", "/var/run/docker.sock")
)
)
)
.linkedRepositories("RED / " + SERVICE_NAME)
.pluginConfigurations(new ConcurrentBuilds()
.maximumNumberOfConcurrentBuilds(1))
.triggers(new BitbucketServerTrigger())
.planBranchManagement(new PlanBranchManagement()
.createForVcsBranch()
.delete(new BranchCleanup()
.whenInactiveInRepositoryAfterDays(14))
.notificationForCommitters());
}
}

View File

@ -0,0 +1,51 @@
#!/bin/bash
set -e
SERVICE_NAME=$1
if [[ "${bamboo_version_tag}" = "dev" ]]
then
${bamboo_capability_system_builder_mvn3_Maven_3}/bin/mvn \
-f ${bamboo_build_working_directory}/$SERVICE_NAME-v1/pom.xml \
--no-transfer-progress \
clean install \
-Djava.security.egd=file:/dev/./urandomelse
else
${bamboo_capability_system_builder_mvn3_Maven_3}/bin/mvn \
--no-transfer-progress \
-f ${bamboo_build_working_directory}/$SERVICE_NAME-v1/pom.xml \
versions:set \
-DnewVersion=${bamboo_version_tag}
${bamboo_capability_system_builder_mvn3_Maven_3}/bin/mvn \
--no-transfer-progress \
-f ${bamboo_build_working_directory}/$SERVICE_NAME-image-v1/pom.xml \
versions:set \
-DnewVersion=${bamboo_version_tag}
${bamboo_capability_system_builder_mvn3_Maven_3}/bin/mvn \
-f ${bamboo_build_working_directory}/$SERVICE_NAME-v1/pom.xml \
--no-transfer-progress \
clean deploy \
-e \
-DdeployAtEnd=true \
-Dmaven.wagon.http.ssl.insecure=true \
-Dmaven.wagon.http.ssl.allowall=true \
-Dmaven.wagon.http.ssl.ignore.validity.dates=true \
-DaltDeploymentRepository=iqser_release::default::https://nexus.iqser.com/repository/red-platform-releases
fi
${bamboo_capability_system_builder_mvn3_Maven_3}/bin/mvn \
--no-transfer-progress \
-f ${bamboo_build_working_directory}/$SERVICE_NAME-image-v1/pom.xml \
package
${bamboo_capability_system_builder_mvn3_Maven_3}/bin/mvn \
--no-transfer-progress \
-f ${bamboo_build_working_directory}/$SERVICE_NAME-image-v1/pom.xml \
docker:push
if [[ "${bamboo_version_tag}" = "dev" ]]
then
echo "gitTag=${bamboo_planRepository_1_branch}_${bamboo_buildNumber}" > git.tag
else
echo "gitTag=${bamboo_version_tag}" > git.tag
fi

View File

@ -0,0 +1,17 @@
package buildjob;
import org.junit.Test;
import com.atlassian.bamboo.specs.api.builders.plan.Plan;
import com.atlassian.bamboo.specs.api.exceptions.PropertiesValidationException;
import com.atlassian.bamboo.specs.api.util.EntityPropertiesBuilders;
public class PlanSpecTest {
@Test
public void checkYourPlanOffline() throws PropertiesValidationException {
Plan plan = new PlanSpec().createPlan();
EntityPropertiesBuilders.build(plan);
}
}

View File

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.iqser.red</groupId>
<artifactId>platform-docker-dependency</artifactId>
<version>1.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>persistence-service-image-v1</artifactId>
<groupId>com.iqser.red.service</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<service.server>persistence-service-server-v1</service.server>
<platform.jar>${service.server}.jar</platform.jar>
<docker.skip.push>false</docker.skip.push>
<docker.image.name>${docker.image.prefix}/${service.server}</docker.image.name>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>download-platform-jar</id>
<phase>prepare-package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>${service.server}</artifactId>
<version>${project.version}</version>
<type>jar</type>
<overWrite>true</overWrite>
<destFileName>${platform.jar}</destFileName>
</dependency>
</artifactItems>
<outputDirectory>${docker.build.directory}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<images>
<image>
<name>${docker.image.name}</name>
<build>
<dockerFileDir>${docker.build.directory}</dockerFileDir>
<args>
<PLATFORM_JAR>${platform.jar}</PLATFORM_JAR>
</args>
<tags>
<tag>${docker.image.version}</tag>
<tag>latest</tag>
</tags>
</build>
</image>
</images>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

View File

@ -0,0 +1,9 @@
FROM red/base-image:1.0.0
ARG PLATFORM_JAR
ENV PLATFORM_JAR ${PLATFORM_JAR}
ENV USES_ELASTICSEARCH false
COPY ["${PLATFORM_JAR}", "/"]

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>persistence-service-v1</artifactId>
<groupId>com.iqser.red.service</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>persistence-service-api-v1</artifactId>
<dependencies>
<dependency>
<groupId>com.iqser.red.service</groupId>
<artifactId>redaction-service-api-v1</artifactId>
<exclusions>
<exclusion>
<groupId>com.iqser.red.service</groupId>
<artifactId>persistence-service-api-v1</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<!-- This dependency contains annotations that are used in specifying REST endpoints. -->
<!-- It is optional since not all users of this API might use Feign. -->
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/jakarta.persistence/jakarta.persistence-api -->
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<!-- test -->
<dependency>
<groupId>com.iqser.red.commons</groupId>
<artifactId>jackson-commons</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,32 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import com.iqser.red.service.persistence.service.v1.api.model.data.annotations.AnnotationStatus;
import com.iqser.red.service.persistence.service.v1.api.model.data.annotations.Rectangle;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class AddRedactionRequest {
private String user;
private String type;
private String value;
private String reason;
private String legalBasis;
private boolean addToDictionary;
private boolean addToDossierDictionary;
private AnnotationStatus status;
@Builder.Default
private List<Rectangle> positions = new ArrayList<>();
private String comment;
}

View File

@ -0,0 +1,20 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.*;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class BinaryFileRequest {
@NonNull
private byte[] data;
@NonNull
private String filename;
@NonNull
private String dossierId;
private String uploader;
}

View File

@ -0,0 +1,16 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.*;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class BinaryFileResult {
@NonNull
private byte[] data;
@NonNull
private String filename;
}

View File

@ -0,0 +1,17 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CommentRequest {
private String user;
private String text;
}

View File

@ -0,0 +1,49 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.DossierStatus;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.DownloadFileType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CreateOrUpdateDossierRequest {
private String dossierName;
private OffsetDateTime date;
private String description;
private DossierStatus status;
private String ownerId;
private Set<String> memberIds = new HashSet<>();
private Set<String> approverIds = new HashSet<>();
private Set<DownloadFileType> downloadFileTypes = new HashSet<>();
private boolean watermarkEnabled;
private OffsetDateTime dueDate;
private String dossierTemplateId;
private List<String> reportTemplateIds = new ArrayList<>();
private String requestingUser;
}

View File

@ -0,0 +1,40 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.DownloadFileType;
import lombok.Data;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Data
public class CreateOrUpdateDossierTemplateRequest {
private String dossierTemplateId;
private String name;
private String description;
private OffsetDateTime dateAdded;
private OffsetDateTime dateModified;
private String createdBy;
private String modifiedBy;
private OffsetDateTime validFrom;
private OffsetDateTime validTo;
private String requestingUser;
private Set<DownloadFileType> downloadFileTypes = new HashSet<>();
private List<String> reportTemplateIds = new ArrayList<>();
}

View File

@ -0,0 +1,15 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.Builder;
import lombok.Data;
import java.time.OffsetDateTime;
@Data
@Builder
public class DeletedDossier {
private OffsetDateTime deletionTime;
private String dossierId;
}

View File

@ -0,0 +1,16 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.*;
@Data
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor
@Builder
public class DigitalSignatureUpdateModel {
private String location;
private String reason;
private String contactInfo;
private String certificateName;
}

View File

@ -0,0 +1,20 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.*;
import java.util.ArrayList;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class DownloadRequest {
private String userId;
private String dossierId;
@Builder.Default
private List<String> fileIds = new ArrayList<>();
}

View File

@ -0,0 +1,15 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.Getter;
public enum FileType {
ORIGIN(".pdf"), REDACTION_LOG(".json"), SECTION_GRID(".json"), TEXT(".json");
@Getter
private final String extension;
FileType(String extension) {
this.extension = extension;
}
}

View File

@ -0,0 +1,21 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import com.iqser.red.service.persistence.service.v1.api.model.data.annotations.AnnotationStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ForceRedactionRequest {
private String annotationId;
private String user;
private AnnotationStatus status;
private String legalBasis;
private String comment;
}

View File

@ -0,0 +1,21 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import com.iqser.red.service.persistence.service.v1.api.model.data.annotations.AnnotationStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ImageRecategorizationRequest {
private String annotationId;
private String user;
private AnnotationStatus status;
private String type;
private String comment;
}

View File

@ -0,0 +1,16 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ImportCsvRequest {
private byte[] csvFile;
}

View File

@ -0,0 +1,23 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.HashSet;
import java.util.Set;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ImportCsvResponse {
@Builder.Default
private Set<String> affectedFileIds = new HashSet<>();
@Builder.Default
private Set<String> foundAttributes = new HashSet<>();
}

View File

@ -0,0 +1,12 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.Data;
import lombok.RequiredArgsConstructor;
@Data
@RequiredArgsConstructor
public class JSONPrimitive<T> {
private final T value;
}

View File

@ -0,0 +1,21 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import com.iqser.red.service.persistence.service.v1.api.model.data.annotations.AnnotationStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class LegalBasisChangeRequest {
private String annotationId;
private String user;
private AnnotationStatus status;
private String legalBasis;
private String comment;
}

View File

@ -0,0 +1,40 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LicenseReport {
private int numberOfAnalyzedFiles;
private int numberOfOcrFiles;
private int numberOfDossiers;
private int numberOfAnalyzedPages;
private int numberOfOcrPages;
private int numberOfAnalyses; // includes reanalysis counts
private Instant startDate;
private Instant endDate;
private int offset;
private int limit;
private List<ReportData> data = new ArrayList<>();
// To be used for consecutive/paged calls
private String requestId;
}

View File

@ -0,0 +1,50 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.time.Instant;
import java.time.Year;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(of = "requestId")
public class LicenseReportRequest {
private String requestId;
private Instant startDate;
private Instant endDate;
private List<String> dossierIds = new ArrayList<>();
public Instant getStartDate() {
if (startDate == null) {
startDate = Year.of(getEndDate().atOffset(ZoneOffset.UTC).getYear())
.atMonth(1)
.atDay(1)
.atStartOfDay()
.toInstant(ZoneOffset.UTC);
}
return startDate;
}
public Instant getEndDate() {
if (endDate == null) {
endDate = Instant.now();
}
return endDate;
}
}

View File

@ -0,0 +1,16 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ManualAddResponse {
private String annotationId;
private String commentId;
}

View File

@ -0,0 +1,35 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import com.iqser.red.service.persistence.service.v1.api.model.data.annotations.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ManualRedactions {
@Builder.Default
private Set<IdRemoval> idsToRemove = new HashSet<>();
@Builder.Default
private Set<ManualRedactionEntry> entriesToAdd = new HashSet<>();
@Builder.Default
private Set<ManualForceRedaction> forceRedactions = new HashSet<>();
@Builder.Default
private Set<ManualImageRecategorization> imageRecategorization = new HashSet<>();
@Builder.Default
private Set<ManualLegalBasisChange> legalBasisChanges = new HashSet<>();
@Builder.Default
private Map<String, List<Comment>> comments = new HashMap<>();
}

View File

@ -0,0 +1,21 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import com.iqser.red.service.persistence.service.v1.api.model.data.annotations.AnnotationStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RemoveRedactionRequest {
private String annotationId;
private String user;
private AnnotationStatus status;
private boolean removeFromDictionary;
private String comment;
}

View File

@ -0,0 +1,21 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.FileStatus;
import lombok.Data;
import java.time.Instant;
@Data
public class ReportData {
private String dossier;
private String fileName;
private Instant addedDate;
private Instant lastUpdatedDate;
private Instant deletedDate;
private int numberOfAnalyzedPages;
private int numberOfOcrPages;
private FileStatus status;
private int analysisCount;
}

View File

@ -0,0 +1,15 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ReportTemplateDownload {
private byte[] file;
}

View File

@ -0,0 +1,21 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.*;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ReportTemplateUploadRequest {
@NonNull
private byte[] template;
@NonNull
private String dossierTemplateId;
@NonNull
private String fileName;
@NonNull
private boolean multiFileReport;
@NonNull
private boolean activeByDefault;
}

View File

@ -0,0 +1,13 @@
package com.iqser.red.service.persistence.service.v1.api.model;
import lombok.*;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class SetDownloadedRequest {
private String userId;
private String storageId;
}

View File

@ -0,0 +1,22 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.annotations;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.io.Serializable;
@Embeddable
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AnnotationId implements Serializable {
@Column
private String id;
@Column
private String fileId;
}

View File

@ -0,0 +1,8 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.annotations;
public enum AnnotationStatus {
REQUESTED,
APPROVED,
DECLINED
}

View File

@ -0,0 +1,40 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.annotations;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.File;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.OffsetDateTime;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Comment {
@Id
@GeneratedValue
private long id;
@Column
private String fileId;
@Column
private String annotationId;
@Column
private OffsetDateTime date;
@Column
private String text;
@Column
private String user;
@Column
private OffsetDateTime softDeletedTime;
@ManyToOne
private File fileStatus;
}

View File

@ -0,0 +1,38 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.annotations;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.File;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.ManyToOne;
import java.time.OffsetDateTime;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class IdRemoval {
@EmbeddedId
private AnnotationId id;
@Column
private String user;
@Column
private AnnotationStatus status;
@Column
private boolean removeFromDictionary;
@Column
private OffsetDateTime requestDate;
@Column
private OffsetDateTime processedDate;
@Column
private OffsetDateTime softDeletedTime;
@ManyToOne
private File fileStatus;
}

View File

@ -0,0 +1,38 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.annotations;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.File;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.ManyToOne;
import java.time.OffsetDateTime;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ManualForceRedaction {
@EmbeddedId
private AnnotationId id;
@Column
private String user;
@Column
private AnnotationStatus status;
@Column
private String legalBasis;
@Column
private OffsetDateTime requestDate;
@Column
private OffsetDateTime processedDate;
@Column
private OffsetDateTime softDeletedTime;
@ManyToOne
private File fileStatus;
}

View File

@ -0,0 +1,37 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.annotations;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.File;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.ManyToOne;
import java.time.OffsetDateTime;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ManualImageRecategorization {
@EmbeddedId
private AnnotationId id;
@Column
private String user;
@Column
private AnnotationStatus status;
@Column
private String type;
@Column
private OffsetDateTime requestDate;
@Column
private OffsetDateTime processedDate;
@Column
private OffsetDateTime softDeletedTime;
@ManyToOne
private File fileStatus;
}

View File

@ -0,0 +1,39 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.annotations;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.File;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.ManyToOne;
import java.time.OffsetDateTime;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ManualLegalBasisChange {
@EmbeddedId
private AnnotationId id;
@Column
private String user;
@Column
private AnnotationStatus status;
@Column
private String legalBasis;
@Column
private OffsetDateTime requestDate;
@Column
private OffsetDateTime processedDate;
@Column
private OffsetDateTime softDeletedTime;
@ManyToOne
private File fileStatus;
}

View File

@ -0,0 +1,49 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.annotations;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.File;
import lombok.Data;
import javax.persistence.*;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.List;
@Data
@Entity
@Table(name = "manual_redaction")
public class ManualRedactionEntry {
@EmbeddedId
private AnnotationId id;
@Column
private String user;
@Column
private String typeId;
@Column
private String value;
@Column
private String reason;
@Column
private String legalBasis;
@Column
private AnnotationStatus status;
@Column
private boolean addToDictionary;
@Column
private boolean addToDossierDictionary;
@Column
private OffsetDateTime requestDate;
@Column
private OffsetDateTime processedDate;
@Column
private OffsetDateTime softDeletedTime;
@OneToMany(mappedBy = "manualRedaction", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Rectangle> positions = new ArrayList<>();
@ManyToOne
private File fileStatus;
}

View File

@ -0,0 +1,29 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.annotations;
import lombok.Data;
import javax.persistence.*;
@Data
@Entity
@Table(name = "rectangle")
public class Rectangle {
@Id
@GeneratedValue
private long id;
@Column
private float topLeftX;
@Column
private float topLeftY;
@Column
private float width;
@Column
private float height;
@Column
private int page;
@ManyToOne(fetch = FetchType.LAZY)
private ManualRedactionEntry manualRedaction;
}

View File

@ -0,0 +1,39 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.annotations;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.File;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.io.Serializable;
import java.time.OffsetDateTime;
@Data
@Entity
@Table(name = "viewed_page")
public class ViewedPage {
@EmbeddedId
private ViewedPageId id;
@Column
private OffsetDateTime viewedTime;
@ManyToOne(fetch = FetchType.LAZY)
private File file;
@Data
@Embeddable
@NoArgsConstructor
@AllArgsConstructor
public static class ViewedPageId implements Serializable {
@Column
private String fileId;
@Column
private int page;
@Column
private String userId;
}
}

View File

@ -0,0 +1,50 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.configuration;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "color_configuration")
public class Colors {
@Id
@Column
private String dossierTemplateId;
@Column
private String defaultColor;
@Column
private String requestAdd;
@Column
private String requestRemove;
@Column
private String notRedacted;
@Column
private String analysisColor;
@Column
private String updatedColor;
@Column
private String dictionaryRequestColor;
@Column
private String manualRedactionColor;
@Column
private String previewColor;
}

View File

@ -0,0 +1,26 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.configuration;
import lombok.Data;
import javax.persistence.*;
@Data
@Entity
@Table(name = "dictionary_entry")
public class DictionaryEntry {
@Id
@GeneratedValue
private long entryId;
@Column
private String value;
@Column
private long version;
@Column
private boolean deleted;
@ManyToOne(fetch = FetchType.LAZY)
private Type type;
}

View File

@ -0,0 +1,35 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.configuration;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "digital_signature")
public class DigitalSignature {
public final static String ID = "CONFIG_ID";
@Id
private final String id = DigitalSignature.ID;
@Column
private String location;
@Column
private String reason;
@Column
private String contactInfo;
@Column
private String certificateName;
@Column
private String password;
@Column
@Lob
private byte[] privateKey;
}

View File

@ -0,0 +1,28 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.configuration;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.DossierTemplate;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FileAttributesGeneralConfiguration {
@Id
@Column
private String dossierTemplateId;
@Column
private String filenameMappingColumnHeaderName;
@Column
private String delimiter;
@OneToOne
private DossierTemplate dossierTemplate;
}

View File

@ -0,0 +1,28 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.configuration;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Data
@NoArgsConstructor
@Entity
@Table(name = "legal_basis")
public class LegalBasis {
@Id
@GeneratedValue
private long id;
@Column
private String name;
@Column
private String description;
@Column
private String reason;
@ManyToOne
private LegalBasisMapping legalBasisMapping;
}

View File

@ -0,0 +1,24 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.configuration;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Data
@NoArgsConstructor
@Entity
@Table(name = "legal_basis_mapping")
public class LegalBasisMapping {
@Id
private String dossierTemplateId;
@Column
private long version;
@OneToMany(mappedBy = "legalBasisMapping", cascade = CascadeType.ALL)
private List<LegalBasis> legalBasis = new ArrayList<>();
}

View File

@ -0,0 +1,26 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.configuration;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "rule_set")
public class RuleSet {
@Id
@Column
private String dossierTemplateId;
@Column
private long version;
@Lob
@Column(name = "value", columnDefinition="CLOB")
private String value;
}

View File

@ -0,0 +1,48 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.configuration;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Data
@Entity
@Table(name = "smtp_configuration")
public class SMTPConfiguration {
public final static String ID = "CONFIG_ID";
@Id
private final String id = SMTPConfiguration.ID;
@Column
private String from;
@Column
private String fromDisplayName;
@Column
private String envelopeFrom;
@Column
private String host;
@Column
private Integer port;
@Column
private String replyTo;
@Column
private String replyToDisplayName;
@Column
private boolean ssl;
@Column
private boolean starttls;
// if AUTH is true, following must also be set
@Column
private boolean auth;
@Column
private String user;
@Column
private String password;
}

View File

@ -0,0 +1,56 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.configuration;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.Dossier;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.DossierTemplate;
import lombok.Data;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
import static javax.persistence.CascadeType.ALL;
@Data
@Entity
@Table(name = "type")
public class Type {
@Id
private String id;
@Column
private String type;
@Column
private String label;
@Column
private String hexColor;
@Column
private int rank;
@Column
private boolean isHint;
@Column
private boolean isCaseInsensitive;
@Column
private boolean isRecommendation;
@Column
private String description;
@Column
private long version;
@Column
private boolean addToDictionaryAction;
@OneToMany(cascade = ALL, mappedBy = "type", orphanRemoval = true, fetch = FetchType.LAZY)
private List<DictionaryEntry> entries = new ArrayList<>();
@ManyToOne
private DossierTemplate dossierTemplate;
@Column(updatable = false, insertable = false)
private String dossierTemplateId;
@ManyToOne
private Dossier dossier;
@Column(updatable = false, insertable = false)
private String dossierId;
}

View File

@ -0,0 +1,41 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.configuration;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.DossierTemplate;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Data
@Entity
@Table(name = "watermark_config")
@NoArgsConstructor
@AllArgsConstructor
public class Watermark {
@Id
@Column
private String dossierTemplateId;
@Column
private String text;
@Column
private String hexColor;
@Column
private int opacity;
@Column
private int fontSize;
@Column
private String fontType;
@Column
private WatermarkOrientation orientation;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "dossier_template_id")
private DossierTemplate dossierTemplate;
public enum WatermarkOrientation {
VERTICAL, HORIZONTAL, DIAGONAL
}
}

View File

@ -0,0 +1,78 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.dossier;
import com.iqser.red.service.persistence.service.v1.api.model.data.configuration.Type;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "dossier")
public class Dossier {
@Id
private String id;
@Column
private String dossierName;
@Column
private OffsetDateTime date;
@Column
private String description;
@Column
private DossierStatus status;
@Column
private String ownerId;
@ElementCollection
private Set<String> memberIds = new HashSet<>();
@ElementCollection
private Set<String> approverIds = new HashSet<>();
@ElementCollection
private Set<DownloadFileType> downloadFileTypes = new HashSet<>();
@Column
private boolean watermarkEnabled;
@Column
private OffsetDateTime softDeletedTime;
@Column
private OffsetDateTime hardDeletedTime;
@Column
private OffsetDateTime startDate;
@Column
private OffsetDateTime dueDate;
@ManyToOne(fetch = FetchType.LAZY)
private DossierTemplate dossierTemplate;
@Column(updatable=false, insertable=false)
private String dossierTemplateId;
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "dossiers")
private List<ReportTemplate> reportTemplates = new ArrayList<>();
@OneToMany
private List<Type> dossierTypes = new ArrayList<>();
}

View File

@ -0,0 +1,41 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.dossier;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.io.Serializable;
@Data
@Table(name = "dossier_attribute")
@Entity
public class DossierAttribute {
@EmbeddedId
private DossierAttributeId id;
@Column
private String value;
@ManyToOne(fetch = FetchType.LAZY)
private Dossier dossier;
@ManyToOne(fetch = FetchType.LAZY)
private DossierAttributeConfig dossierAttributeConfig;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public static class DossierAttributeId implements Serializable {
@Column
private String dossierId;
@Column
private String dossierAttributeConfigId;
}
}

View File

@ -0,0 +1,35 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.dossier;
import lombok.Data;
import javax.persistence.*;
@Data
@Entity
@Table(name = "dossier_attribute_config")
public class DossierAttributeConfig {
@Id
private String id;
@Column
private String label;
@Column
private boolean editable;
@Column
private String placeholder;
@Column
private DossierAttributeType type = DossierAttributeType.TEXT;
@ManyToOne
private DossierTemplate dossierTemplate;
public enum DossierAttributeType {
TEXT, NUMBER, DATE, IMAGE
}
}

View File

@ -0,0 +1,5 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.dossier;
public enum DossierStatus {
ACTIVE, DELETED
}

View File

@ -0,0 +1,57 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.dossier;
import com.iqser.red.service.persistence.service.v1.api.model.data.configuration.Type;
import lombok.Data;
import javax.persistence.*;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Data
@Entity
@Table(name = "dossier_template")
public class DossierTemplate {
@Id
private String id;
@Column
private String name;
@Column
private String description;
@Column
private OffsetDateTime dateAdded;
@Column
private OffsetDateTime dateModified;
@Column
private String createdBy;
@Column
private String modifiedBy;
@Column
private OffsetDateTime validFrom;
@Column
private OffsetDateTime validTo;
@Column
private boolean deleted;
@ElementCollection
private Set<DownloadFileType> downloadFileTypes = new HashSet<>();
@ManyToMany
private List<ReportTemplate> reportTemplates = new ArrayList<>();
@OneToMany
private List<Type> dossierTypes = new ArrayList<>();
}

View File

@ -0,0 +1,5 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.dossier;
public enum DownloadFileType {
ORIGINAL, PREVIEW, REDACTED, ANNOTATED, FLATTEN
}

View File

@ -0,0 +1,124 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.dossier;
import lombok.Data;
import javax.persistence.*;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Set;
@Data
@Entity
@Table(name = "file")
public class File {
@Id
private String id;
@Column
private String filename;
@Column
private FileStatus status;
@Column
private FileStatus lastSuccessfulStatus;
@Column
private int numberOfPages;
@Column
private OffsetDateTime added;
@Column
private OffsetDateTime lastUpdated;
@Column
private OffsetDateTime deleted;
@Column
private OffsetDateTime lastProcessed;
@Column
private OffsetDateTime lastIndexed;
@Column
private int numberOfAnalyses;
@Column
private String currentReviewer;
@Column
private String lastReviewer;
@Column
private OffsetDateTime lastManualRedaction;
@Column
private boolean hasRedactions;
@Column
private boolean hasHints;
@Column
private boolean hasSuggestions;
@Column
private boolean hasImages;
@Column
private boolean hasUpdates;
@Column
private String uploader;
@Column
private long dictionaryVersion;
@Column
private long rulesVersion;
@Column
private long dossierDictionaryVersion;
@Column
private long legalBasisVersion;
@Column
private OffsetDateTime approvalDate;
@Column
private OffsetDateTime lastUploaded;
@Column
private long analysisDuration;
@Column
private OffsetDateTime lastOCRTime;
@Column
private boolean hasAnnotationComments;
@Column
private boolean excluded;
@Column
private OffsetDateTime hardDeletedTime;
@Column
private OffsetDateTime lastFileAttributeChange;
@Column
private int analysisVersion;
@ElementCollection
private Set<Integer> excludedPages;
@OneToMany(mappedBy = "file", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<FileAttribute> fileAttributes;
@ManyToOne
private Dossier dossier;
}

View File

@ -0,0 +1,38 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.dossier;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
@Data
@Entity
@Table(name = "file_attribute")
public class FileAttribute {
@EmbeddedId
private FileAttributeId fileAttributeId;
@Column
private String value;
@ManyToOne(fetch = FetchType.LAZY)
private File file;
@ManyToOne(fetch = FetchType.LAZY)
private FileAttributeConfig fileAttributeConfig;
@Data
@Embeddable
public static class FileAttributeId implements Serializable {
@Column
private String fileId;
@Column
private String fileAttributeConfigId;
}
}

View File

@ -0,0 +1,40 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.dossier;
import lombok.Data;
import javax.persistence.*;
@Data
@Entity
@Table(name = "file_attribute_config")
public class FileAttributeConfig {
@Id
private String id;
@Column
private String csvColumnHeader;
@Column
private String label;
@Column
private boolean primaryAttribute;
@Column
private boolean editable;
@Column
private boolean filterable;
@Column
private boolean displayedInFileList;
@Column
private String placeholder;
@Column
private FileAttributeType type = FileAttributeType.TEXT;
@ManyToOne
private DossierTemplate dossierTemplate;
public enum FileAttributeType {
TEXT, NUMBER, DATE
}
}

View File

@ -0,0 +1,5 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.dossier;
public enum FileStatus {
UNPROCESSED, REPROCESS, PROCESSING, ERROR, DELETED, UNASSIGNED, UNDER_REVIEW, UNDER_APPROVAL, APPROVED, FULLREPROCESS, OCR_PROCESSING, INDEXING
}

View File

@ -0,0 +1,35 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.dossier;
import lombok.Data;
import javax.persistence.*;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.List;
@Data
@Entity
@Table(name = "report_template")
public class ReportTemplate {
@Id
private String templateId;
@Column
private String storageId;
@Column
private String fileName;
@Column
private OffsetDateTime uploadDate;
@Column
private boolean multiFileReport;
@Column
private boolean activeByDefault;
@ManyToOne(fetch = FetchType.LAZY)
private DossierTemplate dossierTemplate;
@ManyToMany
private List<Dossier> dossiers = new ArrayList<>();
}

View File

@ -0,0 +1,49 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.download;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.Dossier;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.DownloadFileType;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.File;
import lombok.Data;
import javax.persistence.*;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.List;
@Data
@Entity
@Table(name = "download_status")
public class DownloadStatus {
@Id
private String storageId;
@Column
private String userId;
@Column
private String filename;
@Column
private String mimeType;
@Column
private DownloadStatusValue status;
@Column
private OffsetDateTime creationDate;
@Column
private OffsetDateTime lastDownload;
@Column
private long fileSize;
@ManyToOne
private Dossier dossier;
@ManyToMany
private List<File> files = new ArrayList<>();
@ElementCollection
private List<DownloadFileType> downloadFileTypes = new ArrayList<>();
public enum DownloadStatusValue {
QUEUED, GENERATING, READY, FAILED
}
}

View File

@ -0,0 +1,2 @@
package com.iqser.red.service.persistence.service.v1.api.model.data.download;

View File

@ -0,0 +1 @@
lombok.anyConstructor.addConstructorProperties=true

View File

@ -0,0 +1,89 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.data.configuration.Colors;
import com.iqser.red.service.persistence.service.v1.api.model.data.configuration.Type;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ResponseStatus(value = HttpStatus.OK)
public interface DictionaryResource {
String DICTIONARY_PATH = "/dictionary";
String TYPE_PATH = DICTIONARY_PATH + "/type";
String TYPE_PARAMETER_NAME = "type";
String TYPE_PATH_VARIABLE = "/{" + TYPE_PARAMETER_NAME + "}";
String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId";
String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_PARAMETER_NAME + "}";
String DOSSIER_ID_PARAMETER_NAME = "dossierId";
String DOSSIER_PATH = "/dossier";
String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID_PARAMETER_NAME + "}";
String COLOR_PATH = "/color";
String VERSION_PATH = "/version";
@ResponseStatus(HttpStatus.NO_CONTENT)
@PostMapping(value = DICTIONARY_PATH + TYPE_PATH_VARIABLE + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void addEntries(@PathVariable(TYPE_PARAMETER_NAME) String typeId,
@RequestBody List<String> entries,
@RequestParam(value = "removeCurrent", required = false, defaultValue = "false") boolean removeCurrent);
@ResponseStatus(HttpStatus.NO_CONTENT)
@DeleteMapping(value = DICTIONARY_PATH + TYPE_PATH_VARIABLE + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void deleteEntries(@PathVariable(TYPE_PARAMETER_NAME) String typeId,
@RequestBody List<String> entries);
@ResponseStatus(HttpStatus.NO_CONTENT)
@PostMapping(value = TYPE_PATH + TYPE_PATH_VARIABLE + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void updateTypeValue(@PathVariable(TYPE_PARAMETER_NAME) String typeId,
@RequestBody Type typeValue);
@ResponseStatus(HttpStatus.NO_CONTENT)
@PostMapping(value = TYPE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE)
void addType(@RequestBody Type typeValue);
@ResponseStatus(HttpStatus.NO_CONTENT)
@DeleteMapping(value = TYPE_PATH + TYPE_PATH_VARIABLE + DOSSIER_TEMPLATE_PATH_VARIABLE)
void deleteType(@PathVariable(TYPE_PARAMETER_NAME) String typeId);
@GetMapping(value = TYPE_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
List<Type> getAllTypesForDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId);
@GetMapping(value = TYPE_PATH + DOSSIER_PATH + DOSSIER_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
List<Type> getAllTypesForDossier(@PathVariable(DOSSIER_ID_PARAMETER_NAME) String dossierId);
@GetMapping(value = DICTIONARY_PATH + TYPE_PATH_VARIABLE + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
Type getDictionaryForType(@PathVariable(TYPE_PARAMETER_NAME) String typeId);
@GetMapping(value = VERSION_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE)
long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId);
@GetMapping(value = VERSION_PATH + DOSSIER_PATH+DOSSIER_ID_PATH_VARIABLE)
long getVersionForDossier(@PathVariable(DOSSIER_ID_PARAMETER_NAME) String dossierId);
@ResponseStatus(HttpStatus.NO_CONTENT)
@PostMapping(value = COLOR_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void setColors(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody Colors colors);
@ResponseBody
@GetMapping(value = COLOR_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
Colors getColors(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId);
}

View File

@ -0,0 +1,28 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.data.configuration.DigitalSignature;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@ResponseStatus(value = HttpStatus.OK)
public interface DigitalSignatureResource {
String DIGITAL_SIGNATURE_PATH = "/digital-signature";
@ResponseStatus(HttpStatus.CREATED)
@PostMapping(value = DIGITAL_SIGNATURE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
DigitalSignature saveDigitalSignature(@RequestBody DigitalSignature digitalSignatureModel);
@ResponseStatus(HttpStatus.CREATED)
@PutMapping(value = DIGITAL_SIGNATURE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
void updateDigitalSignature(@RequestBody DigitalSignature digitalSignatureModel);
@GetMapping(value = DIGITAL_SIGNATURE_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
DigitalSignature getDigitalSignature();
@ResponseStatus(HttpStatus.NO_CONTENT)
@DeleteMapping(value = DIGITAL_SIGNATURE_PATH)
void deleteDigitalSignature();
}

View File

@ -0,0 +1,50 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.DossierAttributeConfig;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
public interface DossierAttributesResource {
String DOSSIER_ATTRIBUTES_PATH = "/dossierAttributes";
String DOSSIER_ATTRIBUTE_PATH = "/dossierAttribute";
String BASE_CONFIG_PATH = "/baseConfig";
String DOSSIER_TEMPLATE_ID = "dossierTemplateId";
String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}";
String DOSSIER_ATTRIBUTE_ID = "dossierAttributeId";
String DOSSIER_ATTRIBUTE_ID_PATH_VARIABLE = "/{" + DOSSIER_ATTRIBUTE_ID + "}";
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@PostMapping(value = DOSSIER_ATTRIBUTES_PATH + DOSSIER_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
DossierAttributeConfig addOrUpdateDossierAttribute(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId,
@RequestBody DossierAttributeConfig dossierAttributeConfig);
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@PutMapping(value = DOSSIER_ATTRIBUTES_PATH + DOSSIER_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
List<DossierAttributeConfig> setDossierAttributesConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId,
@RequestBody List<DossierAttributeConfig> dossierAttributesConfig);
@ResponseStatus(HttpStatus.NO_CONTENT)
@DeleteMapping(value = DOSSIER_ATTRIBUTES_PATH + DOSSIER_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + DOSSIER_ATTRIBUTE_ID_PATH_VARIABLE)
void deleteDossierAttribute(@PathVariable(DOSSIER_ATTRIBUTE_ID) String dossierAttributeId);
@ResponseStatus(HttpStatus.NO_CONTENT)
@PostMapping(value = DOSSIER_ATTRIBUTES_PATH + DOSSIER_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + "/delete")
void deleteDossierAttributes(@RequestBody List<String> dossierAttributeIds);
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@GetMapping(value = DOSSIER_ATTRIBUTES_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
List<DossierAttributeConfig> getDossierAttributes(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId);
}

View File

@ -0,0 +1,47 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.CreateOrUpdateDossierRequest;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.Dossier;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Set;
@ResponseStatus(value = HttpStatus.OK)
public interface DossierResource {
String REST_PATH = "/dossier";
String DELETED_DOSSIERS_PATH = "/deletedDossiers";
String HARD_DELETE_PATH = "/hardDelete";
String UNDELETE_PATH = "/undelete";
String DOSSIER_ID_PARAM = "dossierId";
String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}";
@PostMapping(value = REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
Dossier addDossier(@RequestBody CreateOrUpdateDossierRequest dossierRequest);
@PostMapping(value = REST_PATH + DOSSIER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
Dossier updateDossier(@RequestBody CreateOrUpdateDossierRequest dossierRequest, @PathVariable(DOSSIER_ID_PARAM) String dossierId);
@DeleteMapping(value = REST_PATH + DOSSIER_ID_PATH_PARAM)
void delete(@PathVariable(DOSSIER_ID_PARAM) String dossierId);
@GetMapping(value = REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
List<Dossier> getAllDossiers();
@GetMapping(value = REST_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE)
Dossier getDossierById(@PathVariable(DOSSIER_ID_PARAM) String dossierId);
@GetMapping(value = DELETED_DOSSIERS_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
List<Dossier> getSoftDeletedDossiers();
@DeleteMapping(value = DELETED_DOSSIERS_PATH + HARD_DELETE_PATH)
void hardDeleteDossiers(@RequestBody Set<String> dossierIds);
@PostMapping(value = DELETED_DOSSIERS_PATH + UNDELETE_PATH)
void undeleteDossiers(@RequestBody Set<String> dossierIds);
}

View File

@ -0,0 +1,40 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.CreateOrUpdateDossierTemplateRequest;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.DossierTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
public interface DossierTemplateResource {
String DOSSIER_TEMPLATE_PATH = "/dossier-template";
String DOSSIER_TEMPLATE_ID = "dossierTemplateId";
String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}";
String USER_ID_PARAM = "userId";
@ResponseBody
@ResponseStatus(HttpStatus.ACCEPTED)
@PostMapping(value = DOSSIER_TEMPLATE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE)
DossierTemplate createOrUpdateDossierTemplate(@RequestBody CreateOrUpdateDossierTemplateRequest dossierTemplate);
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = DOSSIER_TEMPLATE_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
List<DossierTemplate> getAllDossierTemplates();
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
DossierTemplate getDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId);
@ResponseBody
@ResponseStatus(value = HttpStatus.NO_CONTENT)
@DeleteMapping(value = DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE)
void deleteDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestParam(USER_ID_PARAM) String deletingUserId);
}

View File

@ -0,0 +1,32 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.DownloadRequest;
import com.iqser.red.service.persistence.service.v1.api.model.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.SetDownloadedRequest;
import com.iqser.red.service.persistence.service.v1.api.model.data.download.DownloadStatus;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ResponseStatus(value = HttpStatus.OK)
public interface DownloadResource {
String REST_PATH = "/download";
String USER_ID = "userId";
@PostMapping(value = REST_PATH + "/prepare", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
JSONPrimitive<String> prepareDownload(@RequestBody DownloadRequest request);
@GetMapping(value = REST_PATH + "/status/{" + USER_ID + "}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
List<DownloadStatus> getDownloadStatus(@PathVariable(USER_ID) String userId);
@PostMapping(value = REST_PATH + "/setDownloaded", consumes = MediaType.APPLICATION_JSON_VALUE)
void setDownloaded(@RequestBody JSONPrimitive<String> setDownloadedRequest);
@PostMapping(value = REST_PATH + "/delete", consumes = MediaType.APPLICATION_JSON_VALUE)
void deleteDownloadStatus(@RequestBody JSONPrimitive<String> setDownloadedRequest);
}

View File

@ -0,0 +1,64 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.data.configuration.FileAttributesGeneralConfiguration;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.FileAttributeConfig;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
public interface FileAttributesResource {
String FILE_ATTRIBUTES_PATH = "/fileAttributes";
String FILE_ATTRIBUTE_PATH = "/fileAttribute";
String BASE_CONFIG_PATH = "/baseConfig";
String DOSSIER_TEMPLATE_ID = "dossierTemplateId";
String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}";
String FILE_ATTRIBUTE_ID = "fileAttributeId";
String FILE_ATTRIBUTE_ID_PATH_VARIABLE = "/{" + FILE_ATTRIBUTE_ID + "}";
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@PostMapping(value = FILE_ATTRIBUTES_PATH + FILE_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
FileAttributeConfig addOrUpdateFileAttribute(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId,
@RequestBody FileAttributeConfig fileAttributeConfig);
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@PutMapping(value = FILE_ATTRIBUTES_PATH + BASE_CONFIG_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
FileAttributesGeneralConfiguration setFileAttributesGeneralConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId,
@RequestBody FileAttributesGeneralConfiguration fileAttributesConfig);
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@GetMapping(value = FILE_ATTRIBUTES_PATH + BASE_CONFIG_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
FileAttributesGeneralConfiguration getFileAttributesGeneralConfiguration(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId);
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@PutMapping(value = FILE_ATTRIBUTES_PATH + FILE_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
List<FileAttributeConfig> setFileAttributesConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId,
@RequestBody List<FileAttributeConfig> fileAttributesConfig);
@ResponseStatus(HttpStatus.NO_CONTENT)
@DeleteMapping(value = FILE_ATTRIBUTES_PATH + FILE_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + FILE_ATTRIBUTE_ID_PATH_VARIABLE)
void deleteFileAttribute(@PathVariable(FILE_ATTRIBUTE_ID) String fileAttributeId);
@ResponseStatus(HttpStatus.NO_CONTENT)
@PostMapping(value = FILE_ATTRIBUTES_PATH + FILE_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + "/delete")
void deleteFileAttributes(@RequestBody List<String> fileAttributeIds);
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@GetMapping(value = FILE_ATTRIBUTES_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
List<FileAttributeConfig> getFileAttributes(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId);
}

View File

@ -0,0 +1,57 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.redaction.v1.model.AnalyzeResult;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseStatus;
public interface FileStatusProcessingUpdateResource {
String STATUS_PATH = "/status-updates";
String DOSSIER_ID_PARAM = "dossierId";
String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}";
String FILE_ID = "fileId";
String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}";
@ResponseStatus(value = HttpStatus.OK)
@PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/analysis-successful", consumes = MediaType.APPLICATION_JSON_VALUE)
void analysisSuccessful(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId,
@RequestBody AnalyzeResult analyzeResult);
@ResponseStatus(value = HttpStatus.OK)
@PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/ocr-successful")
void ocrSuccessful(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@ResponseStatus(value = HttpStatus.OK)
@PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/analysis-failed")
void analysisFailed(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@ResponseStatus(value = HttpStatus.OK)
@PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/ocr-failed")
void ocrFailed(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@ResponseStatus(value = HttpStatus.OK)
@PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/indexing")
void indexing(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@ResponseStatus(value = HttpStatus.OK)
@PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/indexing-successful")
void indexingSuccessful(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@ResponseStatus(value = HttpStatus.OK)
@PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/indexing-failed")
void indexingFailed(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
}

View File

@ -0,0 +1,33 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.data.configuration.LegalBasis;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
public interface LegalBasisMappingResource {
String LEGAL_BASIS_PATH = "/legalBasis";
String VERSION_PATH = "/version";
String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId";
String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_PARAMETER_NAME + "}";
@ResponseStatus(HttpStatus.NO_CONTENT)
@PostMapping(value = LEGAL_BASIS_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void setLegalBasisMapping(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody List<LegalBasis> legalBasisMapping);
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = LEGAL_BASIS_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
List<LegalBasis> getLegalBasisMapping(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId);
@ResponseStatus(HttpStatus.OK)
@GetMapping(value = LEGAL_BASIS_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + VERSION_PATH)
long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId);
}

View File

@ -0,0 +1,18 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.LicenseReport;
import com.iqser.red.service.persistence.service.v1.api.model.LicenseReportRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
public interface LicenseReportResource {
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@PostMapping(value = "/report/license", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
LicenseReport getLicenseReport(@RequestBody LicenseReportRequest licenseReportRequest,
@RequestParam(value = "offset", defaultValue = "0") int offset,
@RequestParam(value = "limit", defaultValue = "20") int limit);
}

View File

@ -0,0 +1,154 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.*;
import com.iqser.red.service.persistence.service.v1.api.model.data.annotations.*;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@ResponseStatus(value = HttpStatus.OK)
public interface ManualRedactionResource {
String MANUAL_REDACTION_REST_PATH = "/manualRedaction";
String DOSSIER_ID = "dossierId";
String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID + "}";
String FILE_ID = "fileId";
String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}";
String ANNOTATION_ID = "annotationId";
String ANNOTATION_ID_PATH_VARIABLE = "/{" + ANNOTATION_ID + "}";
String COMMENT_ID = "commentId";
String COMMENT_ID_PATH_VARIABLE = "/{" + COMMENT_ID + "}";
@PostMapping(value = MANUAL_REDACTION_REST_PATH + "/add" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
ManualAddResponse addAddRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
@RequestBody AddRedactionRequest addRedactionRequest);
@PostMapping(value = MANUAL_REDACTION_REST_PATH + "/remove" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
ManualAddResponse addRemoveRedaction(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId,
@RequestBody RemoveRedactionRequest removeRedactionRequest);
@PostMapping(value = MANUAL_REDACTION_REST_PATH + "/force" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
ManualAddResponse addForceRedaction(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId,
@RequestBody ForceRedactionRequest forceRedactionRequest);
@PostMapping(value = MANUAL_REDACTION_REST_PATH + "/legalBasis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
ManualAddResponse addLegalBasisChange(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId,
@RequestBody LegalBasisChangeRequest legalBasisChangeRequest);
@PostMapping(value = MANUAL_REDACTION_REST_PATH + "/recategorize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
ManualAddResponse addImageRecategorization(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId,
@RequestBody ImageRecategorizationRequest imageRecategorizationRequest);
@PostMapping(value = MANUAL_REDACTION_REST_PATH + "/comment" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
Comment addComment(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId, @RequestBody CommentRequest comment);
@GetMapping(value = MANUAL_REDACTION_REST_PATH + "/add" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
ManualRedactionEntry getAddRedaction(@PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId);
@GetMapping(value = MANUAL_REDACTION_REST_PATH + "/remove" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
IdRemoval getRemoveRedaction(@PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId);
@GetMapping(value = MANUAL_REDACTION_REST_PATH + "/force" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
ManualForceRedaction getForceRedaction(@PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId);
@GetMapping(value = MANUAL_REDACTION_REST_PATH + "/legalBasis" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
ManualLegalBasisChange getLegalBasisChange(@PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId);
@GetMapping(value = MANUAL_REDACTION_REST_PATH + "/recategorize" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
ManualImageRecategorization getImageRecategorization(@PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId);
@GetMapping(value = MANUAL_REDACTION_REST_PATH + "/comment" + COMMENT_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
Comment getComment( @PathVariable(COMMENT_ID) long commentId);
@DeleteMapping(MANUAL_REDACTION_REST_PATH + "/add" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE)
void deleteAddRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId);
@DeleteMapping(MANUAL_REDACTION_REST_PATH + "/remove" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE)
void deleteRemoveRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId);
@DeleteMapping(MANUAL_REDACTION_REST_PATH + "/force" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE)
void deleteForceRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId);
@DeleteMapping(MANUAL_REDACTION_REST_PATH + "/legalBasis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE)
void deleteLegalBasisChange(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId);
@DeleteMapping(MANUAL_REDACTION_REST_PATH + "/recategorize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE)
void deleteImageRecategorization(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId);
@DeleteMapping(MANUAL_REDACTION_REST_PATH + "/comment" + FILE_ID_PATH_VARIABLE + COMMENT_ID_PATH_VARIABLE)
void deleteComment( @PathVariable(FILE_ID) String fileId,@PathVariable(COMMENT_ID) long commentId);
@PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/add" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void updateAddRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId,
@RequestBody JSONPrimitive<AnnotationStatus> updateStatusRequest);
@PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/remove" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void updateRemoveRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId,
@RequestBody JSONPrimitive<AnnotationStatus> updateStatusRequest);
@PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/force" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void updateForceRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId,
@RequestBody JSONPrimitive<AnnotationStatus> updateStatusRequest);
@PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/legalBasis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void updateLegalBasisChangeStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId,
@RequestBody JSONPrimitive<AnnotationStatus> updateStatusRequest);
@PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/recategorize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void updateImageRecategorizationStatus(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId,
@RequestBody JSONPrimitive<AnnotationStatus> updateStatusRequest);
@GetMapping(value = MANUAL_REDACTION_REST_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
ManualRedactions getManualRedactions(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId);
}

View File

@ -0,0 +1,53 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.util.Set;
@ResponseStatus(value = HttpStatus.NO_CONTENT)
public interface ReanalysisResource {
String REANALYZE_PATH = "/reanalyze";
String OCR_REANALYZE_PATH = "/ocr/reanalyze";
String REINDEX_PATH = "/reindex";
String DOSSIER_ID_PARAM = "dossierId";
String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}";
String FILE_ID_PARAM = "fileId";
String FILE_ID_PATH_PARAM = "/{" + FILE_ID_PARAM + "}";
String BULK_REST_PATH = "/bulk";
String FALSE = "false";
@PostMapping(value = REANALYZE_PATH + DOSSIER_ID_PATH_PARAM)
void reanalyzeDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force);
@PostMapping(value = REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_PARAM)
void reanalyzeFile(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID_PARAM) String fileId,
@RequestBody Set<Integer> sectionsToReanalyse);
@PostMapping(value = REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + BULK_REST_PATH)
void reanalyzeFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set<String> fileIds,
@RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force);
@PostMapping(value = OCR_REANALYZE_PATH + DOSSIER_ID_PATH_PARAM)
void ocrDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId);
@PostMapping(value = OCR_REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_PARAM)
void ocrFile(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID_PARAM) String fileId, @RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force);
@PostMapping(value = OCR_REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + BULK_REST_PATH)
void ocrFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set<String> fileIds);
@PostMapping(value = REINDEX_PATH)
void reindex(@RequestParam(value = DOSSIER_ID_PARAM, required = false) String dossierId, @RequestBody Set<String> fileIds);
}

View File

@ -0,0 +1,31 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.redaction.v1.model.RedactionLog;
import com.iqser.red.service.redaction.v1.model.SectionGrid;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(value = HttpStatus.OK)
public interface RedactionLogResource {
String REDACTION_LOG_PATH = "/redactionLog";
String SECTION_GRID_PATH = "/sectionGrid";
String FILE_ID = "fileId";
String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}";
String DOSSIER_ID_PARAM = "dossierId";
String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}";
@GetMapping(value = REDACTION_LOG_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
RedactionLog getRedactionLog(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId,
@RequestParam(value = "withManualRedactions", required = false, defaultValue = "true") boolean withManualRedactions);
@GetMapping(value = SECTION_GRID_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
SectionGrid getSectionGrid(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
}

View File

@ -0,0 +1,41 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.ReportTemplateDownload;
import com.iqser.red.service.persistence.service.v1.api.model.ReportTemplateUploadRequest;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.ReportTemplate;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
public interface ReportTemplateResource {
String REPORT_TEMPLATE_UPLOAD_PATH = "/templateUpload";
String DOSSIER_TEMPLATE_ID = "dossierTemplateId";
String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}";
String TEMPLATE_ID = "templateId";
String TEMPLATE_ID_PATH_VARIABLE = "/{" + TEMPLATE_ID + "}";
String DOWNLOAD_PATH = "download";
@PostMapping(value = REPORT_TEMPLATE_UPLOAD_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces =
MediaType.APPLICATION_JSON_VALUE)
ReportTemplate uploadTemplate(@RequestBody ReportTemplateUploadRequest reportTemplateUploadRequest);
@GetMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
List<ReportTemplate> getAvailableReportTemplates(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId);
@GetMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
ReportTemplate getReportTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId);
@GetMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + DOWNLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
ReportTemplateDownload downloadReportTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId);
@DeleteMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + TEMPLATE_ID_PATH_VARIABLE)
void deleteTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId);
}

View File

@ -0,0 +1,29 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.JSONPrimitive;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
public interface RulesResource {
String PATH = "/rules";
String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId";
String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_PARAMETER_NAME + "}";
String VERSION_PATH = "/version";
@ResponseStatus(HttpStatus.NO_CONTENT)
@PostMapping(value = PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void setRules(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody JSONPrimitive<String> rules);
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@GetMapping(value = PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
JSONPrimitive<String> getRules(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId);
@ResponseStatus(HttpStatus.OK)
@GetMapping(value = PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + VERSION_PATH)
long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId);
}

View File

@ -0,0 +1,40 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.data.configuration.SMTPConfiguration;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
public interface SMTPConfigurationResource {
String SMTP_PATH = "/smtp";
String TEST_PATH = "/test";
String TEST_EMAIL = "testEmail";
String MASK_PASSWORD = "maskPassword";
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = SMTP_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
SMTPConfiguration getCurrentSMTPConfiguration(@RequestParam(value = MASK_PASSWORD, required = false, defaultValue = "true") boolean maskPassword);
@ResponseStatus(value = HttpStatus.NO_CONTENT)
@PostMapping(value = SMTP_PATH, consumes = MediaType.APPLICATION_JSON_VALUE)
void updateSMTPConfiguration(@RequestBody SMTPConfiguration smtpConfigurationModel);
@ResponseStatus(value = HttpStatus.OK)
@PostMapping(value = SMTP_PATH + TEST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE)
void testSMTPConfiguration(@RequestParam(value = TEST_EMAIL, required = false) String testEmail, @RequestBody SMTPConfiguration smtpConfigurationModel);
@ResponseStatus(value = HttpStatus.NO_CONTENT)
@DeleteMapping(value = SMTP_PATH)
void clearSMTPConfiguration();
}

View File

@ -0,0 +1,71 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.data.dossier.File;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Set;
public interface StatusResource {
String STATUS_PATH = "/status";
String DELETED_PATH = "/softdeleted";
String DOSSIER_ID_PARAM = "dossierId";
String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}";
String FILE_ID = "fileId";
String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}";
String EXCLUDED_STATUS_PARAM = "excluded";
String APPROVER_ID_REQUEST_PARAM = "approverId";
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = STATUS_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
List<File> getAllStatuses();
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE)
List<File> getDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId);
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = STATUS_PATH + DELETED_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE)
List<File> getSoftDeletedDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId);
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
File getFileStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@PostMapping(value = STATUS_PATH + "/reviewer" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void setCurrentFileReviewer(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId,
@RequestBody JSONPrimitive<String> currentReviewer);
@PostMapping(value = STATUS_PATH + "/underreview" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
void setStatusUnderReview(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@PostMapping(value = STATUS_PATH + "/underapproval" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
void setStatusUnderApproval(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(value = APPROVER_ID_REQUEST_PARAM, required = false) String approverId);
@PostMapping(value = STATUS_PATH + "/approved" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
void setStatusApproved(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@PostMapping(value = STATUS_PATH + "/toggle-analysis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
void toggleExclusion(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(EXCLUDED_STATUS_PARAM) boolean excluded);
@PostMapping(value = STATUS_PATH + "/exclude-pages" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
void excludePages(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set<Integer> pages);
@PostMapping(value = STATUS_PATH + "/include-pages" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
void includePages(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set<Integer> pages);
}

View File

@ -0,0 +1,71 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.BinaryFileRequest;
import com.iqser.red.service.persistence.service.v1.api.model.BinaryFileResult;
import com.iqser.red.service.persistence.service.v1.api.model.JSONPrimitive;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.Set;
@ResponseStatus(value = HttpStatus.OK)
public interface UploadResource {
String SERVICE_NAME = "file-management-service-v1";
String REST_PATH = "/file";
String DELETE_PATH = REST_PATH + "/delete";
String UPLOAD_PATH = REST_PATH + "/upload";
String ORIGINAL_PATH = REST_PATH + "/original";
String ANNOTATED_PATH = REST_PATH + "/annotated";
String REDACTED_PATH = REST_PATH + "/redacted";
String PREVIEW_PATH = REST_PATH + "/preview";
String FLATTED_PATH = REST_PATH + "/flatted";
String HARD_DELETE_PATH = REST_PATH + "/hardDelete";
String UNDELETE_PATH = REST_PATH + "/undelete";
String FILE_ID = "fileId";
String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}";
String DOSSIER_ID_PARAM = "dossierId";
String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}";
@PostMapping(value = UPLOAD_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces =
MediaType.APPLICATION_JSON_VALUE)
JSONPrimitive<String> upload(@RequestBody BinaryFileRequest request);
@DeleteMapping(value = DELETE_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
void deleteFile(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@DeleteMapping(value = HARD_DELETE_PATH + DOSSIER_ID_PATH_PARAM)
void hardDeleteFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set<String> fileIds);
@PostMapping(value = UNDELETE_PATH + DOSSIER_ID_PATH_PARAM)
void undeleteFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set<String> fileIds);
@PostMapping(value = ORIGINAL_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
BinaryFileResult getOriginal(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@PostMapping(value = ANNOTATED_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
BinaryFileResult getAnnotated(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@PostMapping(value = REDACTED_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
BinaryFileResult getRedacted(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@PostMapping(value = PREVIEW_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
BinaryFileResult getPreview(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@PostMapping(value = FLATTED_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
BinaryFileResult getFlatRedacted(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
}

View File

@ -0,0 +1,34 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
public interface UserPreferenceResource {
String PREFERENCES_PATH = "/preferences";
String KEY_PARAMETER_NAME = "key";
String KEY_PATH_VARIABLE = "/{" + KEY_PARAMETER_NAME + "}";
String USER_ID_PARAMETER_NAME = "userId";
String USER_ID_PATH_VARIABLE = "/{" + USER_ID_PARAMETER_NAME + "}";
@ResponseStatus(HttpStatus.NO_CONTENT)
@PutMapping(value = PREFERENCES_PATH + USER_ID_PATH_VARIABLE + KEY_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void savePreferences(@PathVariable(USER_ID_PARAMETER_NAME) String userId, @PathVariable(KEY_PARAMETER_NAME) String key, @RequestBody JsonNode jsonNode);
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = PREFERENCES_PATH + USER_ID_PATH_VARIABLE + KEY_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
JsonNode getPreferences(@PathVariable(USER_ID_PARAMETER_NAME) String userId, @PathVariable(KEY_PARAMETER_NAME) String key);
@ResponseBody
@ResponseStatus(value = HttpStatus.NO_CONTENT)
@DeleteMapping(value = PREFERENCES_PATH + USER_ID_PATH_VARIABLE + KEY_PATH_VARIABLE)
void deletePreferences(@PathVariable(USER_ID_PARAMETER_NAME) String userId, @PathVariable(KEY_PARAMETER_NAME) String key);
}

View File

@ -0,0 +1,35 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.data.annotations.ViewedPage;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ResponseStatus(value = HttpStatus.OK)
public interface ViewedPagesResource {
String REST_PATH = "/viewedPages";
String FILE_ID = "fileId";
String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}";
String ROLE = "role";
String ROLE_PATH_VARIABLE = "/{" + ROLE + "}";
@PostMapping(value = REST_PATH + FILE_ID_PATH_VARIABLE + ROLE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void addPage(@PathVariable(FILE_ID) String fileId, @PathVariable(ROLE) String role,
@RequestBody Integer page);
@DeleteMapping(value = REST_PATH + FILE_ID_PATH_VARIABLE + ROLE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
void removePage(@PathVariable(FILE_ID) String fileId, @PathVariable(ROLE) String role,
@RequestBody Integer page);
@GetMapping(value = REST_PATH + FILE_ID_PATH_VARIABLE + ROLE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
List<ViewedPage> getViewedPages(@PathVariable(FILE_ID) String fileId, @PathVariable(ROLE) String role);
}

View File

@ -0,0 +1,26 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.data.configuration.Watermark;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@ResponseStatus(value = HttpStatus.OK)
public interface WatermarkResource {
String WATERMARK_PATH = "/watermark";
String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId";
String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_PARAMETER_NAME + "}";
@ResponseStatus(HttpStatus.CREATED)
@PostMapping(value = WATERMARK_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
Watermark saveWatermark(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody Watermark watermark);
@GetMapping(value = WATERMARK_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
Watermark getWatermark(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId);
@ResponseStatus(HttpStatus.NO_CONTENT)
@DeleteMapping(value = WATERMARK_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE)
void deleteWatermark(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId);
}

View File

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>persistence-service-v1</artifactId>
<groupId>com.iqser.red.service</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>persistence-service-processor-v1</artifactId>
<dependencies>
<dependency>
<groupId>com.iqser.red.service</groupId>
<artifactId>persistence-service-api-v1</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.iqser.red.service</groupId>
<artifactId>pdftron-redaction-service-api-v1</artifactId>
<version>2.18.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- commons -->
<dependency>
<groupId>com.iqser.red.commons</groupId>
<artifactId>jackson-commons</artifactId>
</dependency>
<dependency>
<groupId>com.iqser.red.commons</groupId>
<artifactId>storage-commons</artifactId>
</dependency>
<dependency>
<groupId>com.iqser.red.commons</groupId>
<artifactId>logging-commons</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- other external -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<scope>provided</scope>
</dependency>
<!-- test -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<version>1.15.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,12 @@
package com.iqser.red.service.persistence.management.v1.processor;
import com.iqser.red.service.persistence.management.v1.processor.client.PDFTronRedactionClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
@EnableFeignClients(basePackageClasses = {PDFTronRedactionClient.class})
public class PersistenceServiceProcessorConfiguration {
}

View File

@ -0,0 +1,9 @@
package com.iqser.red.service.persistence.management.v1.processor.client;
import com.iqser.red.service.pdftron.redaction.v1.api.resources.PDFTronRedactionResource;
import org.springframework.cloud.openfeign.FeignClient;
@FeignClient(name = "PDFTronRedactionResource", url = "${pdftron-redaction-service.url}")
public interface PDFTronRedactionClient extends PDFTronRedactionResource {
}

View File

@ -0,0 +1,13 @@
package com.iqser.red.service.persistence.management.v1.processor.exception;
public class BadRequestException extends RuntimeException {
public BadRequestException(String message) {
super(message);
}
public BadRequestException(String message, Throwable t) {
super(message, t);
}
}

View File

@ -0,0 +1,9 @@
package com.iqser.red.service.persistence.management.v1.processor.exception;
public class ConflictException extends RuntimeException {
public ConflictException(String message) {
super(message);
}
}

View File

@ -0,0 +1,11 @@
package com.iqser.red.service.persistence.management.v1.processor.exception;
public class DossierNotFoundException extends RuntimeException {
public static final String DOSSIER_NOT_FOUND_MESSAGE = "Dossier with DossierId %s not found in the database.";
public DossierNotFoundException(String message) {
super(message);
}
}

View File

@ -0,0 +1,9 @@
package com.iqser.red.service.persistence.management.v1.processor.exception;
public class FileNotFoundException extends RuntimeException {
public FileNotFoundException(String message) {
super(message);
}
}

View File

@ -0,0 +1,13 @@
package com.iqser.red.service.persistence.management.v1.processor.exception;
public class InternalServerErrorException extends RuntimeException {
public InternalServerErrorException(String message) {
super(message);
}
public InternalServerErrorException(String message, Throwable t) {
super(message, t);
}
}

View File

@ -0,0 +1,9 @@
package com.iqser.red.service.persistence.management.v1.processor.exception;
public class NotFoundException extends RuntimeException {
public NotFoundException(String message) {
super(message);
}
}

View File

@ -0,0 +1,10 @@
package com.iqser.red.service.persistence.management.v1.processor.exception;
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}

View File

@ -0,0 +1,9 @@
package com.iqser.red.service.persistence.management.v1.processor.exception;
public class ValidationException extends RuntimeException {
public ValidationException(String message) {
super(message);
}
}

Some files were not shown because too many files have changed in this diff Show More