diff --git a/persistence-service-image-v1/pom.xml b/persistence-service-image-v1/pom.xml
index c14e9c1bb..4472353ac 100644
--- a/persistence-service-image-v1/pom.xml
+++ b/persistence-service-image-v1/pom.xml
@@ -5,7 +5,7 @@
com.iqser.red
platform-docker-dependency
- 1.0.1
+ 1.1.0
4.0.0
diff --git a/persistence-service-v1/persistence-service-api-v1/pom.xml b/persistence-service-v1/persistence-service-api-v1/pom.xml
index 960a22db7..cff2c573b 100644
--- a/persistence-service-v1/persistence-service-api-v1/pom.xml
+++ b/persistence-service-v1/persistence-service-api-v1/pom.xml
@@ -36,11 +36,6 @@
feign-core
true
-
-
- jakarta.persistence
- jakarta.persistence-api
-
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/AddRedactionRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/AddRedactionRequest.java
index 6030bdbea..854931447 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/AddRedactionRequest.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/AddRedactionRequest.java
@@ -28,4 +28,6 @@ public class AddRedactionRequest {
private String comment;
+ private boolean forceAddToDictionary;
+
}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ForceRedactionRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ForceRedactionRequest.java
index 47b00145c..870da2186 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ForceRedactionRequest.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ForceRedactionRequest.java
@@ -16,5 +16,6 @@ public class ForceRedactionRequest {
private AnnotationStatus status;
private String legalBasis;
private String comment;
+ private int page;
}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ImageRecategorizationRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ImageRecategorizationRequest.java
index 14ac8bfbd..6dd15bc98 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ImageRecategorizationRequest.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ImageRecategorizationRequest.java
@@ -16,5 +16,6 @@ public class ImageRecategorizationRequest {
private AnnotationStatus status;
private String typeId;
private String comment;
+ private int page;
}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/LegalBasisChangeRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/LegalBasisChangeRequest.java
index b8a83416f..5244f9ac3 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/LegalBasisChangeRequest.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/LegalBasisChangeRequest.java
@@ -16,5 +16,6 @@ public class LegalBasisChangeRequest {
private AnnotationStatus status;
private String legalBasis;
private String comment;
+ private int page;
}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualForceRedaction.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualForceRedaction.java
index 4edca2348..05474427b 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualForceRedaction.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualForceRedaction.java
@@ -5,16 +5,12 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import javax.persistence.Entity;
-import javax.persistence.Table;
import java.time.OffsetDateTime;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
-@Entity
-@Table(name = "manual_force_redaction")
public class ManualForceRedaction {
private String annotationId;
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualImageRecategorization.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualImageRecategorization.java
index bd46ab120..b6726144f 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualImageRecategorization.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualImageRecategorization.java
@@ -5,16 +5,12 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import javax.persistence.Entity;
-import javax.persistence.Table;
import java.time.OffsetDateTime;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
-@Entity
-@Table(name = "manual_image_recategorization")
public class ManualImageRecategorization {
private String annotationId;
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualLegalBasisChange.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualLegalBasisChange.java
index 9b1c20046..52e6d6219 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualLegalBasisChange.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualLegalBasisChange.java
@@ -5,16 +5,12 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import javax.persistence.Entity;
-import javax.persistence.Table;
import java.time.OffsetDateTime;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
-@Entity
-@Table(name = "manual_legal_basis_change")
public class ManualLegalBasisChange {
private String annotationId;
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactionEntry.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactionEntry.java
index 9db064187..51b20c828 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactionEntry.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactionEntry.java
@@ -5,18 +5,14 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import javax.persistence.Entity;
-import javax.persistence.Table;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.List;
@Data
-@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
-@Table(name = "manual_redaction")
public class ManualRedactionEntry {
private String annotationId;
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactions.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactions.java
index 9fce6c05a..3a86a9c94 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactions.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactions.java
@@ -28,6 +28,9 @@ public class ManualRedactions {
@Builder.Default
private Set legalBasisChanges = new HashSet<>();
+ @Builder.Default
+ private Set resizeRedactions = new HashSet<>();
+
@Builder.Default
private Map> comments = new HashMap<>();
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualResizeRedaction.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualResizeRedaction.java
new file mode 100644
index 000000000..687eaef38
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualResizeRedaction.java
@@ -0,0 +1,29 @@
+package com.iqser.red.service.persistence.service.v1.api.model.annotations;
+
+import java.time.OffsetDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ManualResizeRedaction {
+
+ private String annotationId;
+ private String fileId;
+ private String user;
+ private AnnotationStatus status;
+ private OffsetDateTime requestDate;
+ private OffsetDateTime processedDate;
+ private OffsetDateTime softDeletedTime;
+ private String value;
+ @Builder.Default
+ private List positions = new ArrayList<>();
+
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/Rectangle.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/Rectangle.java
index a2b9dffc1..7bd332d87 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/Rectangle.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/Rectangle.java
@@ -5,20 +5,12 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import javax.persistence.*;
-
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
-@Entity
-@Table(name = "rectangle")
public class Rectangle {
- @Id
- @GeneratedValue
- private long id;
-
private float topLeftX;
@@ -30,6 +22,4 @@ public class Rectangle {
private int page;
- @ManyToOne(fetch = FetchType.LAZY)
- private ManualRedactionEntry manualRedaction;
}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/RemoveRedactionRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/RemoveRedactionRequest.java
index 2ddec5930..d655589e7 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/RemoveRedactionRequest.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/RemoveRedactionRequest.java
@@ -16,5 +16,6 @@ public class RemoveRedactionRequest {
private AnnotationStatus status;
private boolean removeFromDictionary;
private String comment;
+ private int page;
}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ResizeRedactionRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ResizeRedactionRequest.java
new file mode 100644
index 000000000..c9ee927a5
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ResizeRedactionRequest.java
@@ -0,0 +1,26 @@
+package com.iqser.red.service.persistence.service.v1.api.model.annotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ResizeRedactionRequest {
+
+ private String annotationId;
+ private String user;
+ private AnnotationStatus status;
+ private String comment;
+ private int page;
+ private String value;
+
+ @Builder.Default
+ private List positions = new ArrayList<>();
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AuditModel.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AuditModel.java
index f1412b869..19c14e11b 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AuditModel.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AuditModel.java
@@ -5,8 +5,6 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import javax.persistence.Entity;
-import javax.persistence.Table;
import java.time.OffsetDateTime;
import java.util.HashMap;
import java.util.Map;
@@ -15,8 +13,6 @@ import java.util.Map;
@Builder
@NoArgsConstructor
@AllArgsConstructor
-@Entity
-@Table(name = "audit")
public class AuditModel {
private long recordId;
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java
index 64210c033..487604081 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java
@@ -1,6 +1,5 @@
package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate;
-
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -23,14 +22,6 @@ public class CreateOrUpdateDossierTemplateRequest {
private String description;
- private OffsetDateTime dateAdded;
-
- private OffsetDateTime dateModified;
-
- private String createdBy;
-
- private String modifiedBy;
-
private OffsetDateTime validFrom;
private OffsetDateTime validTo;
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierAttributeConfig.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierAttributeConfig.java
index f64234980..810a6c1f1 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierAttributeConfig.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierAttributeConfig.java
@@ -6,8 +6,6 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import javax.persistence.Id;
-
@Data
@Builder
@@ -15,7 +13,6 @@ import javax.persistence.Id;
@AllArgsConstructor
public class DossierAttributeConfig {
- @Id
private String id;
private String label;
private boolean editable;
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStats.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStats.java
new file mode 100644
index 000000000..90ca2c83b
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStats.java
@@ -0,0 +1,28 @@
+package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Map;
+
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class DossierStats {
+ private String dossierId;
+ private int numberOfFiles;
+ private int numberOfAnalysedPages; // sum of analysedPages
+ private boolean hasRedactionsFilePresent; // true if at least one file in the dossier has redactions
+ private boolean hasHintsNoRedactionsFilePresent; // true if at least one file in the dossier has hints but doesn't have redactions
+ private boolean hasSuggestionsFilePresent; // true if at least one file in the dossier has suggestions
+ private boolean hasUpdatesFilePresent; //true if at least one file in the dossier has updates
+ private boolean hasNoFlagsFilePresent; // true if at least one file in the dossier has none of the other flags
+ private Map fileCountPerProcessingStatus;
+ private Map fileCountPerWorkflowStatus;
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileModel.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileModel.java
index 1929e22b1..83bc8aa8b 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileModel.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileModel.java
@@ -6,8 +6,6 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import javax.persistence.Entity;
-import javax.persistence.Table;
import java.time.OffsetDateTime;
import java.util.HashMap;
import java.util.HashSet;
@@ -18,15 +16,13 @@ import java.util.Set;
@Builder
@AllArgsConstructor
@NoArgsConstructor
-@Entity
-@Table(name = "file")
public class FileModel {
@JsonProperty("fileId")
private String id;
private String filename;
- private FileStatus status;
- private FileStatus lastSuccessfulStatus;
+ private ProcessingStatus processingStatus;
+ private WorkflowStatus workflowStatus;
private int numberOfPages;
private OffsetDateTime added;
private OffsetDateTime lastUpdated;
@@ -42,6 +38,7 @@ public class FileModel {
private boolean hasSuggestions;
private boolean hasImages;
private boolean hasUpdates;
+ private boolean analysisRequired;
private String uploader;
private long dictionaryVersion;
private long rulesVersion;
@@ -59,6 +56,7 @@ public class FileModel {
private Set excludedPages = new HashSet<>();
private Map fileAttributes = new HashMap<>();
private String dossierId;
+ private String dossierTemplateId;
}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileStatus.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileStatus.java
deleted file mode 100644
index 2f91739a8..000000000
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileStatus.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file;
-
-public enum FileStatus {
- UNPROCESSED, REPROCESS, PROCESSING, ERROR, DELETED, UNASSIGNED, UNDER_REVIEW, UNDER_APPROVAL, APPROVED, FULLREPROCESS, OCR_PROCESSING, INDEXING
-}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/ProcessingStatus.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/ProcessingStatus.java
new file mode 100644
index 000000000..f70270a68
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/ProcessingStatus.java
@@ -0,0 +1,5 @@
+package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file;
+
+public enum ProcessingStatus {
+ UNPROCESSED, REPROCESS, PROCESSING, PROCESSED, ERROR, DELETED, FULLREPROCESS, OCR_PROCESSING, INDEXING
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/WorkflowStatus.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/WorkflowStatus.java
new file mode 100644
index 000000000..9fa433590
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/WorkflowStatus.java
@@ -0,0 +1,5 @@
+package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file;
+
+public enum WorkflowStatus {
+ UNASSIGNED, UNDER_REVIEW, UNDER_APPROVAL, APPROVED
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/legalbasis/LegalBasis.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/legalbasis/LegalBasis.java
index 0b921ea80..81e8f256f 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/legalbasis/LegalBasis.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/legalbasis/LegalBasis.java
@@ -11,7 +11,6 @@ import lombok.NoArgsConstructor;
@Builder
public class LegalBasis {
- private long id;
private String name;
private String description;
private String reason;
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/Type.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/Type.java
index 766341e5f..59e4414ac 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/Type.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/Type.java
@@ -1,5 +1,6 @@
package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -29,4 +30,10 @@ public class Type {
private String dossierId;
private List entries = new ArrayList<>();
+ // For auto-mappers
+ @JsonIgnore
+ public String getTypeId() {
+ return this.id;
+ }
+
}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/license/ReportData.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/license/ReportData.java
index 9f80f69c1..db697af60 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/license/ReportData.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/license/ReportData.java
@@ -1,7 +1,5 @@
package com.iqser.red.service.persistence.service.v1.api.model.license;
-
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -9,6 +7,8 @@ import lombok.NoArgsConstructor;
import java.time.Instant;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
+
@Data
@Builder
@AllArgsConstructor
@@ -22,7 +22,7 @@ public class ReportData {
private Instant deletedDate;
private int numberOfAnalyzedPages;
private int numberOfOcrPages;
- private FileStatus status;
+ private WorkflowStatus workflowStatus;
private int analysisCount;
}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/EmailNotificationType.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/EmailNotificationType.java
new file mode 100644
index 000000000..7875f1b2e
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/EmailNotificationType.java
@@ -0,0 +1,5 @@
+package com.iqser.red.service.persistence.service.v1.api.model.notification;
+
+public enum EmailNotificationType {
+ DAILY, DAILY_SUMMARY, WEEKLY_SUMMARY
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/NotificationPreferences.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/NotificationPreferences.java
new file mode 100644
index 000000000..8a98bac17
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/NotificationPreferences.java
@@ -0,0 +1,25 @@
+package com.iqser.red.service.persistence.service.v1.api.model.notification;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class NotificationPreferences {
+
+ private String userId;
+ private boolean inAppNotificationsEnabled;
+ private boolean emailNotificationsEnabled;
+ private EmailNotificationType emailNotificationType;
+ @Builder.Default
+ private List emailNotifications = new ArrayList<>();
+ @Builder.Default
+ private List inAppNotifications = new ArrayList<>();
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierResource.java
index bac573ce7..b8ed39205 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierResource.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierResource.java
@@ -1,11 +1,13 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
+import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
+import java.time.OffsetDateTime;
import java.util.List;
import java.util.Set;
@@ -20,6 +22,17 @@ public interface DossierResource {
String DOSSIER_ID_PARAM = "dossierId";
String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}";
+ String INCLUDE_DELETED_PARAM = "includeDeleted";
+
+ String SINCE_REQUEST_PARAM="since";
+
+ String CHANGES_PATH = "/has-changes";
+
+ @ResponseBody
+ @ResponseStatus(value = HttpStatus.OK)
+ @GetMapping(value = REST_PATH+CHANGES_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
+ JSONPrimitive hasChangesSince(@RequestParam(SINCE_REQUEST_PARAM) OffsetDateTime since);
+
@PostMapping(value = REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
Dossier addDossier(@RequestBody CreateOrUpdateDossierRequest dossierRequest);
@@ -33,7 +46,8 @@ public interface DossierResource {
List getAllDossiers();
@GetMapping(value = REST_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE)
- Dossier getDossierById(@PathVariable(DOSSIER_ID_PARAM) String dossierId);
+ Dossier getDossierById(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
+ @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted);
@GetMapping(value = DELETED_DOSSIERS_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
List getSoftDeletedDossiers();
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierStatsResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierStatsResource.java
new file mode 100644
index 000000000..ab5a53e67
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierStatsResource.java
@@ -0,0 +1,26 @@
+package com.iqser.red.service.persistence.service.v1.api.resources;
+
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStats;
+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.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public interface DossierStatsResource {
+
+ String REST_PATH = "/dossier-stats";
+
+ String DOSSIER_ID_PARAM = "dossierId";
+ String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}";
+
+ @GetMapping(value = REST_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE)
+ DossierStats getDossierStats(@PathVariable(DOSSIER_ID_PARAM) String dossierId);
+
+ @PostMapping(value = REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
+ List getDossierStats(@RequestBody Set dossierIds);
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/LegalBasisMappingResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/LegalBasisMappingResource.java
index 7b7811efa..2bd36c7f4 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/LegalBasisMappingResource.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/LegalBasisMappingResource.java
@@ -10,16 +10,22 @@ import java.util.List;
public interface LegalBasisMappingResource {
String LEGAL_BASIS_PATH = "/legalBasis";
+ String DELETE_PATH = "/delete";
String VERSION_PATH = "/version";
String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId";
String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_PARAMETER_NAME + "}";
+ @PostMapping(value = LEGAL_BASIS_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + DELETE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE)
+ void deleteLegalBasis(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody List legalBasisNames);
+
+ @PutMapping(value = LEGAL_BASIS_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
+ void addOrUpdateLegalBasis(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody LegalBasis legalBasis);
+
@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 legalBasisMapping);
-
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = LEGAL_BASIS_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ManualRedactionResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ManualRedactionResource.java
index 65b20c199..53be0eeb2 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ManualRedactionResource.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ManualRedactionResource.java
@@ -58,6 +58,12 @@ public interface ManualRedactionResource {
@PathVariable(ANNOTATION_ID) String annotationId, @RequestBody CommentRequest comment);
+ @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/resize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+ ManualAddResponse addResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId,
+ @PathVariable(FILE_ID) String fileId,
+ @RequestBody ResizeRedactionRequest resizeRedactionRequest);
+
+
@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);
@@ -87,6 +93,11 @@ public interface ManualRedactionResource {
Comment getComment(@PathVariable(COMMENT_ID) long commentId);
+ @GetMapping(value = MANUAL_REDACTION_REST_PATH + "/resize" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
+ ManualResizeRedaction getResizeRedaction(@PathVariable(FILE_ID) String fileId,
+ @PathVariable(ANNOTATION_ID) String annotationId);
+
+
@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);
@@ -116,6 +127,11 @@ public interface ManualRedactionResource {
void deleteComment(@PathVariable(FILE_ID) String fileId, @PathVariable(COMMENT_ID) long commentId);
+ @DeleteMapping(MANUAL_REDACTION_REST_PATH + "/resize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE)
+ void deleteResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
+ @PathVariable(ANNOTATION_ID) String annotationId);
+
+
@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,
@@ -146,6 +162,11 @@ public interface ManualRedactionResource {
@PathVariable(ANNOTATION_ID) String annotationId,
@RequestBody JSONPrimitive updateStatusRequest);
+ @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/resize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
+ void updateResizeRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
+ @PathVariable(ANNOTATION_ID) String annotationId,
+ @RequestBody JSONPrimitive 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,
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationPreferencesResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationPreferencesResource.java
new file mode 100644
index 000000000..44831c77f
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationPreferencesResource.java
@@ -0,0 +1,25 @@
+package com.iqser.red.service.persistence.service.v1.api.resources;
+
+import com.iqser.red.service.persistence.service.v1.api.model.notification.NotificationPreferences;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+public interface NotificationPreferencesResource {
+
+ String REST_PATH = "/notification-preferences";
+
+ String USER_ID_PARAM = "userId";
+ String USER_ID_PATH_PARAM = "/{" + USER_ID_PARAM + "}";
+
+
+ @PostMapping(value = REST_PATH + USER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE)
+ void setNotificationPreferences(@PathVariable(USER_ID_PARAM) String userId, @RequestBody NotificationPreferences notificationRequest);
+
+ @ResponseStatus(value = HttpStatus.OK)
+ @GetMapping(value = REST_PATH + USER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE)
+ NotificationPreferences getNotificationPreferences(@PathVariable(USER_ID_PARAM) String userId);
+
+ @DeleteMapping(value = REST_PATH + USER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE)
+ void deleteNotificationPreferences(@PathVariable(USER_ID_PARAM) String userId);
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationResource.java
index 23dcdb924..a83e081e6 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationResource.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationResource.java
@@ -1,11 +1,13 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.audit.AddNotificationRequest;
+import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.notification.Notification;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
+import java.time.OffsetDateTime;
import java.util.List;
@ResponseStatus(value = HttpStatus.OK)
@@ -14,6 +16,7 @@ public interface NotificationResource {
String NOTIFICATION_PATH = "/notification";
String TOGGLE_SEEN_PATH = "/toggle-seen";
String TOGGLE_READ_PATH = "/toggle-read";
+ String CHANGES_PATH = "/has-changes";
String USER_ID_PARAM = "userId";
String USER_ID_PATH_PARAM = "/{" + USER_ID_PARAM + "}";
@@ -21,7 +24,13 @@ public interface NotificationResource {
String INCLUDE_SEEN_PARAM = "includeSeen";
String SET_SEEN_PARAM = "setSeen";
String SET_READ_PARAM = "setRead";
+ String SINCE_REQUEST_PARAM = "since";
+ @ResponseBody
+ @ResponseStatus(value = HttpStatus.OK)
+ @GetMapping(value = NOTIFICATION_PATH + CHANGES_PATH + USER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE)
+ JSONPrimitive hasNewNotificationsSince(@PathVariable(USER_ID_PARAM) String userId,
+ @RequestParam(SINCE_REQUEST_PARAM) OffsetDateTime since);
@PostMapping(value = NOTIFICATION_PATH, consumes = MediaType.APPLICATION_JSON_VALUE)
void addNotification(@RequestBody AddNotificationRequest addNotificationRequest);
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/StatusResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/StatusResource.java
index fda563f8f..c14be1f06 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/StatusResource.java
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/StatusResource.java
@@ -6,6 +6,7 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
+import java.time.OffsetDateTime;
import java.util.List;
import java.util.Set;
@@ -19,15 +20,26 @@ public interface StatusResource {
String FILE_ID = "fileId";
String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}";
+ String CHANGES_PATH = "/has-changes";
+
String EXCLUDED_STATUS_PARAM = "excluded";
String APPROVER_ID_REQUEST_PARAM = "approverId";
+ String REVIEWER_ID_REQUEST_PARAM = "reviewerId";
+ String SINCE_REQUEST_PARAM="since";
+
+
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = STATUS_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
List getAllStatuses();
+ @ResponseBody
+ @ResponseStatus(value = HttpStatus.OK)
+ @GetMapping(value = STATUS_PATH+DOSSIER_ID_PATH_PARAM+CHANGES_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
+ JSONPrimitive hasChangesSince(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestParam(SINCE_REQUEST_PARAM) OffsetDateTime since);
+
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE)
@@ -47,7 +59,7 @@ public interface StatusResource {
@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 currentReviewer);
+ @RequestParam(value = REVIEWER_ID_REQUEST_PARAM, required =false) String reviewerId);
@PostMapping(value = STATUS_PATH + "/underreview" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
diff --git a/persistence-service-v1/persistence-service-processor-v1/pom.xml b/persistence-service-v1/persistence-service-processor-v1/pom.xml
index 3347fd5a6..bcca653f1 100644
--- a/persistence-service-v1/persistence-service-processor-v1/pom.xml
+++ b/persistence-service-v1/persistence-service-processor-v1/pom.xml
@@ -98,7 +98,6 @@
com.google.guava
guava
- 29.0-jre
compile
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/CommentEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/CommentEntity.java
index 3c7f1aee9..3a1df8529 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/CommentEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/CommentEntity.java
@@ -29,7 +29,7 @@ public class CommentEntity {
@Column
private OffsetDateTime date;
- @Column
+ @Column(length = 4000)
private String text;
@Column(name = "user_id")
private String user;
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IdRemovalEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IdRemovalEntity.java
index 379e6bfde..19601aeb1 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IdRemovalEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IdRemovalEntity.java
@@ -23,6 +23,7 @@ public class IdRemovalEntity {
@Column(name = "user_id")
private String user;
@Column
+ @Enumerated(EnumType.STRING)
private AnnotationStatus status;
@Column
private boolean removeFromDictionary;
@@ -32,6 +33,8 @@ public class IdRemovalEntity {
private OffsetDateTime processedDate;
@Column
private OffsetDateTime softDeletedTime;
+ @Column
+ private int page;
@ManyToOne
private FileEntity fileStatus;
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualForceRedactionEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualForceRedactionEntity.java
index 0d1022c4d..a4f4fb7b2 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualForceRedactionEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualForceRedactionEntity.java
@@ -23,8 +23,9 @@ public class ManualForceRedactionEntity {
@Column(name = "user_id")
private String user;
@Column
+ @Enumerated(EnumType.STRING)
private AnnotationStatus status;
- @Column
+ @Column(length = 4000)
private String legalBasis;
@Column
private OffsetDateTime requestDate;
@@ -32,6 +33,8 @@ public class ManualForceRedactionEntity {
private OffsetDateTime processedDate;
@Column
private OffsetDateTime softDeletedTime;
+ @Column
+ private int page;
@ManyToOne
private FileEntity fileStatus;
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualImageRecategorizationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualImageRecategorizationEntity.java
index c6fdfb3e2..8e85d596f 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualImageRecategorizationEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualImageRecategorizationEntity.java
@@ -23,6 +23,7 @@ public class ManualImageRecategorizationEntity {
@Column(name = "user_id")
private String user;
@Column
+ @Enumerated(EnumType.STRING)
private AnnotationStatus status;
@Column
private String typeId;
@@ -32,6 +33,8 @@ public class ManualImageRecategorizationEntity {
private OffsetDateTime processedDate;
@Column
private OffsetDateTime softDeletedTime;
+ @Column
+ private int page;
@ManyToOne
private FileEntity fileStatus;
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualLegalBasisChangeEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualLegalBasisChangeEntity.java
index 854d82d15..9161c6251 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualLegalBasisChangeEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualLegalBasisChangeEntity.java
@@ -24,6 +24,7 @@ public class ManualLegalBasisChangeEntity {
@Column(name = "user_id")
private String user;
@Column
+ @Enumerated(EnumType.STRING)
private AnnotationStatus status;
@Column
private String legalBasis;
@@ -33,6 +34,8 @@ public class ManualLegalBasisChangeEntity {
private OffsetDateTime processedDate;
@Column
private OffsetDateTime softDeletedTime;
+ @Column
+ private int page;
@ManyToOne
private FileEntity fileStatus;
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRedactionEntryEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRedactionEntryEntity.java
index 1d6d479fc..2a73486a1 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRedactionEntryEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRedactionEntryEntity.java
@@ -24,15 +24,16 @@ public class ManualRedactionEntryEntity {
private AnnotationEntityId id;
@Column(name = "user_id")
private String user;
- @Column
+ @Column(length = 4000)
private String typeId;
- @Column
+ @Column(length = 4000)
private String value;
- @Column
+ @Column(length = 4000)
private String reason;
@Column
private String legalBasis;
@Column
+ @Enumerated(EnumType.STRING)
private AnnotationStatus status;
@Column
private boolean addToDictionary;
@@ -45,8 +46,7 @@ public class ManualRedactionEntryEntity {
@Column
private OffsetDateTime softDeletedTime;
-
- @OneToMany(mappedBy = "manualRedaction", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+ @ElementCollection
private List positions = new ArrayList<>();
@ManyToOne
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java
new file mode 100644
index 000000000..a42c50cfe
--- /dev/null
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java
@@ -0,0 +1,56 @@
+package com.iqser.red.service.persistence.management.v1.processor.entity.annotations;
+
+import java.time.OffsetDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.ElementCollection;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
+import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Table(name = "manual_resize_redaction")
+public class ManualResizeRedactionEntity {
+
+ @EmbeddedId
+ private AnnotationEntityId id;
+ @Column(name = "user_id")
+ private String user;
+ @Column
+ @Enumerated(EnumType.STRING)
+ private AnnotationStatus status;
+ @Column
+ private OffsetDateTime requestDate;
+ @Column
+ private OffsetDateTime processedDate;
+ @Column
+ private OffsetDateTime softDeletedTime;
+ @Column
+ private int page;
+ @Column
+ private String value;
+
+ @ManyToOne
+ private FileEntity fileStatus;
+
+ @ElementCollection
+ private List positions = new ArrayList<>();
+
+}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/RectangleEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/RectangleEntity.java
index 5c40efb55..5180c429a 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/RectangleEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/RectangleEntity.java
@@ -5,31 +5,19 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import javax.persistence.*;
+import javax.persistence.Embeddable;
@Data
@Builder
+@Embeddable
@AllArgsConstructor
@NoArgsConstructor
-@Entity
-@Table(name = "rectangle")
public class RectangleEntity {
- @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 ManualRedactionEntryEntity manualRedaction;
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ViewedPageEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ViewedPageEntity.java
index 679db9730..54c09f95d 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ViewedPageEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ViewedPageEntity.java
@@ -26,6 +26,10 @@ public class ViewedPageEntity {
@MapsId("fileId")
private FileEntity file;
+ public int getPage() {
+ return this.id.page;
+ }
+
@Data
@Builder
@Embeddable
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/audit/AuditEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/audit/AuditEntity.java
index f0cca830d..8015cd942 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/audit/AuditEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/audit/AuditEntity.java
@@ -1,6 +1,6 @@
package com.iqser.red.service.persistence.management.v1.processor.entity.audit;
-import com.iqser.red.service.persistence.service.v1.api.utils.JSONConverter;
+import com.iqser.red.service.persistence.management.v1.processor.utils.JSONConverter;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -32,7 +32,7 @@ public class AuditEntity {
private String category;
@Column
private String userId;
- @Column
+ @Column(length = 4000)
private String message;
@Basic(fetch = FetchType.EAGER)
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryEntryEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryEntryEntity.java
index d53ca6ed9..a5964b817 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryEntryEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryEntryEntity.java
@@ -19,7 +19,7 @@ public class DictionaryEntryEntity {
@Id
@GeneratedValue
private long entryId;
- @Column
+ @Column(length = 4000)
private String value;
@Column
private long version;
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisEntity.java
index 8b43ab5d3..6fa0b5c9e 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisEntity.java
@@ -8,21 +8,16 @@ import lombok.NoArgsConstructor;
import javax.persistence.*;
@Data
-@NoArgsConstructor
-@Entity
-@AllArgsConstructor
@Builder
-@Table(name = "legal_basis")
+@Embeddable
+@AllArgsConstructor
+@NoArgsConstructor
public class LegalBasisEntity {
- @Id
- @GeneratedValue
- private long id;
- @Column
private String name;
- @Column(columnDefinition = "text")
+ @Column(length = 4000)
private String description;
- @Column(columnDefinition = "text")
+ @Column(length = 4000)
private String reason;
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisMappingEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisMappingEntity.java
index 3e3ae43b5..0cd6cfaa9 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisMappingEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisMappingEntity.java
@@ -18,7 +18,7 @@ public class LegalBasisMappingEntity {
@Column
private long version;
- @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+ @ElementCollection
private List legalBasis = new ArrayList<>();
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/TypeEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/TypeEntity.java
index 3bb21160f..137b2edc9 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/TypeEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/TypeEntity.java
@@ -38,7 +38,7 @@ public class TypeEntity {
private boolean isCaseInsensitive;
@Column
private boolean isRecommendation;
- @Column
+ @Column(length = 4000)
private String description;
@Column
private long version;
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java
index c8fe951ed..6e5b0f037 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java
@@ -21,7 +21,7 @@ public class WatermarkEntity {
@Id
@Column
private String dossierTemplateId;
- @Column(columnDefinition = "text")
+ @Column(length = 4000)
private String text;
@Column
private String hexColor;
@@ -32,6 +32,7 @@ public class WatermarkEntity {
@Column
private String fontType;
@Column
+ @Enumerated(EnumType.STRING)
private WatermarkOrientation orientation;
@JsonIgnore
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java
index b3d818cda..c64ab6a4a 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java
@@ -27,6 +27,7 @@ public class DossierAttributeConfigEntity {
private String placeholder;
@Column
+ @Enumerated(EnumType.STRING)
private DossierAttributeType type = DossierAttributeType.TEXT;
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeEntity.java
index 15e1359bd..1abf09634 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeEntity.java
@@ -21,7 +21,8 @@ public class DossierAttributeEntity {
@EmbeddedId
private DossierAttributeEntityId id;
- @Column
+ // TODO Maybe @Lob, for larger images
+ @Column(columnDefinition = "TEXT")
private String value;
@JsonIgnore
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java
index ecb1273eb..c1995b577 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java
@@ -34,6 +34,9 @@ public class DossierEntity {
private OffsetDateTime date;
@Column
+ private OffsetDateTime lastUpdated;
+
+ @Column(length = 4000)
private String description;
@Column
@@ -52,6 +55,7 @@ public class DossierEntity {
@Builder.Default
@ElementCollection
+ @Enumerated(EnumType.STRING)
private Set downloadFileTypes = new HashSet<>();
@Column
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java
index 6f3e6c5b6..326cb7334 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java
@@ -27,10 +27,10 @@ public class DossierTemplateEntity {
@Id
private String id;
- @Column
+ @Column(unique = true)
private String name;
- @Column
+ @Column(length = 4000)
private String description;
@Column
@@ -55,6 +55,7 @@ public class DossierTemplateEntity {
private boolean deleted;
@ElementCollection
+ @Enumerated(EnumType.STRING)
private Set downloadFileTypes = new HashSet<>();
@JsonIgnore
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java
index 5b2b318f4..5d9113454 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java
@@ -34,6 +34,7 @@ public class FileAttributeConfigEntity {
@Column
private String placeholder;
@Column
+ @Enumerated(EnumType.STRING)
private FileAttributeType type = FileAttributeType.TEXT;
@ManyToOne
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeEntity.java
index bc09712d3..51053ad64 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeEntity.java
@@ -14,7 +14,7 @@ public class FileAttributeEntity {
@EmbeddedId
private FileAttributeEntityId fileAttributeId;
- @Column
+ @Column(length = 4000)
private String value;
@JsonIgnore
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java
index 653613fe5..4507935c9 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java
@@ -1,7 +1,9 @@
package com.iqser.red.service.persistence.management.v1.processor.entity.dossier;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
+
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -29,10 +31,12 @@ public class FileEntity {
private String filename;
@Column
- private FileStatus status;
+ @Enumerated(EnumType.STRING)
+ private ProcessingStatus processingStatus;
@Column
- private FileStatus lastSuccessfulStatus;
+ @Enumerated(EnumType.STRING)
+ private WorkflowStatus workflowStatus;
@Column
private int numberOfPages;
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java
index 96a64374d..f94e97d19 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java
@@ -31,6 +31,7 @@ public class DownloadStatusEntity {
@Column
private String mimeType;
@Column
+ @Enumerated(EnumType.STRING)
private DownloadStatusValue status;
@Column
private OffsetDateTime creationDate;
@@ -46,6 +47,7 @@ public class DownloadStatusEntity {
private List files = new ArrayList<>();
@ElementCollection
+ @Enumerated(EnumType.STRING)
private List downloadFileTypes = new ArrayList<>();
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationEntity.java
index 386a15df1..ae25a69aa 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationEntity.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationEntity.java
@@ -1,6 +1,6 @@
package com.iqser.red.service.persistence.management.v1.processor.entity.notification;
-import com.iqser.red.service.persistence.service.v1.api.utils.JSONConverter;
+import com.iqser.red.service.persistence.management.v1.processor.utils.JSONConverter;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationPreferencesEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationPreferencesEntity.java
new file mode 100644
index 000000000..b0f48b6cd
--- /dev/null
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationPreferencesEntity.java
@@ -0,0 +1,38 @@
+package com.iqser.red.service.persistence.management.v1.processor.entity.notification;
+
+import com.iqser.red.service.persistence.service.v1.api.model.notification.EmailNotificationType;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Table(name = "notification_preference")
+public class NotificationPreferencesEntity {
+
+ @Id
+ private String userId;
+
+ @Column
+ private boolean inAppNotificationsEnabled;
+
+ @Column
+ private boolean emailNotificationsEnabled;
+
+ @Column
+ private EmailNotificationType emailNotificationType;
+
+ @ElementCollection
+ private List emailNotifications = new ArrayList<>();
+
+ @ElementCollection
+ private List inAppNotifications = new ArrayList<>();
+}
\ No newline at end of file
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ColorsService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ColorsService.java
index 17db7ff1e..be181efb4 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ColorsService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ColorsService.java
@@ -1,7 +1,6 @@
package com.iqser.red.service.persistence.management.v1.processor.service;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity;
-import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ColorsRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -15,12 +14,25 @@ public class ColorsService {
private final ColorsRepository colorsRepository;
public void deleteColors(String dossierTemplateId) {
-
colorsRepository.deleteById(dossierTemplateId);
}
public ColorsEntity getColors(String dossierTemplateId) {
- return colorsRepository.findById(dossierTemplateId).orElseThrow(() -> new NotFoundException("Colors Configuration not found"));
+ return colorsRepository.findById(dossierTemplateId).orElseGet(() -> {
+ var entity = new ColorsEntity();
+ entity.setDossierTemplateId(dossierTemplateId);
+ entity.setAnalysisColor("#aaaaaa");
+ entity.setDefaultColor("#aaaaaa");
+ entity.setDictionaryRequestColor("#aaaaaa");
+ entity.setPreviewColor("#aaaaaa");
+ entity.setNotRedacted("#aaaaaa");
+ entity.setManualRedactionColor("#aaaaaa");
+ entity.setRequestAdd("#aaaaaa");
+ entity.setRequestRemove("#aaaaaa");
+ entity.setUpdatedColor("#aaaaaa");
+ return colorsRepository.save(entity);
+ }
+ );
}
public ColorsEntity saveColors(ColorsEntity colors) {
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureService.java
index 0263da393..5c4f17ef5 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureService.java
@@ -56,14 +56,15 @@ public class DigitalSignatureService {
@Transactional
public void updateDigitalSignature(DigitalSignatureEntity digitalSignatureModel) {
- digitalSignatureRepository.findById(DigitalSignatureEntity.ID).ifPresentOrElse(digitalSignature -> {
- digitalSignature.setCertificateName(digitalSignatureModel.getCertificateName());
- digitalSignature.setLocation(digitalSignatureModel.getLocation());
- digitalSignature.setContactInfo(digitalSignatureModel.getContactInfo());
- digitalSignature.setReason(digitalSignatureModel.getReason());
- }, () -> {
+ int updateCount = digitalSignatureRepository.updateDigitalSignature(DigitalSignatureEntity.ID,
+ digitalSignatureModel.getReason(),
+ digitalSignatureModel.getLocation(),
+ digitalSignatureModel.getContactInfo(),
+ digitalSignatureModel.getCertificateName());
+ if (updateCount == 0) {
throw new NotFoundException("Digital Signature Not found");
- });
+ }
+
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EncryptionDecryptionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EncryptionDecryptionService.java
index be071f77f..88913d646 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EncryptionDecryptionService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EncryptionDecryptionService.java
@@ -1,61 +1,107 @@
package com.iqser.red.service.persistence.management.v1.processor.service;
import lombok.SneakyThrows;
+
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.GCMParameterSpec;
+import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
+
+import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
+import java.security.SecureRandom;
+import java.security.spec.KeySpec;
import java.util.Arrays;
import java.util.Base64;
@Service
public class EncryptionDecryptionService {
- @Value("${configuration-service.crypto.key:redaction}")
+ @Value("${persistence-service.crypto.key:redaction}")
private String key;
- private SecretKeySpec secretKey;
+
+ private SecretKey secretKey;
+ private byte[] iv;
+
@SneakyThrows
@PostConstruct
protected void postConstruct() {
- byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
- var sha = MessageDigest.getInstance("SHA-1");
- keyBytes = sha.digest(keyBytes);
- keyBytes = Arrays.copyOf(keyBytes, 16);
- secretKey = new SecretKeySpec(keyBytes, "AES");
+
+ SecureRandom secureRandom = new SecureRandom();
+ iv = new byte[12];
+ secureRandom.nextBytes(iv);
+ secretKey = generateSecretKey(key, iv);
}
+
@SneakyThrows
public String encrypt(String strToEncrypt) {
- Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
- cipher.init(Cipher.ENCRYPT_MODE, secretKey);
- return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)));
+
+ return Base64.getEncoder().encodeToString(encrypt(strToEncrypt.getBytes()));
}
- @SneakyThrows
- public byte[] encrypt(byte[] bytes) {
- Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
- cipher.init(Cipher.ENCRYPT_MODE, secretKey);
- return cipher.doFinal(bytes);
- }
-
- @SneakyThrows
- public byte[] decrypt(byte[] bytes) {
- Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
- cipher.init(Cipher.ENCRYPT_MODE, secretKey);
- return cipher.doFinal(bytes);
- }
@SneakyThrows
public String decrypt(String strToDecrypt) {
- Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
- cipher.init(Cipher.DECRYPT_MODE, secretKey);
- return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)), StandardCharsets.UTF_8);
+
+ byte[] bytes = Base64.getDecoder().decode(strToDecrypt);
+ return new String(decrypt(bytes), StandardCharsets.UTF_8);
}
+ @SneakyThrows
+ public byte[] encrypt(byte[] data) {
+
+ Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
+ GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv);
+ cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec);
+ byte[] encryptedData = cipher.doFinal(data);
+ ByteBuffer byteBuffer = ByteBuffer.allocate(4 + iv.length + encryptedData.length);
+ byteBuffer.putInt(iv.length);
+ byteBuffer.put(iv);
+ byteBuffer.put(encryptedData);
+ return byteBuffer.array();
+ }
+
+
+ @SneakyThrows
+ public byte[] decrypt(byte[] encryptedData) {
+
+ ByteBuffer byteBuffer = ByteBuffer.wrap(encryptedData);
+ int noonceSize = byteBuffer.getInt();
+ if (noonceSize < 12 || noonceSize >= 16) {
+ throw new IllegalArgumentException("Nonce size is incorrect. Make sure that the incoming data is an AES encrypted file.");
+ }
+ byte[] iv = new byte[noonceSize];
+ byteBuffer.get(iv);
+
+ SecretKey secretKey = generateSecretKey(key, iv);
+
+ byte[] cipherBytes = new byte[byteBuffer.remaining()];
+ byteBuffer.get(cipherBytes);
+
+ Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
+ GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv);
+ cipher.init(Cipher.DECRYPT_MODE, secretKey, parameterSpec);
+ return cipher.doFinal(cipherBytes);
+ }
+
+
+ @SneakyThrows
+ public SecretKey generateSecretKey(String password, byte[] iv) {
+
+ KeySpec spec = new PBEKeySpec(password.toCharArray(), iv, 65536, 128); // AES-128
+ SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
+ byte[] key = secretKeyFactory.generateSecret(spec).getEncoded();
+ return new SecretKeySpec(key, "AES");
+ }
+
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AddRedactionPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AddRedactionPersistenceService.java
index 5b45bcb0f..c2ec6dbde 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AddRedactionPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AddRedactionPersistenceService.java
@@ -14,6 +14,7 @@ import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.time.OffsetDateTime;
+import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -32,7 +33,7 @@ public class AddRedactionPersistenceService {
ManualRedactionEntryEntity manualRedactionEntry = new ManualRedactionEntryEntity();
manualRedactionEntry.setId(new AnnotationEntityId(annotationId, fileId));
BeanUtils.copyProperties(addRedactionRequest, manualRedactionEntry);
- manualRedactionEntry.setRequestDate(OffsetDateTime.now());
+ manualRedactionEntry.setRequestDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
manualRedactionEntry.setPositions(convert(addRedactionRequest.getPositions()));
manualRedactionEntry.setTypeId(addRedactionRequest.getTypeId());
@@ -76,36 +77,30 @@ public class AddRedactionPersistenceService {
@Transactional
public void softDelete(String fileId, String annotationId, OffsetDateTime softDeleteTime) {
- manualRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> mre.setSoftDeletedTime(softDeleteTime));
+ manualRedactionRepository.updateSoftDelete(new AnnotationEntityId(annotationId, fileId), softDeleteTime);
}
@Transactional
public void undelete(String fileId, String annotationId) {
- manualRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> mre.setSoftDeletedTime(null));
+ manualRedactionRepository.updateSoftDelete(new AnnotationEntityId(annotationId, fileId), null);
}
@Transactional
public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus) {
- manualRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> {
- mre.setProcessedDate(OffsetDateTime.now());
- mre.setStatus(annotationStatus);
- });
-
-
+ manualRedactionRepository.updateStatus(new AnnotationEntityId(annotationId, fileId),
+ OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
+ annotationStatus);
}
@Transactional
public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus, boolean isAddOrRemoveFromDictionary) {
- manualRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> {
- mre.setProcessedDate(OffsetDateTime.now());
- mre.setStatus(annotationStatus);
- mre.setAddToDictionary(isAddOrRemoveFromDictionary);
- });
-
+ manualRedactionRepository.updateStatus(new AnnotationEntityId(annotationId, fileId),
+ OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
+ annotationStatus,
+ isAddOrRemoveFromDictionary);
}
-
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java
index dc6422875..ea70dca5f 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java
@@ -8,23 +8,22 @@ import com.iqser.red.service.persistence.service.v1.api.model.audit.CategoryMode
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.beans.BeanUtils;
-import org.springframework.data.domain.Example;
-import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
+import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import java.time.OffsetDateTime;
-import java.util.HashMap;
+import java.time.temporal.ChronoUnit;
import java.util.List;
-import java.util.Map;
+
+import static com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository.*;
@Service
@RequiredArgsConstructor
public class AuditPersistenceService {
- private final static String AUDIT_LOG_CATEGORY = "AUDIT_LOG";
private final AuditRepository auditRepository;
@@ -34,7 +33,7 @@ public class AuditPersistenceService {
var auditModel = new AuditEntity();
BeanUtils.copyProperties(auditRequest, auditModel);
- auditModel.setRecordDate(OffsetDateTime.now());
+ auditModel.setRecordDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
auditRepository.save(auditModel);
@@ -47,40 +46,29 @@ public class AuditPersistenceService {
public Page search(AuditSearchRequest auditRequest) {
+ if (auditRequest.getPageSize() == 0) {
+ auditRequest.setPageSize(50);
+ }
- AuditEntity example = new AuditEntity();
- example.setCategory(auditRequest.getCategory());
- example.setUserId(auditRequest.getUserId());
- example.setObjectId(auditRequest.getObjectId());
+ if (auditRequest.getFrom() == null) {
+ auditRequest.setFrom(OffsetDateTime.now().minusYears(30).truncatedTo(ChronoUnit.MILLIS));
+ }
+ if (auditRequest.getTo() == null) {
+ auditRequest.setTo(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ }
- var result = auditRepository.findAll(Example.of(example, ExampleMatcher.matchingAny().withIgnorePaths("recordId")),
- PageRequest.of(auditRequest.getPage(), auditRequest.getPageSize()));
-
- // after search, insert a record logging the search
- this.insertRecord(AuditRequest.builder()
- .category(AUDIT_LOG_CATEGORY)
- .message("Audit Log Accessed")
- .userId(auditRequest.getRequestingUserId())
- .details(searchRequestToMap(auditRequest))
- .build());
- return result;
- }
-
-
- private Map searchRequestToMap(AuditSearchRequest auditSearchRequest) {
-
- var map = new HashMap();
-
- map.put("userId", auditSearchRequest.getUserId());
- map.put("category", auditSearchRequest.getCategory());
- map.put("objectId", auditSearchRequest.getObjectId());
- map.put("from", auditSearchRequest.getFrom());
- map.put("to", auditSearchRequest.getTo());
- map.put("page", auditSearchRequest.getPage());
- map.put("pageSize", auditSearchRequest.getPageSize());
-
- return map;
+ var spec = Specification.where(dateBetween(auditRequest.getFrom(), auditRequest.getTo()));
+ if (auditRequest.getCategory() != null) {
+ spec = spec.and(categoryMatches(auditRequest.getCategory()));
+ }
+ if (auditRequest.getUserId() != null) {
+ spec = spec.and(userMatches(auditRequest.getUserId()));
+ }
+ if (auditRequest.getObjectId() != null) {
+ spec = spec.and(objectIdMatches(auditRequest.getObjectId()));
+ }
+ return auditRepository.findAll(spec, PageRequest.of(auditRequest.getPage(), auditRequest.getPageSize()));
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/CommentPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/CommentPersistenceService.java
index 1a9e92cc7..20f5081af 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/CommentPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/CommentPersistenceService.java
@@ -55,16 +55,12 @@ public class CommentPersistenceService {
@Transactional
public void softDelete(long commentId, OffsetDateTime softDeletedTime) {
- commentRepository.findById(commentId).ifPresent(mre -> {
- mre.setSoftDeletedTime(softDeletedTime);
- });
+ commentRepository.updateSoftDelete(commentId, softDeletedTime);
}
@Transactional
public void undelete(long commentId) {
- commentRepository.findById(commentId).ifPresent(mre -> {
- mre.setSoftDeletedTime(null);
- });
+ commentRepository.updateSoftDelete(commentId, null);
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java
index 0d5862834..212a9261b 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java
@@ -7,7 +7,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository;
import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@@ -36,7 +35,7 @@ public class DictionaryPersistenceService {
checkRankAlreadyExists(type, dossierTemplateId, rank, dossierId);
TypeEntity t = new TypeEntity();
- t.setId(toTypeId(type,dossierTemplateId,dossierId));
+ t.setId(toTypeId(type, dossierTemplateId, dossierId));
t.setType(type);
t.setDossier(dossierId == null ? null : dossierRepository.getOne(dossierId));
t.setDossierTemplate(dossierTemplateRepository.getOne(dossierTemplateId));
@@ -55,7 +54,6 @@ public class DictionaryPersistenceService {
}
-
@Transactional
public void updateType(String typeId, TypeEntity typeValueRequest) {
@@ -84,7 +82,7 @@ public class DictionaryPersistenceService {
public List getAllTypesForDossierTemplate(String dossierTemplateId) {
- return typeRepository.findByDossierTemplateId(dossierTemplateId).stream().filter( d -> d.getDossierId() == null).collect(Collectors.toList());
+ return typeRepository.findByDossierTemplateId(dossierTemplateId).stream().filter(d -> d.getDossierId() == null).collect(Collectors.toList());
}
public List getAllTypesForDossier(String dossierId) {
@@ -118,5 +116,13 @@ public class DictionaryPersistenceService {
typeRepository.updateByIdSetIncrementVersionByOne(typeId);
}
+ public long getVersion(String dossierTemplateId) {
+ return getAllTypesForDossierTemplate(dossierTemplateId).stream().map(TypeEntity::getVersion).reduce(0L, Long::sum);
+ }
+
+ public long getVersionForDossier(String dossierId) {
+ return getAllTypesForDossier(dossierId).stream().map(TypeEntity::getVersion).reduce(0L, Long::sum);
+ }
+
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributePersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributePersistenceService.java
index 6242791fc..bce14765b 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributePersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributePersistenceService.java
@@ -34,7 +34,7 @@ public class DossierAttributePersistenceService {
@Transactional
public void updateDossierAttribute(String dossierId, String dossierAttributeId, String dossierAttributeValue) {
- dossierAttributeRepository.findById(new DossierAttributeEntity.DossierAttributeEntityId(dossierId, dossierAttributeId)).ifPresent(dossierAttribute -> dossierAttribute.setValue(dossierAttributeValue));
+ dossierAttributeRepository.updateDossierAttribute(new DossierAttributeEntity.DossierAttributeEntityId(dossierId, dossierAttributeId), dossierAttributeValue);
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java
index be30ef0b9..42664303f 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java
@@ -14,10 +14,9 @@ import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.time.OffsetDateTime;
+import java.time.temporal.ChronoUnit;
import java.util.List;
-import java.util.Set;
import java.util.UUID;
-import java.util.stream.Collectors;
import static com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException.DOSSIER_NOT_FOUND_MESSAGE;
@@ -30,15 +29,19 @@ public class DossierPersistenceService {
private final DossierTemplateRepository dossierTemplateRepository;
private final ReportTemplateRepository reportTemplateRepository;
+
public DossierEntity insert(CreateOrUpdateDossierRequest createOrUpdateDossierRequest) {
DossierEntity dossier = new DossierEntity();
BeanUtils.copyProperties(createOrUpdateDossierRequest, dossier);
dossier.setId(UUID.randomUUID().toString());
dossier.setStatus(DossierStatus.ACTIVE);
-
+ dossier.setDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ dossier.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossier.setDossierTemplate(dossierTemplateRepository.getOne(createOrUpdateDossierRequest.getDossierTemplateId()));
- dossier.setReportTemplates(reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds()));
+ var reportTemplates = reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds());
+ reportTemplates.forEach(r -> r.getDossiers().add(dossier));
+ dossier.setReportTemplates(reportTemplates);
return dossierRepository.save(dossier);
@@ -52,20 +55,15 @@ public class DossierPersistenceService {
dossierRepository.findById(dossierId).ifPresent(dossier -> {
BeanUtils.copyProperties(createOrUpdateDossierRequest, dossier);
dossier.setDossierTemplate(dossierTemplateRepository.getOne(createOrUpdateDossierRequest.getDossierTemplateId()));
- dossier.setReportTemplates(reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds()));
+ dossier.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ var reportTemplates = reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds());
+ reportTemplates.forEach(r -> r.getDossiers().add(dossier));
+ dossier.setReportTemplates(reportTemplates);
});
}
- @Transactional
- public void updateReportTemplateIds(String dossierId, Set reportTemplateIds) {
- dossierRepository.findById(dossierId).ifPresent(dossier -> {
- dossier.setReportTemplates(reportTemplateRepository.findAllById(reportTemplateIds));
- });
- }
-
-
public DossierEntity getAndValidateDossier(String dossierId) {
// check whether the dossierId exists and is not deleted
var dossier = findByDossierId(dossierId);
@@ -87,41 +85,27 @@ public class DossierPersistenceService {
}
- public List findSoftDeletedDossiers() {
-
- return findAllDossiers().stream().filter(d -> d.getSoftDeletedTime() != null).collect(Collectors.toList());
-
- }
-
-
@Transactional
public void hardDelete(String dossierId) {
- dossierRepository.findById(dossierId).ifPresent(dossier -> {
- dossier.setHardDeletedTime(OffsetDateTime.now());
- dossier.setStatus(DossierStatus.DELETED);
- dossier.setSoftDeletedTime(dossier.getSoftDeletedTime() == null ? OffsetDateTime.now() : dossier.getSoftDeletedTime());
- });
+ dossierRepository.hardDelete(dossierId, DossierStatus.DELETED, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
}
@Transactional
public void undelete(String dossierId) {
- dossierRepository.findById(dossierId).ifPresent(dossier -> {
- if (dossier.getHardDeletedTime() != null) {
- throw new BadRequestException("Cannot undelete a hard-dossier file!");
- }
- dossier.setStatus(DossierStatus.ACTIVE);
- dossier.setSoftDeletedTime(null);
- });
+ int updateCount = dossierRepository.undelete(dossierId, DossierStatus.ACTIVE, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ if (updateCount == 0) {
+ throw new BadRequestException("Cannot undelete a hard-deleted dossier!");
+ }
}
@Transactional
public void markDossierAsDeleted(String dossierId, OffsetDateTime softDeletedTime) {
- dossierRepository.findById(dossierId).ifPresent(dossier -> {
- dossier.setStatus(DossierStatus.DELETED);
- dossier.setSoftDeletedTime(softDeletedTime);
- });
+ dossierRepository.markDossierAsDeleted(dossierId, DossierStatus.DELETED, softDeletedTime, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
}
+ public boolean hasChangesSince(OffsetDateTime since) {
+ return dossierRepository.existsByLastUpdatedIsAfter(since.truncatedTo(ChronoUnit.MILLIS));
+ }
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java
index 9f46b7836..a21bfec6d 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java
@@ -11,6 +11,7 @@ import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.time.OffsetDateTime;
+import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
@@ -30,9 +31,10 @@ public class DossierTemplatePersistenceService {
if (createOrUpdateDossierRequest.getDossierTemplateId() != null) {
Optional dossierTemplate = dossierTemplateRepository.findById(createOrUpdateDossierRequest.getDossierTemplateId());
if (dossierTemplate.isPresent()) {
- dossierTemplate.get().setDateModified(OffsetDateTime.now());
- dossierTemplate.get().setModifiedBy(createOrUpdateDossierRequest.getRequestingUser());
+ // order is important
BeanUtils.copyProperties(createOrUpdateDossierRequest, dossierTemplate.get());
+ dossierTemplate.get().setDateModified(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ dossierTemplate.get().setModifiedBy(createOrUpdateDossierRequest.getRequestingUser());
return dossierTemplate.get();
} else {
throw new NotFoundException(String.format(DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE, createOrUpdateDossierRequest.getDossierTemplateId()));
@@ -40,9 +42,10 @@ public class DossierTemplatePersistenceService {
} else {
DossierTemplateEntity dossierTemplate = new DossierTemplateEntity();
dossierTemplate.setId(UUID.randomUUID().toString());
- dossierTemplate.setDateAdded(OffsetDateTime.now());
- dossierTemplate.setCreatedBy(createOrUpdateDossierRequest.getRequestingUser());
+ // order is important
BeanUtils.copyProperties(createOrUpdateDossierRequest, dossierTemplate);
+ dossierTemplate.setDateAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ dossierTemplate.setCreatedBy(createOrUpdateDossierRequest.getRequestingUser());
return dossierTemplateRepository.save(dossierTemplate);
}
@@ -64,7 +67,7 @@ public class DossierTemplatePersistenceService {
if (dossierTemplate.getDossiers().isEmpty()) {
dossierTemplate.setModifiedBy(deletingUserId);
- dossierTemplate.setDateModified(OffsetDateTime.now());
+ dossierTemplate.setDateModified(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossierTemplate.setDeleted(true);
} else {
throw new BadRequestException("Cannot delete dossier template with active dossiers!");
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java
index e3d4fe793..43aa5b59f 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java
@@ -5,13 +5,17 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.download
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DownloadStatusRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType;
import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.time.OffsetDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
@Service
@RequiredArgsConstructor
@@ -21,7 +25,7 @@ public class DownloadStatusPersistenceService {
private final FileRepository fileRepository;
public void createStatus(String userId, String storageId, DossierEntity dossier, String filename, String mimeType,
- List fileIds) {
+ List fileIds, Set downloadFileTypes) {
DownloadStatusEntity downloadStatus = new DownloadStatusEntity();
@@ -30,8 +34,9 @@ public class DownloadStatusPersistenceService {
downloadStatus.setFilename(filename);
downloadStatus.setMimeType(mimeType);
downloadStatus.setDossier(dossier);
- downloadStatus.setCreationDate(OffsetDateTime.now());
+ downloadStatus.setCreationDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
downloadStatus.setFiles(fileRepository.findAllById(fileIds));
+ downloadStatus.setDownloadFileTypes(new ArrayList<>(downloadFileTypes));
downloadStatusRepository.save(downloadStatus);
}
@@ -40,26 +45,19 @@ public class DownloadStatusPersistenceService {
@Transactional
public void updateStatus(String storageId, DownloadStatusValue status) {
- downloadStatusRepository.findById(storageId).ifPresent(downloadStatus -> downloadStatus.setStatus(status));
+ downloadStatusRepository.updateStatus(storageId, status);
}
@Transactional
public void updateStatus(String storageId, DownloadStatusValue status, long fileSize) {
- downloadStatusRepository.findById(storageId).ifPresent(downloadStatus -> {
- downloadStatus.setStatus(status);
- downloadStatus.setFileSize(fileSize);
- });
+ downloadStatusRepository.updateStatus(storageId, status, fileSize);
}
@Transactional
public void updateLastDownload(String storageId) {
-
- downloadStatusRepository.findById(storageId).ifPresent(downloadStatus -> {
- downloadStatus.setLastDownload(OffsetDateTime.now());
- });
-
+ downloadStatusRepository.updateLastDownload(storageId, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
}
@@ -83,7 +81,6 @@ public class DownloadStatusPersistenceService {
}
-
public List getStatus() {
return downloadStatusRepository.findAll();
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java
index 3a7d65508..a6ca85708 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java
@@ -50,7 +50,6 @@ public class EntryPersistenceService {
public List getEntries(String typeId) {
-
return entryRepository.findByTypeId(typeId);
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java
index b845da142..f0f961bb1 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java
@@ -1,20 +1,26 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence;
+import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributesRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.time.OffsetDateTime;
+import java.time.temporal.ChronoUnit;
import java.util.List;
+import java.util.Map;
import java.util.Set;
-
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@@ -22,6 +28,9 @@ public class FileStatusPersistenceService {
private final FileRepository fileRepository;
private final DossierRepository dossierRepository;
+ private final FileAttributesRepository fileAttributesRepository;
+ private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService;
+ private final DossierPersistenceService dossierService;
public void createStatus(String dossierId, String fileId, String filename, String uploader) {
@@ -30,35 +39,37 @@ public class FileStatusPersistenceService {
file.setId(fileId);
file.setDossier(dossierRepository.getOne(dossierId));
file.setFilename(filename);
- file.setStatus(FileStatus.UNPROCESSED);
+ file.setProcessingStatus(ProcessingStatus.UNPROCESSED);
+ file.setWorkflowStatus(WorkflowStatus.UNASSIGNED);
file.setNumberOfPages(0);
- file.setAdded(OffsetDateTime.now());
+ file.setAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setUploader(uploader);
- file.setLastUploaded(OffsetDateTime.now());
-
+ file.setLastUploaded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
fileRepository.save(file);
}
@Transactional
- public void updateStatusSuccessful(String fileId, int numberOfPages, FileStatus status,
- boolean hasUpdates, long dictionaryVersion, long rulesVersion,
- long legalBasisVersion, long duration, long dossierDictionaryVersion,
- int analysisVersion) {
+ public void updateWorkflowStatus(String fileId, int numberOfPages, long dictionaryVersion, long rulesVersion,
+ long legalBasisVersion, long duration, long dossierDictionaryVersion,
+ int analysisVersion) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
+ if (isFileDeleted(file)) {
+ return;
+ }
file.setNumberOfPages(numberOfPages);
- file.setStatus(status);
- file.setLastSuccessfulStatus(status);
- file.setHasUpdates(hasUpdates);
+ file.setProcessingStatus(ProcessingStatus.PROCESSED);
file.setDictionaryVersion(dictionaryVersion);
file.setRulesVersion(rulesVersion);
file.setLegalBasisVersion(legalBasisVersion);
file.setAnalysisDuration(duration);
file.setDossierDictionaryVersion(dossierDictionaryVersion);
file.setAnalysisVersion(analysisVersion);
- file.setLastUpdated(OffsetDateTime.now());
- file.setLastProcessed(OffsetDateTime.now());
+ file.setNumberOfAnalyses(file.getNumberOfAnalyses() + 1);
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ file.setLastProcessed(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
@@ -67,79 +78,73 @@ public class FileStatusPersistenceService {
@Transactional
- public void updateFlags(String fileId,boolean hasRedactions,boolean hasHints,boolean hasImages,boolean hasSuggestions,boolean hasComments){
- fileRepository.findById(fileId).ifPresentOrElse((file) -> {
- file.setHasRedactions(hasRedactions);
- file.setHasHints(hasHints);
- file.setHasImages(hasImages);
- file.setHasSuggestions(hasSuggestions);
- file.setHasAnnotationComments(hasComments);
- }, () -> {
- throw new NotFoundException("Unknown file=" + fileId);
- });
- }
+ public void updateFlags(String fileId, boolean hasRedactions, boolean hasHints, boolean hasImages,
+ boolean hasSuggestions, boolean hasComments, boolean hasUpdates) {
-
- @Transactional
- public void updateStatusSuccessful(String fileId, FileStatus status, boolean approval) {
-
- fileRepository.findById(fileId).ifPresentOrElse((file) -> {
- file.setStatus(status);
- file.setLastSuccessfulStatus(status);
- file.setLastUpdated(OffsetDateTime.now());
- file.setApprovalDate(approval ? OffsetDateTime.now() : null);
- }, () -> {
- throw new NotFoundException("Unknown file=" + fileId);
- });
-
-
- }
-
-
- @Transactional
- public void updateStatus(String fileId, FileStatus status, String uploader) {
-
- if (status.equals(FileStatus.UNASSIGNED) || status.equals(FileStatus.UNPROCESSED)) {
- throw new IllegalArgumentException("please use specific methods for these calls!");
+ if (isFileDeleted(fileId)) {
+ return;
}
-
- fileRepository.findById(fileId).ifPresentOrElse((file) -> {
- file.setStatus(status);
- file.setUploader(uploader);
- file.setLastUploaded(OffsetDateTime.now());
- file.setLastUpdated(OffsetDateTime.now());
- }, () -> {
- throw new NotFoundException("Unknown file=" + fileId);
- });
-
+ fileRepository.updateFlags(fileId, OffsetDateTime.now(), hasRedactions, hasHints, hasImages, hasSuggestions, hasComments, hasUpdates);
}
+
@Transactional
- public void updateStatus(String fileId, FileStatus status) {
+ public void updateWorkflowStatus(String fileId, WorkflowStatus workflowStatus, boolean approval) {
+
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
- file.setStatus(status);
- file.setLastUpdated(OffsetDateTime.now());
+ if (isFileDeleted(file)) {
+ return;
+ }
+ file.setWorkflowStatus(workflowStatus);
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ file.setApprovalDate(approval ? OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS) : null);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
+
}
+
@Transactional
- public void setUpdateStatusIndexingSuccessful(String fileId, FileStatus status) {
+ public void updateProcessingStatus(String fileId, ProcessingStatus processingStatus) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
- file.setStatus(status);
- file.setLastIndexed(OffsetDateTime.now());
+ if (isFileDeleted(file)) {
+ return;
+ }
+ file.setProcessingStatus(processingStatus);
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ }, () -> {
+ throw new NotFoundException("Unknown file=" + fileId);
+ });
+ }
+
+
+ @Transactional
+ public void setUpdateStatusIndexingSuccessful(String fileId) {
+
+ fileRepository.findById(fileId).ifPresentOrElse((file) -> {
+ if (isFileDeleted(file)) {
+ return;
+ }
+ file.setProcessingStatus(ProcessingStatus.PROCESSED);
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ file.setLastIndexed(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
}
+
@Transactional
public void updateLastOCRTime(String fileId, OffsetDateTime time) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
+ if (isFileDeleted(file)) {
+ return;
+ }
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastOCRTime(time);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
@@ -147,20 +152,30 @@ public class FileStatusPersistenceService {
}
+
@Transactional
public void updateHasComments(String fileId, boolean hasComments) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
+ if (isFileDeleted(file)) {
+ return;
+ }
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setHasAnnotationComments(hasComments);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
}
+
@Transactional
public void updateLastManualRedaction(String fileId, OffsetDateTime date) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
+ if (isFileDeleted(file)) {
+ return;
+ }
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastManualRedaction(date);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
@@ -168,10 +183,16 @@ public class FileStatusPersistenceService {
}
+
@Transactional
- public void setUpdateLastManualRedactionAndHasSuggestions(String fileId, OffsetDateTime date, boolean hasSuggestions) {
+ public void setUpdateLastManualRedactionAndHasSuggestions(String fileId, OffsetDateTime date,
+ boolean hasSuggestions) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
+ if (isFileDeleted(file)) {
+ return;
+ }
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastManualRedaction(date);
file.setHasSuggestions(hasSuggestions);
}, () -> {
@@ -180,28 +201,41 @@ public class FileStatusPersistenceService {
}
- @Transactional
- public void setFileAttributes(String fileId, List fileAttributes) {
+
+ @Transactional(value = Transactional.TxType.REQUIRES_NEW)
+ public void setFileAttributes(String dossierId, String fileId, Map fileAttributes) {
+
+ fileAttributesRepository.deleteByFileId(fileId);
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
- file.setLastFileAttributeChange(OffsetDateTime.now());
- file.setFileAttributes(fileAttributes);
+ if (isFileDeleted(file)) {
+ return;
+ }
+ var fileAttributeEntities = convertFileAttributes(dossierId, file, fileAttributes);
+ file.setLastFileAttributeChange(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ file.setFileAttributes(fileAttributeEntities);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
+
}
+
@Transactional
public void setExcludedPages(String fileId, Set excludedPages) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
- file.setLastManualRedaction(OffsetDateTime.now());
+ if (isFileDeleted(file)) {
+ return;
+ }
+ file.setLastManualRedaction(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setExcludedPages(excludedPages);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
-
}
@@ -213,71 +247,94 @@ public class FileStatusPersistenceService {
public List getStatusesForDossier(String dossierId) {
+
return fileRepository.findByDossierId(dossierId);
}
+
public List getAllStatuses() {
+
return fileRepository.findAll();
}
+
@Transactional
public void softDelete(String fileId, OffsetDateTime softDeletedTime) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
- file.setStatus(FileStatus.DELETED);
+ file.setProcessingStatus(ProcessingStatus.DELETED);
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setDeleted(softDeletedTime);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
-
}
+
@Transactional
public void hardDelete(String fileId) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
- file.setStatus(FileStatus.DELETED);
- file.setDeleted(file.getDeleted() == null ? OffsetDateTime.now() : file.getDeleted());
- file.setHardDeletedTime(OffsetDateTime.now());
+ file.setProcessingStatus(ProcessingStatus.DELETED);
+ file.setDeleted(file.getDeleted() == null ? OffsetDateTime.now()
+ .truncatedTo(ChronoUnit.MILLIS) : file.getDeleted());
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ file.setDeleted(file.getDeleted() == null ? OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS) : file.getDeleted());
+ file.setHardDeletedTime(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+
+ fileAttributesRepository.deleteByFileId(fileId);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
}
+
@Transactional
- public void undelete(String fileId, FileStatus statusBefore) {
+ public void undelete(String fileId) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
if (file.getHardDeletedTime() != null) {
- throw new BadRequestException("Cannot undelete a hard-dossier file!");
+ throw new BadRequestException("Cannot undelete a hard-deleted dossier file!");
}
- file.setStatus(statusBefore != null ? statusBefore : FileStatus.UNASSIGNED);
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ file.setProcessingStatus(ProcessingStatus.PROCESSED);
file.setDeleted(null);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
}
+
@Transactional
public void setCurrentReviewer(String fileId, String currentReviewer, String lastReviewer) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
+ if (isFileDeleted(file)) {
+ return;
+ }
file.setCurrentReviewer(currentReviewer);
file.setLastReviewer(lastReviewer);
- file.setStatus(FileStatus.UNDER_REVIEW);
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ file.setWorkflowStatus(currentReviewer == null ? WorkflowStatus.UNASSIGNED : WorkflowStatus.UNDER_REVIEW);
+ file.setWorkflowStatus(currentReviewer == null ? WorkflowStatus.UNASSIGNED : WorkflowStatus.UNDER_REVIEW);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
}
+
@Transactional
public void toggleExclusion(String fileId, boolean excluded) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
+ if (isFileDeleted(file)) {
+ return;
+ }
file.setExcluded(excluded);
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastProcessed(null);
file.setLastReviewer(null);
file.setCurrentReviewer(null);
@@ -297,15 +354,17 @@ public class FileStatusPersistenceService {
}
+
@Transactional
public void overwriteFile(String fileId, String uploader, String filename) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
file.setFilename(filename);
file.setUploader(uploader);
- file.setStatus(FileStatus.FULLREPROCESS);
- file.setLastUploaded(OffsetDateTime.now());
- file.setLastUpdated(OffsetDateTime.now());
+ file.setProcessingStatus(ProcessingStatus.FULLREPROCESS);
+ file.setWorkflowStatus(WorkflowStatus.UNASSIGNED);
+ file.setLastUploaded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastOCRTime(null);
file.setExcluded(false);
file.setLastProcessed(null);
@@ -321,12 +380,56 @@ public class FileStatusPersistenceService {
file.setHasRedactions(false);
file.setHasSuggestions(false);
file.setHasUpdates(false);
+ file.setDeleted(null);
+ file.setHardDeletedTime(null);
+ }, () -> {
+ throw new NotFoundException("Unknown file=" + fileId);
+ });
+ }
+
+
+ private List convertFileAttributes(String dossierId, FileEntity file,
+ Map fileAttributesMap) {
+
+ var dossier = dossierService.getAndValidateDossier(dossierId);
+ List configuration = fileAttributeConfigPersistenceService.getFileAttributes(dossier.getDossierTemplateId());
+
+ return fileAttributesMap.entrySet().stream().map(entry -> {
+ var fa = new FileAttributeEntity();
+ fa.setFileAttributeId(new FileAttributeEntity.FileAttributeEntityId());
+ fa.setFile(file);
+ fa.setFileAttributeConfig(configuration.stream()
+ .filter(c -> c.getId().equals(entry.getKey()))
+ .findAny()
+ .orElseThrow(() -> new BadRequestException("Invalid File Attribute Id")));
+ fa.setValue(entry.getValue());
+ return fa;
+ }).collect(Collectors.toList());
+ }
+
+
+ private boolean isFileDeleted(FileEntity file) {
+
+ if (file == null || file.getDeleted() != null || file.getHardDeletedTime() != null || ProcessingStatus.DELETED.equals(file.getProcessingStatus())) {
+ return true;
+ }
+ return false;
+ }
+
+
+ private boolean isFileDeleted(String fileId) {
+
+ AtomicBoolean isFileDeleted = new AtomicBoolean(false);
+ fileRepository.findById(fileId).ifPresentOrElse((file) -> {
+ isFileDeleted.set(isFileDeleted(file));
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
-
+ return isFileDeleted.get();
}
-
+ public boolean hasChangesSince(String dossierId, OffsetDateTime since) {
+ return fileRepository.existsByDossierIdAndLastUpdatedIsAfter(dossierId, since);
+ }
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ForceRedactionPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ForceRedactionPersistenceService.java
index 58b00b2b5..2fbfb903b 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ForceRedactionPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ForceRedactionPersistenceService.java
@@ -36,10 +36,8 @@ public class ForceRedactionPersistenceService {
@Transactional
public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus) {
- forceRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> {
- mre.setProcessedDate(OffsetDateTime.now());
- mre.setStatus(annotationStatus);
- });
+ forceRedactionRepository.updateStatus(new AnnotationEntityId(annotationId, fileId), annotationStatus,
+ OffsetDateTime.now());
}
@@ -50,12 +48,12 @@ public class ForceRedactionPersistenceService {
@Transactional
public void softDelete(String fileId, String annotationId, OffsetDateTime softDeleteTime) {
- forceRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> mre.setSoftDeletedTime(softDeleteTime));
+ forceRedactionRepository.updateSoftDelete(new AnnotationEntityId(annotationId, fileId), softDeleteTime);
}
@Transactional
public void undelete(String fileId, String annotationId) {
- forceRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> mre.setSoftDeletedTime(null));
+ forceRedactionRepository.updateSoftDelete(new AnnotationEntityId(annotationId, fileId), null);
}
public ManualForceRedactionEntity findForceRedaction(String fileId, String annotationId) {
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ImageRecategorizationPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ImageRecategorizationPersistenceService.java
index c945c3cba..88b6af662 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ImageRecategorizationPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ImageRecategorizationPersistenceService.java
@@ -12,7 +12,7 @@ import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.time.OffsetDateTime;
-import java.util.Set;
+import java.util.List;
import java.util.stream.Collectors;
@Service
@@ -35,11 +35,8 @@ public class ImageRecategorizationPersistenceService {
@Transactional
public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus) {
- imageRecategorizationRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> {
- mre.setProcessedDate(OffsetDateTime.now());
- mre.setStatus(annotationStatus);
- });
-
+ imageRecategorizationRepository.updateStatus(new AnnotationEntityId(annotationId, fileId), annotationStatus,
+ OffsetDateTime.now());
}
@Transactional
@@ -50,12 +47,12 @@ public class ImageRecategorizationPersistenceService {
@Transactional
public void softDelete(String fileId, String annotationId, OffsetDateTime softDeleteTime) {
- imageRecategorizationRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> mre.setSoftDeletedTime(softDeleteTime));
+ imageRecategorizationRepository.updateSoftDelete(new AnnotationEntityId(annotationId, fileId), softDeleteTime);
}
@Transactional
public void undelete(String fileId, String annotationId) {
- imageRecategorizationRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> mre.setSoftDeletedTime(null));
+ imageRecategorizationRepository.updateSoftDelete(new AnnotationEntityId(annotationId, fileId), null);
}
public ManualImageRecategorizationEntity findRecategorization(String fileId, String annotationId) {
@@ -67,9 +64,9 @@ public class ImageRecategorizationPersistenceService {
}
- public Set findRecategorizations(String fileId, boolean includeDeletions) {
+ public List findRecategorizations(String fileId, boolean includeDeletions) {
- return imageRecategorizationRepository.findByIdFileId(fileId).stream().filter(mre -> includeDeletions || mre.getSoftDeletedTime() == null).collect(Collectors.toSet());
+ return imageRecategorizationRepository.findByIdFileId(fileId).stream().filter(mre -> includeDeletions || mre.getSoftDeletedTime() == null).collect(Collectors.toList());
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisChangePersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisChangePersistenceService.java
index 8618d3bfa..dfab30e70 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisChangePersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisChangePersistenceService.java
@@ -41,24 +41,20 @@ public class LegalBasisChangePersistenceService {
@Transactional
public void softDelete(String fileId, String annotationId, OffsetDateTime softDeleteTime) {
- legalBasisChangeRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> mre.setSoftDeletedTime(softDeleteTime));
+ legalBasisChangeRepository.updateSoftDelete(new AnnotationEntityId(annotationId, fileId), softDeleteTime);
}
@Transactional
public void undelete(String fileId, String annotationId) {
- legalBasisChangeRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> mre.setSoftDeletedTime(null));
+ legalBasisChangeRepository.updateSoftDelete(new AnnotationEntityId(annotationId, fileId), null);
}
@Transactional
public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus) {
- legalBasisChangeRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> {
- mre.setProcessedDate(OffsetDateTime.now());
- mre.setStatus(annotationStatus);
- });
-
-
+ legalBasisChangeRepository.updateStatus(new AnnotationEntityId(annotationId, fileId), annotationStatus,
+ OffsetDateTime.now());
}
public ManualLegalBasisChangeEntity findLegalBasisChange(String fileId, String annotationId) {
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisMappingPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisMappingPersistenceService.java
new file mode 100644
index 000000000..6f9021646
--- /dev/null
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisMappingPersistenceService.java
@@ -0,0 +1,94 @@
+package com.iqser.red.service.persistence.management.v1.processor.service.persistence;
+
+import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.LegalBasisEntity;
+import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.LegalBasisMappingEntity;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.LegalBasisMappingRepository;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
+
+
+@Service
+@RequiredArgsConstructor
+public class LegalBasisMappingPersistenceService {
+
+
+ private final LegalBasisMappingRepository legalBasisMappingRepository;
+
+
+ @Transactional
+ public void deleteLegalBasis(String dossierTemplateId, List legalBasisNames) {
+ var mapping = getLegalBasisMappingOrCreate(dossierTemplateId);
+ var filteredLegalBasis = mapping.getLegalBasis().stream().filter(l -> !legalBasisNames.contains(l.getName())).collect(Collectors.toList());
+
+ mapping.setLegalBasis(filteredLegalBasis);
+ mapping.setVersion(mapping.getVersion() + 1);
+ legalBasisMappingRepository.save(mapping);
+
+ }
+
+ @Transactional
+ public void addOrUpdateLegalBasis(String dossierTemplateId, LegalBasis legalBasis) {
+ var mapping = getLegalBasisMappingOrCreate(dossierTemplateId);
+
+ mapping.getLegalBasis().stream().filter(l -> l.getName().equals(legalBasis.getName())).findAny().ifPresentOrElse(existingBasis -> {
+ existingBasis.setReason(legalBasis.getReason());
+ existingBasis.setDescription(legalBasis.getDescription());
+ }, () -> mapping.getLegalBasis().add(LegalBasisEntity.builder()
+ .name(legalBasis.getName())
+ .description(legalBasis.getDescription())
+ .reason(legalBasis.getReason()).build()));
+
+
+ mapping.setVersion(mapping.getVersion() + 1);
+ legalBasisMappingRepository.save(mapping);
+
+ }
+
+
+ @Transactional
+ public void setLegalBasisMapping(String dossierTemplateId, List legalBasisMapping) {
+
+ legalBasisMappingRepository.findById(dossierTemplateId).ifPresentOrElse((lbm) -> {
+ lbm.setVersion(lbm.getVersion() + 1);
+ lbm.setLegalBasis(convert(legalBasisMapping, LegalBasisEntity.class));
+ legalBasisMappingRepository.save(lbm);
+ }, () -> {
+ var lbm = new LegalBasisMappingEntity();
+ lbm.setDossierTemplateId(dossierTemplateId);
+ lbm.setLegalBasis(convert(legalBasisMapping, LegalBasisEntity.class));
+ lbm.setVersion(1);
+ legalBasisMappingRepository.save(lbm);
+ });
+
+ }
+
+
+ @Transactional
+ public List getLegalBasisMapping(String dossierTemplateId) {
+ return getLegalBasisMappingOrCreate(dossierTemplateId).getLegalBasis();
+ }
+
+ private LegalBasisMappingEntity getLegalBasisMappingOrCreate(String dossierTemplateId) {
+ return legalBasisMappingRepository.findById(dossierTemplateId).orElseGet(() -> {
+ // create on get if not present
+ var lbm = new LegalBasisMappingEntity();
+ lbm.setDossierTemplateId(dossierTemplateId);
+ lbm.setLegalBasis(new ArrayList<>());
+ lbm.setVersion(1);
+ return legalBasisMappingRepository.save(lbm);
+
+ });
+ }
+
+ public long getVersion(String dossierTemplateId) {
+ return legalBasisMappingRepository.findById(dossierTemplateId).map(LegalBasisMappingEntity::getVersion).orElse(0L);
+ }
+}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java
index 0b3267a33..775071347 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java
@@ -11,6 +11,7 @@ import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.time.OffsetDateTime;
+import java.time.temporal.ChronoUnit;
import java.util.List;
@Service
@@ -20,6 +21,9 @@ public class NotificationPersistenceService {
private final NotificationRepository notificationRepository;
+ public boolean hasNewNotificationsSince(String userId, OffsetDateTime since) {
+ return notificationRepository.existsByUserIdAndCreationDateIsAfter(userId, since.truncatedTo(ChronoUnit.MILLIS));
+ }
@SneakyThrows
public void insertNotification(AddNotificationRequest addNotificationRequest) {
@@ -43,16 +47,18 @@ public class NotificationPersistenceService {
@Transactional
public void setReadDate(String userId, long notificationId, OffsetDateTime readDate) {
- notificationRepository.findByIdAndUserId(notificationId, userId).ifPresentOrElse(notification -> notification.setReadDate(readDate), () -> {
+ int countUpdate = notificationRepository.setReadDate(userId, notificationId, readDate);
+ if (countUpdate == 0) {
throw new NotFoundException("Notification not found");
- });
+ }
}
@Transactional
public void softDelete(String userId, long notificationId) {
- notificationRepository.findByIdAndUserId(notificationId, userId).ifPresentOrElse(notification -> notification.setSoftDeleted(OffsetDateTime.now()), () -> {
+ int countUpdate = notificationRepository.softDelete(userId, notificationId, OffsetDateTime.now());
+ if (countUpdate == 0) {
throw new NotFoundException("Notification not found");
- });
+ }
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPreferencesPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPreferencesPersistenceService.java
new file mode 100644
index 000000000..bb2dfd1e8
--- /dev/null
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPreferencesPersistenceService.java
@@ -0,0 +1,42 @@
+package com.iqser.red.service.persistence.management.v1.processor.service.persistence;
+
+import com.iqser.red.service.persistence.management.v1.processor.entity.notification.NotificationPreferencesEntity;
+import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.NotificationPreferencesRepository;
+import com.iqser.red.service.persistence.service.v1.api.model.notification.NotificationPreferences;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+
+@Service
+@RequiredArgsConstructor
+public class NotificationPreferencesPersistenceService {
+
+ private final NotificationPreferencesRepository notificationPreferencesRepository;
+
+ @Transactional
+ public void setNotificationPreference(String userId, NotificationPreferences notification) {
+ notificationPreferencesRepository.findById(userId)
+ .ifPresentOrElse(n -> {
+ BeanUtils.copyProperties(notification, n);
+ }, () -> {
+ NotificationPreferencesEntity notificationPreferencesEntity = new NotificationPreferencesEntity();
+ BeanUtils.copyProperties(notification, notificationPreferencesEntity);
+ notificationPreferencesRepository.save(notificationPreferencesEntity);
+ });
+ }
+
+ @Transactional
+ public void deleteNotificationPreferences(String userId) {
+ notificationPreferencesRepository.deleteById(userId);
+ }
+
+ @Transactional
+ public NotificationPreferencesEntity getNotificationPreferences(String userId) {
+ return notificationPreferencesRepository.findById(userId).orElseThrow(() -> {
+ throw new NotFoundException("Notification preferences not found for userId: " + userId);
+ });
+ }
+}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RemoveRedactionPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RemoveRedactionPersistenceService.java
index 306b683aa..420178622 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RemoveRedactionPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RemoveRedactionPersistenceService.java
@@ -55,33 +55,24 @@ public class RemoveRedactionPersistenceService {
@Transactional
public void softDelete(String fileId, String annotationId, OffsetDateTime softDeleteTime) {
- removeRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> mre.setSoftDeletedTime(softDeleteTime));
+
+ removeRedactionRepository.updateSoftDelete(new AnnotationEntityId(annotationId, fileId), softDeleteTime);
}
@Transactional
public void undelete(String fileId, String annotationId) {
- removeRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> mre.setSoftDeletedTime(null));
+ removeRedactionRepository.updateSoftDelete(new AnnotationEntityId(annotationId, fileId), null);
}
@Transactional
public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus) {
-
- removeRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> {
- mre.setProcessedDate(OffsetDateTime.now());
- mre.setStatus(annotationStatus);
- });
-
+ removeRedactionRepository.updateStatus(new AnnotationEntityId(annotationId, fileId), annotationStatus, OffsetDateTime.now());
}
@Transactional
public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus, boolean isAddOrRemoveFromDictionary) {
-
- removeRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> {
- mre.setProcessedDate(OffsetDateTime.now());
- mre.setStatus(annotationStatus);
- mre.setRemoveFromDictionary(isAddOrRemoveFromDictionary);
- });
-
+ removeRedactionRepository.updateStatusAndRemoveFromDictionary(new AnnotationEntityId(annotationId, fileId),
+ annotationStatus, OffsetDateTime.now(), isAddOrRemoveFromDictionary);
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ResizeRedactionPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ResizeRedactionPersistenceService.java
new file mode 100644
index 000000000..af87375c0
--- /dev/null
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ResizeRedactionPersistenceService.java
@@ -0,0 +1,94 @@
+package com.iqser.red.service.persistence.management.v1.processor.service.persistence;
+
+import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
+
+import java.time.OffsetDateTime;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.transaction.Transactional;
+
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
+import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualResizeRedactionEntity;
+import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.RectangleEntity;
+import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ResizeRedactionRepository;
+import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.annotations.ResizeRedactionRequest;
+
+import lombok.RequiredArgsConstructor;
+
+@Service
+@RequiredArgsConstructor
+public class ResizeRedactionPersistenceService {
+
+ private final ResizeRedactionRepository resizeRedactionRepository;
+
+
+ @Transactional
+ public void insert(String fileId, ResizeRedactionRequest resizeRedactionRequest) {
+
+ ManualResizeRedactionEntity manualResizeRedaction = new ManualResizeRedactionEntity();
+ manualResizeRedaction.setId(new AnnotationEntityId(resizeRedactionRequest.getAnnotationId(), fileId));
+ BeanUtils.copyProperties(resizeRedactionRequest, manualResizeRedaction);
+ manualResizeRedaction.setPositions(convert(resizeRedactionRequest.getPositions(), RectangleEntity.class));
+ manualResizeRedaction.setRequestDate(OffsetDateTime.now());
+
+ resizeRedactionRepository.save(manualResizeRedaction);
+ }
+
+
+ @Transactional
+ public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus) {
+
+ resizeRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> {
+ mre.setProcessedDate(OffsetDateTime.now());
+ mre.setStatus(annotationStatus);
+ });
+ }
+
+
+ @Transactional
+ public void hardDelete(String fileId, String annotationId) {
+
+ resizeRedactionRepository.deleteById(new AnnotationEntityId(annotationId, fileId));
+ }
+
+
+ @Transactional
+ public void softDelete(String fileId, String annotationId, OffsetDateTime softDeleteTime) {
+
+ resizeRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId))
+ .ifPresent(mre -> mre.setSoftDeletedTime(softDeleteTime));
+ }
+
+
+ @Transactional
+ public void undelete(String fileId, String annotationId) {
+
+ resizeRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId))
+ .ifPresent(mre -> mre.setSoftDeletedTime(null));
+ }
+
+
+ public ManualResizeRedactionEntity findResizeRedaction(String fileId, String annotationId) {
+
+ return resizeRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId))
+ .filter(mre -> mre.getSoftDeletedTime() == null)
+ .orElseThrow(() -> new NotFoundException("Unknown file/annotation combination: " + fileId + "/" + annotationId));
+ }
+
+
+ public Set findResizeRedactions(String fileId, boolean includeDeletions) {
+
+ return resizeRedactionRepository.findByIdFileId(fileId)
+ .stream()
+ .filter(mre -> includeDeletions || mre.getSoftDeletedTime() == null)
+ .collect(Collectors.toSet());
+
+ }
+
+}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RulesPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RulesPersistenceService.java
index fb578e6ca..56435d633 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RulesPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RulesPersistenceService.java
@@ -1,7 +1,6 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.RuleSetEntity;
-import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.RuleSetRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -13,11 +12,26 @@ import javax.transaction.Transactional;
@SuppressWarnings("PMD.TooManyStaticImports")
public class RulesPersistenceService {
- private static final String RULES_NOT_FOUND = "Could not find rules in database.";
+ private final static String DEFAULT_RULES = "" +
+ "package drools\n" +
+ "\n" +
+ "import com.iqser.red.service.redaction.v1.server.redaction.model.Section\n" +
+ "\n" +
+ "global Section section\n" +
+ "\n" +
+ "// --------------------------------------- Your rules below this line--------------------------------------------------";
+
private final RuleSetRepository ruleSetRepository;
public RuleSetEntity getRules(String dossierTemplateId) {
- return ruleSetRepository.findById(dossierTemplateId).orElseThrow(() -> new NotFoundException(RULES_NOT_FOUND));
+ return ruleSetRepository.findById(dossierTemplateId).orElseGet(() -> {
+ RuleSetEntity ruleSet = new RuleSetEntity();
+ ruleSet.setDossierTemplateId(dossierTemplateId);
+ ruleSet.setValue(DEFAULT_RULES);
+ ruleSet.setVersion(1);
+
+ return ruleSetRepository.save(ruleSet);
+ });
}
@Transactional
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ViewedPagesPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ViewedPagesPersistenceService.java
index a03eebe72..9d4b02cb6 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ViewedPagesPersistenceService.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ViewedPagesPersistenceService.java
@@ -49,4 +49,8 @@ public class ViewedPagesPersistenceService {
}
+ @Transactional
+ public void resetViewedPages(String fileId, String currentReviewer, List viewedPagesToReset) {
+ viewedPagesRepository.deleteSeenPages(fileId, currentReviewer, viewedPagesToReset);
+ }
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/AuditRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/AuditRepository.java
index ec22c7663..b8c749a1f 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/AuditRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/AuditRepository.java
@@ -2,14 +2,34 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import com.iqser.red.service.persistence.management.v1.processor.entity.audit.AuditEntity;
import com.iqser.red.service.persistence.service.v1.api.model.audit.CategoryModel;
+import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
+import java.time.OffsetDateTime;
import java.util.List;
-public interface AuditRepository extends JpaRepository {
+public interface AuditRepository extends JpaRepository, JpaSpecificationExecutor {
+
+ static Specification categoryMatches(String category) {
+ return (audit, cq, cb) -> cb.equal(audit.get("category"), category);
+ }
+
+ static Specification userMatches(String user) {
+ return (audit, cq, cb) -> cb.equal(audit.get("userId"), user);
+ }
+
+ static Specification objectIdMatches(String objectId) {
+ return (audit, cq, cb) -> cb.equal(audit.get("objectId"), objectId);
+ }
+
+ static Specification dateBetween(OffsetDateTime start, OffsetDateTime end) {
+ return (audit, cq, cb) -> cb.between(audit.get("recordDate"), start, end);
+ }
@Query("SELECT new com.iqser.red.service.persistence.service.v1.api.model.audit.CategoryModel(a.category, count(a)) FROM AuditEntity a GROUP BY a.category")
List findCategories();
+
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/CommentRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/CommentRepository.java
index 649971d09..71104ee76 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/CommentRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/CommentRepository.java
@@ -2,7 +2,10 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.CommentEntity;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import java.time.OffsetDateTime;
import java.util.List;
public interface CommentRepository extends JpaRepository {
@@ -12,4 +15,8 @@ public interface CommentRepository extends JpaRepository {
List findByFileId(String fileId);
boolean existsByFileIdAndSoftDeletedTimeIsNull(String fileId);
+
+ @Modifying
+ @Query("update CommentEntity c set c.softDeletedTime = :softDeleteTime where c.id = :id")
+ int updateSoftDelete(long id, OffsetDateTime softDeleteTime);
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DigitalSignatureRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DigitalSignatureRepository.java
index 58fab317e..3243618ee 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DigitalSignatureRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DigitalSignatureRepository.java
@@ -2,6 +2,17 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureEntity;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.persistence.Column;
public interface DigitalSignatureRepository extends JpaRepository {
+
+
+ @Modifying
+ @Query("update DigitalSignatureEntity e set e.reason = :reason, e.location = :location, e.contactInfo = :contactInfo, e.certificateName= :certificateName " +
+ "where e.id = :id")
+ int updateDigitalSignature(String id, String reason, String location, String contactInfo, String certificateName);
+
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierAttributeRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierAttributeRepository.java
index ce0a45043..8658bb803 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierAttributeRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierAttributeRepository.java
@@ -19,4 +19,8 @@ public interface DossierAttributeRepository extends JpaRepository {
+
+ @Modifying
+ @Query("update DossierEntity d set d.status = :dossierStatus, d.hardDeletedTime = :hardDeletedTime, d.lastUpdated = :lastUpdated," +
+ " d.softDeletedTime = " +
+ "case " +
+ "when d.softDeletedTime is null then :hardDeletedTime " +
+ "when d.softDeletedTime is not null then d.softDeletedTime " +
+ "end " +
+ "where d.id = :dossierId")
+ void hardDelete(String dossierId, DossierStatus dossierStatus, OffsetDateTime hardDeletedTime, OffsetDateTime lastUpdated);
+
+ @Modifying
+ @Query("update DossierEntity d set d.status = :dossierStatus, d.softDeletedTime = null, d.lastUpdated = :lastUpdated where d.id = :dossierId" +
+ " and d.hardDeletedTime is null")
+ int undelete(String dossierId, DossierStatus dossierStatus, OffsetDateTime lastUpdated);
+
+ @Modifying
+ @Query("update DossierEntity d set d.status = :dossierStatus, d.softDeletedTime = :softDeletedTime, d.lastUpdated = :lastUpdated where d.id = :dossierId")
+ void markDossierAsDeleted(String dossierId, DossierStatus dossierStatus, OffsetDateTime softDeletedTime, OffsetDateTime lastUpdated);
+
+ boolean existsByLastUpdatedIsAfter(OffsetDateTime since);
+
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DownloadStatusRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DownloadStatusRepository.java
index 596f24505..f1e896afc 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DownloadStatusRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DownloadStatusRepository.java
@@ -1,10 +1,26 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository;
import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity;
+import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import java.time.OffsetDateTime;
import java.util.List;
public interface DownloadStatusRepository extends JpaRepository {
List findAllByUserId(String userId);
+
+ @Modifying
+ @Query("update DownloadStatusEntity ds set ds.status = :status where ds.storageId = :storageId")
+ void updateStatus(String storageId, DownloadStatusValue status);
+
+ @Modifying
+ @Query("update DownloadStatusEntity ds set ds.status = :status, ds.fileSize = :fileSize where ds.storageId = :storageId")
+ void updateStatus(String storageId, DownloadStatusValue status, long fileSize);
+
+ @Modifying
+ @Query("update DownloadStatusEntity ds set ds.lastDownload = :lastDownload where ds.storageId = :storageId")
+ void updateLastDownload(String storageId, OffsetDateTime lastDownload);
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/EntryRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/EntryRepository.java
index 76622b8a0..288b359c8 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/EntryRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/EntryRepository.java
@@ -9,6 +9,8 @@ import java.util.List;
public interface EntryRepository extends JpaRepository {
+ @Modifying
+ @Query("update DictionaryEntryEntity e set e.deleted = true , e.version = :version where e.type.id =:typeId and e.value in :values")
void deleteAllByTypeIdAndVersionAndValueIn(String typeId, long version, List values);
@Modifying
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileAttributesRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileAttributesRepository.java
index 099d2146a..abba4ef1c 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileAttributesRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileAttributesRepository.java
@@ -11,4 +11,7 @@ public interface FileAttributesRepository extends JpaRepository {
+
+ boolean existsByDossierIdAndLastUpdatedIsAfter(String dossierId, OffsetDateTime since);
+
List findByDossierId(String dossierId);
+
+ @Modifying
+ @Query("update FileEntity e set e.hasRedactions = :hasRedactions ," +
+ " e.hasHints = :hasHints, e.hasSuggestions = :hasSuggestions," +
+ " e.hasImages = :hasImages, e.hasUpdates = :hasUpdates, e.hasAnnotationComments = :hasComments, " +
+ " e.lastUpdated = :lastUpdated " +
+ " where e.id =:fileId")
+ void updateFlags(String fileId,
+ OffsetDateTime lastUpdated,
+ boolean hasRedactions,
+ boolean hasHints,
+ boolean hasImages,
+ boolean hasSuggestions,
+ boolean hasComments,
+ boolean hasUpdates);
}
+
+
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ForceRedactionRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ForceRedactionRepository.java
index 2175caaf7..16075852e 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ForceRedactionRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ForceRedactionRepository.java
@@ -2,11 +2,26 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualForceRedactionEntity;
+import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import java.time.OffsetDateTime;
import java.util.List;
public interface ForceRedactionRepository extends JpaRepository {
List findByIdFileId(String fileId);
+
+ @Modifying
+ @Query("update ManualForceRedactionEntity mfr set mfr.status = :annotationStatus, mfr.processedDate = :processedDate " +
+ "where mfr.id = :annotationEntityId")
+ void updateStatus(AnnotationEntityId annotationEntityId, AnnotationStatus annotationStatus, OffsetDateTime processedDate);
+
+ @Modifying
+ @Query("update ManualForceRedactionEntity mfr set mfr.softDeletedTime = :softDeletedTime " +
+ "where mfr.id = :annotationEntityId")
+ void updateSoftDelete(AnnotationEntityId annotationEntityId, OffsetDateTime softDeletedTime);
+
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ImageRecategorizationRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ImageRecategorizationRepository.java
index 89700b921..841177aea 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ImageRecategorizationRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ImageRecategorizationRepository.java
@@ -2,10 +2,25 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualImageRecategorizationEntity;
+import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import java.time.OffsetDateTime;
import java.util.List;
public interface ImageRecategorizationRepository extends JpaRepository {
List findByIdFileId(String fileId);
+
+ @Modifying
+ @Query("update ManualImageRecategorizationEntity mir set mir.status = :annotationStatus, mir.processedDate = :processedDate " +
+ "where mir.id = :annotationEntityId")
+ void updateStatus(AnnotationEntityId annotationEntityId, AnnotationStatus annotationStatus, OffsetDateTime processedDate);
+
+ @Modifying
+ @Query("update ManualImageRecategorizationEntity mir set mir.softDeletedTime = :softDeletedTime " +
+ "where mir.id = :annotationEntityId")
+ void updateSoftDelete(AnnotationEntityId annotationEntityId, OffsetDateTime softDeletedTime);
+
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/LegalBasisChangeRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/LegalBasisChangeRepository.java
index 08810acec..cb40465c1 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/LegalBasisChangeRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/LegalBasisChangeRepository.java
@@ -2,11 +2,25 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualLegalBasisChangeEntity;
+import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import java.time.OffsetDateTime;
import java.util.List;
public interface LegalBasisChangeRepository extends JpaRepository {
List findByIdFileId(String fileId);
+
+ @Modifying
+ @Query("update ManualLegalBasisChangeEntity mlbc set mlbc.status = :annotationStatus, mlbc.processedDate = :processedDate " +
+ "where mlbc.id = :annotationEntityId")
+ void updateStatus(AnnotationEntityId annotationEntityId, AnnotationStatus annotationStatus, OffsetDateTime processedDate);
+
+ @Modifying
+ @Query("update ManualLegalBasisChangeEntity mlbc set mlbc.softDeletedTime = :softDeletedTime " +
+ "where mlbc.id = :annotationEntityId")
+ void updateSoftDelete(AnnotationEntityId annotationEntityId, OffsetDateTime softDeletedTime);
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ManualRedactionRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ManualRedactionRepository.java
index e694a18f6..146dab55e 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ManualRedactionRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ManualRedactionRepository.java
@@ -2,11 +2,29 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity;
+import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import java.time.OffsetDateTime;
import java.util.List;
public interface ManualRedactionRepository extends JpaRepository {
List findByIdFileId(String fileId);
+
+ @Modifying
+ @Query("update ManualRedactionEntryEntity m set m.softDeletedTime = :softDeleteTime where m.id = :id")
+ void updateSoftDelete(AnnotationEntityId id, OffsetDateTime softDeleteTime);
+
+ @Modifying
+ @Query("update ManualRedactionEntryEntity m set m.processedDate = :processedDate, m.status = :annotationStatus" +
+ " where m.id = :id")
+ void updateStatus(AnnotationEntityId id, OffsetDateTime processedDate, AnnotationStatus annotationStatus);
+
+ @Modifying
+ @Query("update ManualRedactionEntryEntity m set m.processedDate = :processedDate, m.status = :annotationStatus," +
+ " m.addToDictionary = :isAddOrRemoveFromDictionary where m.id = :id")
+ void updateStatus(AnnotationEntityId id, OffsetDateTime processedDate, AnnotationStatus annotationStatus, boolean isAddOrRemoveFromDictionary);
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/NotificationPreferencesRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/NotificationPreferencesRepository.java
new file mode 100644
index 000000000..206736d0d
--- /dev/null
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/NotificationPreferencesRepository.java
@@ -0,0 +1,7 @@
+package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository;
+
+import com.iqser.red.service.persistence.management.v1.processor.entity.notification.NotificationPreferencesEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface NotificationPreferencesRepository extends JpaRepository {
+}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/NotificationRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/NotificationRepository.java
index 768863b8a..750f6a7fe 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/NotificationRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/NotificationRepository.java
@@ -2,13 +2,17 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import com.iqser.red.service.persistence.management.v1.processor.entity.notification.NotificationEntity;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
+import java.time.OffsetDateTime;
import java.util.List;
import java.util.Optional;
public interface NotificationRepository extends JpaRepository {
+ boolean existsByUserIdAndCreationDateIsAfter(String userId, OffsetDateTime since);
+
List findByUserIdOrderByCreationDateDesc(String userId);
@Query("Select n from NotificationEntity n where n.softDeleted is null and n.userId = :userId order by n.creationDate desc")
@@ -18,4 +22,16 @@ public interface NotificationRepository extends JpaRepository findNotSeenForUser(String userId);
Optional findByIdAndUserId(long notificationId, String userId);
+
+ @Modifying
+ @Query("update NotificationEntity n set n.seenDate = :seenDate where n.id = :notificationId and n.userId = :userId")
+ int setSeenDate(String userId, long notificationId, OffsetDateTime seenDate);
+
+ @Modifying
+ @Query("update NotificationEntity n set n.readDate = :readDate where n.id = :notificationId and n.userId = :userId")
+ int setReadDate(String userId, long notificationId, OffsetDateTime readDate);
+
+ @Modifying
+ @Query("update NotificationEntity n set n.softDeleted = :softDeleted where n.id = :notificationId and n.userId = :userId")
+ int softDelete(String userId, long notificationId, OffsetDateTime softDeleted);
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/RemoveRedactionRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/RemoveRedactionRepository.java
index 10ad17407..47919b373 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/RemoveRedactionRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/RemoveRedactionRepository.java
@@ -2,11 +2,32 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.IdRemovalEntity;
+import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import java.time.OffsetDateTime;
import java.util.List;
public interface RemoveRedactionRepository extends JpaRepository {
List findByIdFileId(String fileId);
+
+ @Modifying
+ @Query("update IdRemovalEntity idr set idr.softDeletedTime = :softDeletedTime " +
+ "where idr.id = :annotationEntityId")
+ void updateSoftDelete(AnnotationEntityId annotationEntityId, OffsetDateTime softDeletedTime);
+
+ @Modifying
+ @Query("update IdRemovalEntity idr set idr.status = :annotationStatus, idr.processedDate = :processedDate " +
+ "where idr.id = :annotationEntityId")
+ void updateStatus(AnnotationEntityId annotationEntityId, AnnotationStatus annotationStatus, OffsetDateTime processedDate);
+
+ @Modifying
+ @Query("update IdRemovalEntity idr set idr.status = :annotationStatus, idr.processedDate = :processedDate, " +
+ "idr.removeFromDictionary = :removeFromDictionary where idr.id = :annotationEntityId")
+ void updateStatusAndRemoveFromDictionary(AnnotationEntityId annotationEntityId, AnnotationStatus annotationStatus, OffsetDateTime processedDate,
+ boolean removeFromDictionary);
+
}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ResizeRedactionRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ResizeRedactionRepository.java
new file mode 100644
index 000000000..f26c950a0
--- /dev/null
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ResizeRedactionRepository.java
@@ -0,0 +1,13 @@
+package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
+import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualResizeRedactionEntity;
+
+public interface ResizeRedactionRepository extends JpaRepository {
+
+ List findByIdFileId(String fileId);
+}
diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ViewedPagesRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ViewedPagesRepository.java
index b08d9defc..a6492b7c4 100644
--- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ViewedPagesRepository.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ViewedPagesRepository.java
@@ -2,6 +2,8 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ViewedPageEntity;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
import java.util.List;
@@ -11,4 +13,7 @@ public interface ViewedPagesRepository extends JpaRepository findByFileIdAndIdUserId(String fileId, String userId);
+ @Modifying
+ @Query("DELETE FROM ViewedPageEntity e where e.id.fileId = :fileId and e.id.userId = :currentReviewer and e.id.page in :viewedPagesToReset")
+ void deleteSeenPages(String fileId, String currentReviewer, List viewedPagesToReset);
}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/utils/JSONConverter.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONConverter.java
similarity index 92%
rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/utils/JSONConverter.java
rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONConverter.java
index 86e4d9c70..5e20fb791 100644
--- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/utils/JSONConverter.java
+++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONConverter.java
@@ -1,4 +1,4 @@
-package com.iqser.red.service.persistence.service.v1.api.utils;
+package com.iqser.red.service.persistence.management.v1.processor.utils;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java
index 30f51e2cf..5c2fa4daa 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java
@@ -20,9 +20,11 @@ import org.springframework.retry.backoff.ExponentialBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
@EnableAsync
@EnableRetry
+@EnableScheduling
@EnableConfigurationProperties(FileManagementServiceSettings.class)
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class, CassandraAutoConfiguration.class})
@Import({DefaultWebMvcConfiguration.class, PersistenceServiceProcessorConfiguration.class, MessagingConfiguration.class, CleanupDownloadSchedulerConfiguration.class})
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ControllerAdvice.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ControllerAdvice.java
index dab624c78..c71b27697 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ControllerAdvice.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ControllerAdvice.java
@@ -6,7 +6,9 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.BadRe
import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import lombok.extern.slf4j.Slf4j;
+import org.postgresql.util.PSQLException;
import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
@@ -55,4 +57,15 @@ public class ControllerAdvice {
public ErrorMessage handleIBadRequestException(BadRequestException e) {
return new ErrorMessage(OffsetDateTime.now(), e.getMessage());
}
+
+ @ResponseBody
+ @ExceptionHandler(value = PSQLException.class)
+ public ResponseEntity handleSQLException(PSQLException e) {
+ if (e.getMessage().contains("violates unique constraint")) {
+ return new ResponseEntity<>(new ErrorMessage(OffsetDateTime.now(), "Unique constraint violation"), HttpStatus.CONFLICT);
+ } else {
+ log.error("PLSQL Exception occurred: {}", e.getMessage(), e);
+ return new ResponseEntity<>(new ErrorMessage(OffsetDateTime.now(), "SQL Exception"), HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DictionaryController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DictionaryController.java
index c3fdbd36b..490eb5a6e 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DictionaryController.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DictionaryController.java
@@ -56,15 +56,15 @@ public class DictionaryController implements DictionaryResource {
// To check whether the type exists, type should not be added into database implicitly by addEntry.
Type typeResult = convert(dictionaryPersistenceService.getType(typeId), Type.class);
-// List entriesToSearch = new ArrayList<>();
+ var currentVersion = getCurrentVersion(typeResult);
+
+ List existing = entryPersistenceService.getEntries(typeId)
+ .stream()
+ .filter(e -> !e.isDeleted())
+ .map(DictionaryEntryEntity::getValue)
+ .collect(toList());
- long currentVersion = typeResult.getVersion();
if (removeCurrent) {
- List existing = entryPersistenceService.getEntries(typeId)
- .stream()
- .filter(e -> !e.isDeleted())
- .map(DictionaryEntryEntity::getValue)
- .collect(toList());
List removed = new ArrayList<>(existing);
removed.removeAll(cleanEntries);
@@ -75,11 +75,14 @@ public class DictionaryController implements DictionaryResource {
entryPersistenceService.deleteEntries(typeId, removed, currentVersion + 1);
entryPersistenceService.addEntry(typeId, added, currentVersion + 1);
-// entriesToSearch.addAll(added);
-// entriesToSearch.addAll(removed);
} else {
- entryPersistenceService.addEntry(typeId, cleanEntries, currentVersion + 1);
-// entriesToSearch.addAll(cleanEntries);
+
+ List added = new ArrayList<>(cleanEntries);
+ added.removeAll(existing);
+ if(added.isEmpty()){
+ return;
+ }
+ entryPersistenceService.addEntry(typeId, added, currentVersion + 1);
}
dictionaryPersistenceService.incrementVersion(typeId);
@@ -94,7 +97,7 @@ public class DictionaryController implements DictionaryResource {
// To check whether the type exists
Type typeResult = convert(dictionaryPersistenceService.getType(typeId), Type.class);
- long currentVersion = typeResult.getVersion();
+ var currentVersion = getCurrentVersion(typeResult);
if (typeResult.isCaseInsensitive()) {
List existing = entryPersistenceService.getEntries(typeId)
@@ -135,7 +138,8 @@ public class DictionaryController implements DictionaryResource {
if (typeResult.isHint() != typeValueRequest.isHint() || typeResult.isCaseInsensitive() != typeValueRequest.isCaseInsensitive() || typeResult
.getRank() != typeValueRequest.getRank()) {
- long currentVersion = typeResult.getVersion();
+
+ var currentVersion = getCurrentVersion(typeResult);
List entries = convert(entryPersistenceService.getEntries(typeId), DictionaryEntry.class);
entryPersistenceService.setVersion(typeId, entries.stream()
.filter(entry -> !entry.isDeleted())
@@ -180,7 +184,8 @@ public class DictionaryController implements DictionaryResource {
// NotFoundException would be thrown if the type not found in database.
Type typeResult = convert(dictionaryPersistenceService.getType(typeId), Type.class);
- long currentVersion = typeResult.getVersion();
+
+ var currentVersion = getCurrentVersion(typeResult);
dictionaryPersistenceService.deleteType(typeId);
List existing = entryPersistenceService.getEntries(typeId)
@@ -207,7 +212,10 @@ public class DictionaryController implements DictionaryResource {
@Override
public Type getDictionaryForType(@PathVariable(TYPE_PARAMETER_NAME) String typeId) {
- return convert(dictionaryPersistenceService.getType(typeId), Type.class);
+ var entity = dictionaryPersistenceService.getType(typeId);
+ var target = convert(entity, Type.class);
+ target.setEntries(convert(entity.getEntries(), DictionaryEntry.class));
+ return target;
}
@Override
@@ -253,12 +261,12 @@ public class DictionaryController implements DictionaryResource {
@Override
public long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) {
- return getAllTypesForDossierTemplate(dossierTemplateId).stream().map(Type::getVersion).reduce(0L, Long::sum);
+ return dictionaryPersistenceService.getVersion(dossierTemplateId);
}
@Override
public long getVersionForDossier(@PathVariable(DOSSIER_ID_PARAMETER_NAME) String dossierId) {
- return getAllTypesForDossier(dossierId).stream().map(Type::getVersion).reduce(0L, Long::sum);
+ return dictionaryPersistenceService.getVersionForDossier(dossierId);
}
@@ -293,6 +301,15 @@ public class DictionaryController implements DictionaryResource {
}
}
+ private long getCurrentVersion(Type typeResult) {
+ long currentVersion;
+ if (typeResult.getDossierId() != null) {
+ currentVersion = getVersionForDossier(typeResult.getDossierId());
+ } else {
+ currentVersion = getVersion(typeResult.getDossierTemplateId());
+ }
+ return currentVersion;
+ }
private String humanizedDictionaryType(String label) {
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierController.java
index 1349910dd..ff15f8e61 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierController.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierController.java
@@ -7,6 +7,7 @@ import com.iqser.red.service.peristence.v1.server.utils.DossierMapper;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException;
+import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus;
@@ -15,6 +16,7 @@ import feign.Param;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.transaction.Transactional;
@@ -23,8 +25,8 @@ import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
-import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
import static com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException.DOSSIER_NOT_FOUND_MESSAGE;
+import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
@RestController
@RequiredArgsConstructor
@@ -34,6 +36,12 @@ public class DossierController implements DossierResource {
private final FileStatusService fileStatusService;
private final FileService fileService;
+ @Override
+ public JSONPrimitive hasChangesSince(@RequestParam(SINCE_REQUEST_PARAM) OffsetDateTime since) {
+
+ return JSONPrimitive.of(dossierService.hasChangesSince(since));
+ }
+
@Override
@Transactional
@@ -85,10 +93,11 @@ public class DossierController implements DossierResource {
@Override
@Transactional
- public Dossier getDossierById(@Param(DOSSIER_ID_PARAM) @PathVariable(DOSSIER_ID_PARAM) String dossierId) {
+ public Dossier getDossierById(@Param(DOSSIER_ID_PARAM) @PathVariable(DOSSIER_ID_PARAM) String dossierId,
+ @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted) {
DossierEntity dossier = dossierService.getDossierById(dossierId);
- if (dossier.getStatus().equals(DossierStatus.DELETED)) {
+ if (dossier.getStatus().equals(DossierStatus.DELETED) && !includeDeleted) {
throw new DossierNotFoundException(String.format(DOSSIER_NOT_FOUND_MESSAGE, dossierId));
}
return convert(dossier, Dossier.class, new DossierMapper());
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierStatsController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierStatsController.java
new file mode 100644
index 000000000..e100fd59e
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierStatsController.java
@@ -0,0 +1,30 @@
+package com.iqser.red.service.peristence.v1.server.controller;
+
+import com.iqser.red.service.peristence.v1.server.service.DossierStatsService;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStats;
+import com.iqser.red.service.persistence.service.v1.api.resources.DossierStatsResource;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@RestController
+@RequiredArgsConstructor
+public class DossierStatsController implements DossierStatsResource {
+
+ private final DossierStatsService dossierStatsService;
+
+ @Override
+ public DossierStats getDossierStats(String dossierId) {
+ return dossierStatsService.getDossierStats(dossierId);
+ }
+
+ @Override
+ public List getDossierStats(Set dossierIds) {
+ return dossierIds.stream().map(dossierStatsService::getDossierStats).collect(Collectors.toList());
+ }
+}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DownloadController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DownloadController.java
index 084b9115e..658f91e67 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DownloadController.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DownloadController.java
@@ -49,7 +49,7 @@ public class DownloadController implements DownloadResource {
var dossier = dossierPersistenceService.getAndValidateDossier(request.getDossierId());
- downloadStatusPersistenceService.createStatus(request.getUserId(), storageId, dossier, downloadFilename, mimeType, request.getFileIds());
+ downloadStatusPersistenceService.createStatus(request.getUserId(), storageId, dossier, downloadFilename, mimeType, request.getFileIds(), dossier.getDownloadFileTypes());
addToDownloadQueue(DownloadJob.builder().storageId(storageId).userId(request.getUserId()).build(), 1);
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileAttributesController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileAttributesController.java
index 5b73a6054..716acbc05 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileAttributesController.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileAttributesController.java
@@ -6,14 +6,13 @@ import com.iqser.red.service.peristence.v1.server.service.FileStatusService;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity;
-import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ImportCsvRequest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ImportCsvResponse;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
import com.iqser.red.service.persistence.service.v1.api.resources.FileAttributesResource;
import com.iqser.red.service.persistence.service.v1.api.utils.SuppressFBWarnings;
import com.opencsv.CSVParser;
@@ -59,7 +58,7 @@ public class FileAttributesController implements FileAttributesResource {
Map fileStatusByFilename = fileStatusService.getDossierStatus(dossierId)
.stream()
- .filter(f -> !f.getStatus().equals(FileStatus.DELETED))
+ .filter(f -> !f.getProcessingStatus().equals(ProcessingStatus.DELETED))
.collect(Collectors.toMap(FileEntity::getFilename, Function.identity()));
List> rows = getCsvRecords(importCsvRequest.getCsvFile(), generalConfiguration.getDelimiter());
@@ -111,7 +110,7 @@ public class FileAttributesController implements FileAttributesResource {
String fileId = fileStatusByFilename.get(fileStatusMappingColumn.trim()).getId();
- fileStatusPersistenceService.setFileAttributes(fileId, convertFileAttributes(dossierId, fileId, attributeIdToValue));
+ fileStatusPersistenceService.setFileAttributes(dossierId, fileId, attributeIdToValue);
affectedFileIds.add(fileId);
}
@@ -123,23 +122,7 @@ public class FileAttributesController implements FileAttributesResource {
public void setFileAttributes(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@PathVariable(FILE_ID) String fileId, @RequestBody Map fileAttributesMap) {
- fileStatusPersistenceService.setFileAttributes(fileId, convertFileAttributes(dossierId, fileId, fileAttributesMap));
- }
-
- private List convertFileAttributes(String dossierId, String fileId, Map fileAttributesMap) {
- var dossier = dossierService.getDossierById(dossierId);
- var file = fileStatusService.getStatus(fileId);
- List configuration = fileAttributeConfigPersistenceService.getFileAttributes(dossier.getDossierTemplateId());
-
- return fileAttributesMap.entrySet().stream().map(entry -> {
- var fa = new FileAttributeEntity();
- fa.setFileAttributeId(new FileAttributeEntity.FileAttributeEntityId());
- fa.setFile(file);
- fa.setFileAttributeConfig(configuration.stream().filter(c -> c.getId().equals(entry.getKey())).findAny().orElseThrow(() ->
- new BadRequestException("Invalid File Attribute Id")));
- fa.setValue(entry.getValue());
- return fa;
- }).collect(Collectors.toList());
+ fileStatusPersistenceService.setFileAttributes(dossierId, fileId, fileAttributesMap);
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusController.java
index 83e0bbb66..a3b90f1ae 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusController.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusController.java
@@ -1,14 +1,12 @@
package com.iqser.red.service.peristence.v1.server.controller;
-import com.iqser.red.service.peristence.v1.server.service.AnalysisFlagsCalculationService;
-import com.iqser.red.service.peristence.v1.server.service.DossierService;
-import com.iqser.red.service.peristence.v1.server.service.ExcludeFromAnalysisService;
-import com.iqser.red.service.peristence.v1.server.service.FileStatusService;
+import com.iqser.red.service.peristence.v1.server.service.*;
import com.iqser.red.service.peristence.v1.server.utils.FileModelMapper;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
import com.iqser.red.service.persistence.service.v1.api.resources.StatusResource;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PathVariable;
@@ -16,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
+import java.time.OffsetDateTime;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@@ -27,36 +26,44 @@ import static com.iqser.red.service.persistence.management.v1.processor.utils.Ma
public class FileStatusController implements StatusResource {
private final FileStatusService fileStatusService;
- private final DossierService dossierService;
private final ExcludeFromAnalysisService excludeFromAnalysis;
private final AnalysisFlagsCalculationService analysisFlagsCalculationService;
+ private final ReanalysisRequiredStatusService reanalysisRequiredStatusService;
@Override
public List getAllStatuses() {
- return convert(fileStatusService.getAllStatuses()
+ return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convert(fileStatusService.getAllStatuses()
.stream()
- .filter(f -> !f.getStatus().equals(FileStatus.DELETED))
- .collect(Collectors.toList()), FileModel.class, new FileModelMapper());
+ .filter(f -> !f.getProcessingStatus().equals(ProcessingStatus.DELETED))
+ .collect(Collectors.toList()), FileModel.class, new FileModelMapper()));
+ }
+
+
+ @Override
+ public JSONPrimitive hasChangesSince(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
+ @RequestParam(SINCE_REQUEST_PARAM) OffsetDateTime since) {
+
+ return JSONPrimitive.of(fileStatusService.hasChangesSince(dossierId,since));
}
@Override
public List getDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId) {
- return convert(fileStatusService.getDossierStatus(dossierId)
+ return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convert(fileStatusService.getDossierStatus(dossierId)
.stream()
- .filter(f -> !f.getStatus().equals(FileStatus.DELETED))
- .collect(Collectors.toList()), FileModel.class, new FileModelMapper());
+ .filter(f -> !f.getProcessingStatus().equals(ProcessingStatus.DELETED))
+ .collect(Collectors.toList()), FileModel.class, new FileModelMapper()));
}
@Override
public List getSoftDeletedDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId) {
- return convert(fileStatusService.getDossierStatus(dossierId)
+ return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convert(fileStatusService.getDossierStatus(dossierId)
.stream()
- .filter(f -> f.getStatus().equals(FileStatus.DELETED) && f.getHardDeletedTime() == null)
- .collect(Collectors.toList()), FileModel.class, new FileModelMapper());
+ .filter(f -> f.getProcessingStatus().equals(ProcessingStatus.DELETED) && f.getHardDeletedTime() == null)
+ .collect(Collectors.toList()), FileModel.class, new FileModelMapper()));
}
@@ -64,17 +71,19 @@ public class FileStatusController implements StatusResource {
public FileModel getFileStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@PathVariable(FILE_ID) String fileId) {
- return convert(fileStatusService.getStatus(fileId), FileModel.class, new FileModelMapper());
+ return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(
+ convert(fileStatusService.getStatus(fileId), FileModel.class, new FileModelMapper()));
}
@Override
public void setCurrentFileReviewer(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@PathVariable(FILE_ID) String fileId,
- @RequestBody JSONPrimitive currentFileReviewerRequest) {
+ @RequestParam(value = REVIEWER_ID_REQUEST_PARAM, required = false) String reviewerId) {
- fileStatusService.setCurrentReviewer(dossierId, fileId, currentFileReviewerRequest.getValue());
- fileStatusService.setStatusSuccessful(fileId, FileStatus.UNDER_REVIEW);
+ fileStatusService.setCurrentReviewer(dossierId, fileId, reviewerId);
+ fileStatusService.setStatusSuccessful(fileId, reviewerId != null ? WorkflowStatus.UNDER_REVIEW : WorkflowStatus.UNASSIGNED);
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -85,7 +94,8 @@ public class FileStatusController implements StatusResource {
FileEntity fileStatus = fileStatusService.getStatus(fileId);
String lastReviewer = fileStatus.getLastReviewer();
fileStatusService.setCurrentReviewer(dossierId, fileId, lastReviewer);
- fileStatusService.setStatusSuccessful(fileId, FileStatus.UNDER_REVIEW);
+ fileStatusService.setStatusSuccessful(fileId, lastReviewer != null ? WorkflowStatus.UNDER_REVIEW : WorkflowStatus.UNASSIGNED);
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -93,20 +103,16 @@ public class FileStatusController implements StatusResource {
@PathVariable(FILE_ID) String fileId,
@RequestParam(value = APPROVER_ID_REQUEST_PARAM, required = false) String approverId) {
-
- var dossier = dossierService.getDossierById(dossierId);
-
- String dossierOwner = dossier.getOwnerId();
-
- fileStatusService.setCurrentReviewer(dossierId, fileId, approverId != null ? approverId : dossierOwner);
- fileStatusService.setStatusSuccessful(fileId, FileStatus.UNDER_APPROVAL);
+ fileStatusService.setCurrentReviewer(dossierId, fileId, approverId);
+ fileStatusService.setStatusSuccessful(fileId, approverId != null ? WorkflowStatus.UNDER_APPROVAL : WorkflowStatus.UNASSIGNED);
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
public void setStatusApproved(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@PathVariable(FILE_ID) String fileId) {
- fileStatusService.setApprovalStatusSuccessful(fileId, FileStatus.APPROVED);
+ fileStatusService.setApprovalStatusSuccessful(fileId, WorkflowStatus.APPROVED);
}
public void toggleExclusion(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@@ -122,7 +128,7 @@ public class FileStatusController implements StatusResource {
Set excludedPages = fileStatus.getExcludedPages();
excludedPages.addAll(pages);
- fileStatusService.setExcludedPages(fileId, pages);
+ fileStatusService.setExcludedPages(fileId, excludedPages);
analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/LegalBasisMappingController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/LegalBasisMappingController.java
index 28b3abb3a..9f68be805 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/LegalBasisMappingController.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/LegalBasisMappingController.java
@@ -1,9 +1,6 @@
package com.iqser.red.service.peristence.v1.server.controller;
-import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.LegalBasisEntity;
-import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.LegalBasisMappingEntity;
-import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
-import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.LegalBasisMappingRepository;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.LegalBasisMappingPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis;
import com.iqser.red.service.persistence.service.v1.api.resources.LegalBasisMappingResource;
import lombok.RequiredArgsConstructor;
@@ -22,37 +19,34 @@ import static com.iqser.red.service.persistence.management.v1.processor.utils.Ma
public class LegalBasisMappingController implements LegalBasisMappingResource {
- private final LegalBasisMappingRepository legalBasisMappingRepository;
+ private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService;
+ @Override
+ public void deleteLegalBasis(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody List legalBasisNames) {
+ legalBasisMappingPersistenceService.deleteLegalBasis(dossierTemplateId, legalBasisNames);
+ }
+
+ @Override
+ public void addOrUpdateLegalBasis(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody LegalBasis legalBasis) {
+ legalBasisMappingPersistenceService.addOrUpdateLegalBasis(dossierTemplateId, legalBasis);
+ }
@Override
@Transactional
public void setLegalBasisMapping(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody List legalBasisMapping) {
- legalBasisMappingRepository.findById(dossierTemplateId).ifPresentOrElse((lbm) -> {
- lbm.setVersion(lbm.getVersion() + 1);
- lbm.setLegalBasis(convert(legalBasisMapping, LegalBasisEntity.class));
- legalBasisMappingRepository.save(lbm);
- }, () -> {
- var lbm = new LegalBasisMappingEntity();
- lbm.setDossierTemplateId(dossierTemplateId);
- lbm.setLegalBasis(convert(legalBasisMapping, LegalBasisEntity.class));
- lbm.setVersion(1);
- legalBasisMappingRepository.save(lbm);
- });
+ legalBasisMappingPersistenceService.setLegalBasisMapping(dossierTemplateId, legalBasisMapping);
}
@Override
@Transactional
public List getLegalBasisMapping(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) {
- return convert(
- legalBasisMappingRepository.findById(dossierTemplateId).map(LegalBasisMappingEntity::getLegalBasis)
- .orElseThrow(() -> new NotFoundException("Legal Basis Not configured!")), LegalBasis.class);
+ return convert(legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplateId), LegalBasis.class);
}
@Override
public long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) {
- return legalBasisMappingRepository.findById(dossierTemplateId).map(LegalBasisMappingEntity::getVersion).orElse(0L);
+ return legalBasisMappingPersistenceService.getVersion(dossierTemplateId);
}
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ManualRedactionController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ManualRedactionController.java
index 00cca0ee8..4e29df31e 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ManualRedactionController.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ManualRedactionController.java
@@ -1,9 +1,9 @@
package com.iqser.red.service.peristence.v1.server.controller;
-import com.iqser.red.service.peristence.v1.server.service.AnalysisFlagsCalculationService;
import com.iqser.red.service.peristence.v1.server.service.ManualRedactionService;
import com.iqser.red.service.peristence.v1.server.utils.ManualImageRecategorizationMapper;
import com.iqser.red.service.peristence.v1.server.utils.ManualRedactionMapper;
+import com.iqser.red.service.peristence.v1.server.utils.ManualResizeRedactionMapper;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.*;
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.resources.ManualRedactionResource;
@@ -19,7 +19,6 @@ import static com.iqser.red.service.persistence.management.v1.processor.utils.Ma
public class ManualRedactionController implements ManualRedactionResource {
private final ManualRedactionService manualRedactionService;
- private final AnalysisFlagsCalculationService analysisFlagsCalculationService;
@Override
@@ -27,9 +26,7 @@ public class ManualRedactionController implements ManualRedactionResource {
@PathVariable(FILE_ID) String fileId,
@RequestBody AddRedactionRequest addRedactionRequest) {
- var resp = manualRedactionService.addAddRedaction(dossierId, fileId, addRedactionRequest);
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
- return resp;
+ return manualRedactionService.addAddRedaction(dossierId, fileId, addRedactionRequest);
}
@@ -38,9 +35,7 @@ public class ManualRedactionController implements ManualRedactionResource {
@PathVariable(FILE_ID) String fileId,
@RequestBody RemoveRedactionRequest removeRedactionRequest) {
- var resp = manualRedactionService.addRemoveRedaction(dossierId, fileId, removeRedactionRequest);
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
- return resp;
+ return manualRedactionService.addRemoveRedaction(dossierId, fileId, removeRedactionRequest);
}
@@ -49,9 +44,7 @@ public class ManualRedactionController implements ManualRedactionResource {
@PathVariable(FILE_ID) String fileId,
@RequestBody ForceRedactionRequest forceRedactionRequest) {
- var resp = manualRedactionService.addForceRedaction(dossierId, fileId, forceRedactionRequest);
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
- return resp;
+ return manualRedactionService.addForceRedaction(dossierId, fileId, forceRedactionRequest);
}
@@ -60,9 +53,7 @@ public class ManualRedactionController implements ManualRedactionResource {
@PathVariable(FILE_ID) String fileId,
@RequestBody LegalBasisChangeRequest legalBasisChangeRequest) {
- var resp = manualRedactionService.addLegalBasisChange(dossierId, fileId, legalBasisChangeRequest);
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
- return resp;
+ return manualRedactionService.addLegalBasisChange(dossierId, fileId, legalBasisChangeRequest);
}
@@ -71,9 +62,7 @@ public class ManualRedactionController implements ManualRedactionResource {
@PathVariable(FILE_ID) String fileId,
@RequestBody ImageRecategorizationRequest imageRecategorizationRequest) {
- var resp = manualRedactionService.addImageRecategorization(dossierId, fileId, imageRecategorizationRequest);
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
- return resp;
+ return manualRedactionService.addImageRecategorization(dossierId, fileId, imageRecategorizationRequest);
}
@@ -82,9 +71,16 @@ public class ManualRedactionController implements ManualRedactionResource {
@PathVariable(ANNOTATION_ID) String annotationId,
@RequestBody CommentRequest comment) {
- var resp = convert(manualRedactionService.addComment(fileId, annotationId, comment), Comment.class);
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
- return resp;
+ return convert(manualRedactionService.addComment(fileId, annotationId, comment), Comment.class);
+ }
+
+
+ @Override
+ public ManualAddResponse addResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId,
+ @PathVariable(FILE_ID) String fileId,
+ @RequestBody ResizeRedactionRequest resizeRedactionRequest) {
+
+ return manualRedactionService.addResizeRedaction(dossierId, fileId, resizeRedactionRequest);
}
@@ -133,12 +129,18 @@ public class ManualRedactionController implements ManualRedactionResource {
}
+ public ManualResizeRedaction getResizeRedaction(@PathVariable(FILE_ID) String fileId,
+ @PathVariable(ANNOTATION_ID) String annotationId) {
+
+ return convert(manualRedactionService.getResizeRedaction(fileId, annotationId), ManualResizeRedaction.class, new ManualResizeRedactionMapper());
+ }
+
+
@Override
public void deleteAddRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
@PathVariable(ANNOTATION_ID) String annotationId) {
manualRedactionService.deleteAddRedaction(dossierId, fileId, annotationId);
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -147,7 +149,6 @@ public class ManualRedactionController implements ManualRedactionResource {
@PathVariable(ANNOTATION_ID) String annotationId) {
manualRedactionService.deleteRemoveRedaction(dossierId, fileId, annotationId);
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -156,7 +157,6 @@ public class ManualRedactionController implements ManualRedactionResource {
@PathVariable(ANNOTATION_ID) String annotationId) {
manualRedactionService.deleteForceRedaction(dossierId, fileId, annotationId);
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -165,7 +165,6 @@ public class ManualRedactionController implements ManualRedactionResource {
@PathVariable(ANNOTATION_ID) String annotationId) {
manualRedactionService.deleteLegalBasisChange(dossierId, fileId, annotationId);
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -175,7 +174,6 @@ public class ManualRedactionController implements ManualRedactionResource {
@PathVariable(ANNOTATION_ID) String annotationId) {
manualRedactionService.deleteImageRecategorization(dossierId, fileId, annotationId);
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -183,7 +181,14 @@ public class ManualRedactionController implements ManualRedactionResource {
public void deleteComment(@PathVariable(FILE_ID) String fileId, @PathVariable(COMMENT_ID) long commentId) {
manualRedactionService.deleteComment(fileId, commentId);
- // TODO analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
+ }
+
+
+ @Override
+ public void deleteResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId,
+ @PathVariable(ANNOTATION_ID) String annotationId) {
+
+ manualRedactionService.deleteResizeRedaction(dossierId, fileId, annotationId);
}
@@ -194,7 +199,6 @@ public class ManualRedactionController implements ManualRedactionResource {
@RequestBody JSONPrimitive updateStatusRequest) {
manualRedactionService.updateAddRedactionStatus(dossierId, fileId, annotationId, updateStatusRequest.getValue());
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -205,7 +209,6 @@ public class ManualRedactionController implements ManualRedactionResource {
@RequestBody JSONPrimitive updateStatusRequest) {
manualRedactionService.updateRemoveRedactionStatus(dossierId, fileId, annotationId, updateStatusRequest.getValue());
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -216,7 +219,6 @@ public class ManualRedactionController implements ManualRedactionResource {
@RequestBody JSONPrimitive updateStatusRequest) {
manualRedactionService.updateForceRedactionStatus(dossierId, fileId, annotationId, updateStatusRequest.getValue());
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -226,7 +228,6 @@ public class ManualRedactionController implements ManualRedactionResource {
@RequestBody JSONPrimitive updateStatusRequest) {
manualRedactionService.updateLegalBasisChangeStatus(dossierId, fileId, annotationId, updateStatusRequest.getValue());
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -237,7 +238,16 @@ public class ManualRedactionController implements ManualRedactionResource {
@RequestBody JSONPrimitive updateStatusRequest) {
manualRedactionService.updateImageRecategorizationStatus(dossierId, fileId, annotationId, updateStatusRequest.getValue());
- analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
+ }
+
+
+ @Override
+ public void updateResizeRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId,
+ @PathVariable(FILE_ID) String fileId,
+ @PathVariable(ANNOTATION_ID) String annotationId,
+ @RequestBody JSONPrimitive updateStatusRequest) {
+
+ manualRedactionService.updateResizeRedactionStatus(dossierId, fileId, annotationId, updateStatusRequest.getValue());
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/NotificationController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/NotificationController.java
index 1d250ff74..86295f103 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/NotificationController.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/NotificationController.java
@@ -1,7 +1,10 @@
package com.iqser.red.service.peristence.v1.server.controller;
+import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPreferencesPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.model.audit.AddNotificationRequest;
+import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.notification.Notification;
import com.iqser.red.service.persistence.service.v1.api.resources.NotificationResource;
import lombok.RequiredArgsConstructor;
@@ -21,12 +24,25 @@ public class NotificationController implements NotificationResource {
private final NotificationPersistenceService notificationPersistenceService;
+ private final NotificationPreferencesPersistenceService notificationPreferencesPersistenceService;
- public void addNotification(@RequestBody AddNotificationRequest addNotificationRequest) {
-
- notificationPersistenceService.insertNotification(addNotificationRequest);
+ @Override
+ public JSONPrimitive hasNewNotificationsSince(String userId, OffsetDateTime since) {
+ return JSONPrimitive.of(notificationPersistenceService.hasNewNotificationsSince(userId, since));
}
+ public void addNotification(@RequestBody AddNotificationRequest addNotificationRequest) {
+ try {
+ var userPreferences = notificationPreferencesPersistenceService.getNotificationPreferences(addNotificationRequest.getUserId());
+ if (userPreferences.getInAppNotifications().contains(addNotificationRequest.getNotificationType())
+ || userPreferences.getEmailNotifications().contains(addNotificationRequest.getNotificationType())) {
+ notificationPersistenceService.insertNotification(addNotificationRequest);
+ }
+ } catch (NotFoundException e) {
+ notificationPersistenceService.insertNotification(addNotificationRequest);
+ }
+
+ }
public void toggleSeen(@PathVariable(USER_ID_PARAM) String userId, @RequestBody List notificationIds,
@RequestParam(SET_SEEN_PARAM) boolean setSeen) {
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/NotificationPreferencesController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/NotificationPreferencesController.java
new file mode 100644
index 000000000..567e7fdf2
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/NotificationPreferencesController.java
@@ -0,0 +1,31 @@
+package com.iqser.red.service.peristence.v1.server.controller;
+
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPreferencesPersistenceService;
+import com.iqser.red.service.persistence.service.v1.api.model.notification.NotificationPreferences;
+import com.iqser.red.service.persistence.service.v1.api.resources.NotificationPreferencesResource;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.RestController;
+
+import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
+
+@RestController
+@RequiredArgsConstructor
+public class NotificationPreferencesController implements NotificationPreferencesResource {
+
+ private final NotificationPreferencesPersistenceService notificationPreferencesPersistenceService;
+
+ @Override
+ public void setNotificationPreferences(String userId, NotificationPreferences notificationRequest) {
+ notificationPreferencesPersistenceService.setNotificationPreference(userId, notificationRequest);
+ }
+
+ @Override
+ public NotificationPreferences getNotificationPreferences(String userId) {
+ return convert(notificationPreferencesPersistenceService.getNotificationPreferences(userId), NotificationPreferences.class);
+ }
+
+ @Override
+ public void deleteNotificationPreferences(String userId) {
+ notificationPreferencesPersistenceService.deleteNotificationPreferences(userId);
+ }
+}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReanalysisController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReanalysisController.java
index 5456edd86..938efb663 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReanalysisController.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReanalysisController.java
@@ -3,11 +3,15 @@ package com.iqser.red.service.peristence.v1.server.controller;
import com.google.common.collect.Sets;
import com.iqser.red.service.peristence.v1.server.service.FileStatusService;
import com.iqser.red.service.peristence.v1.server.service.IndexingService;
+import com.iqser.red.service.peristence.v1.server.service.ReanalysisRequiredStatusService;
+import com.iqser.red.service.peristence.v1.server.utils.FileModelMapper;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
import com.iqser.red.service.persistence.service.v1.api.resources.ReanalysisResource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -22,6 +26,8 @@ import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
+import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
+
@Slf4j
@RestController
@RequiredArgsConstructor
@@ -32,6 +38,7 @@ public class ReanalysisController implements ReanalysisResource {
private final DictionaryController dictionaryClient;
private final RulesController rulesClient;
private final IndexingService indexingService;
+ private final ReanalysisRequiredStatusService reanalysisRequiredStatusService;
@Override
@@ -97,7 +104,7 @@ public class ReanalysisController implements ReanalysisResource {
fileStatusService.setStatusOcrProcessing(dossierId, fileId);
} else {
FileEntity dossierFile = fileStatusService.getStatus(fileId);
- if (dossierFile.getStatus().equals(FileStatus.DELETED) || dossierFile.getStatus().equals(FileStatus.APPROVED)) {
+ if (dossierFile.getProcessingStatus().equals(ProcessingStatus.DELETED) || dossierFile.getWorkflowStatus().equals(WorkflowStatus.APPROVED)) {
throw new ConflictException("Cannot analyse a deleted/approved file");
}
if (dossierFile.getLastOCRTime() != null) {
@@ -113,8 +120,8 @@ public class ReanalysisController implements ReanalysisResource {
var dossier = dossierPersistenceService.getAndValidateDossier(dossierId);
return fileStatusService.getDossierStatus(dossier.getId())
.stream()
- .filter(fileStatus -> !fileStatus.getStatus().equals(FileStatus.DELETED))
- .filter(fileStatus -> !fileStatus.getStatus().equals(FileStatus.APPROVED))
+ .filter(fileStatus -> !fileStatus.getProcessingStatus().equals(ProcessingStatus.DELETED))
+ .filter(fileStatus -> !fileStatus.getWorkflowStatus().equals(WorkflowStatus.APPROVED))
.collect(Collectors.toList());
}
@@ -133,7 +140,7 @@ public class ReanalysisController implements ReanalysisResource {
var dossierFile = dossierFileOptional.get();
- if (dossierFile.getStatus().equals(FileStatus.DELETED) || dossierFile.getStatus().equals(FileStatus.APPROVED)) {
+ if (dossierFile.getProcessingStatus().equals(ProcessingStatus.DELETED) || dossierFile.getWorkflowStatus().equals(WorkflowStatus.APPROVED)) {
throw new ConflictException("Cannot analyse a deleted/approved file");
}
@@ -146,32 +153,20 @@ public class ReanalysisController implements ReanalysisResource {
private void reanalyseFiles(String dossierId, boolean force, List filesToReanalyse) {
- var dossier = dossierPersistenceService.getAndValidateDossier(dossierId);
- // TODO
- var dictionaryVersion = dictionaryClient.getVersion(dossier.getDossierTemplateId());
- var dossierDictionaryVersion = dictionaryClient.getVersionForDossier(dossierId);
- var rulesVersion = rulesClient.getVersion(dossier.getDossierTemplateId());
+ if (force) {
+ filesToReanalyse.forEach(file -> {
+ fileStatusService.setStatusReprocess(dossierId, file.getId(), 2);
+ });
+ } else {
+ var enhancedAndConvertedFiles = reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convert(
+ fileStatusService.getAllStatuses(), FileModel.class, new FileModelMapper()));
+
+ enhancedAndConvertedFiles.forEach(file -> {
+ fileStatusService.setStatusReprocess(dossierId, file.getId(), 2);
+ });
+ }
- filesToReanalyse.forEach(fileStatus -> {
- if (fileStatus.getStatus().equals(FileStatus.ERROR) || !allManualRedactionsApplied(fileStatus) || !allFileAttributesChangesApplied(fileStatus)
- || fileStatus.getRulesVersion() < rulesVersion || fileStatus.getDictionaryVersion() < dictionaryVersion || fileStatus.getDossierDictionaryVersion() < dossierDictionaryVersion || force) {
- fileStatusService.setStatusReprocess(dossierId, fileStatus.getId(), 1);
- }
- });
}
- private boolean allManualRedactionsApplied(FileEntity fileStatus) {
-
- return fileStatus.getLastManualRedaction() == null || fileStatus.getLastProcessed() == null || fileStatus.getLastProcessed()
- .isAfter(fileStatus.getLastManualRedaction());
- }
-
-
- private boolean allFileAttributesChangesApplied(FileEntity fileStatus) {
-
- return fileStatus.getLastFileAttributeChange() == null || fileStatus.getLastProcessed() == null || fileStatus.getLastProcessed()
- .isAfter(fileStatus.getLastFileAttributeChange());
- }
-
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReportTemplateController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReportTemplateController.java
index 026ba049b..4c2a4586b 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReportTemplateController.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReportTemplateController.java
@@ -1,7 +1,20 @@
package com.iqser.red.service.peristence.v1.server.controller;
+import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity;
+import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService;
@@ -11,17 +24,9 @@ import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.Re
import com.iqser.red.service.persistence.service.v1.api.resources.ReportTemplateResource;
import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist;
import com.iqser.red.storage.commons.service.StorageService;
+
+import lombok.NonNull;
import lombok.RequiredArgsConstructor;
-import org.apache.commons.io.IOUtils;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.UUID;
-
-import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
@RestController
@RequiredArgsConstructor
@@ -33,18 +38,19 @@ public class ReportTemplateController implements ReportTemplateResource {
public ReportTemplate uploadTemplate(@RequestBody ReportTemplateUploadRequest reportTemplateUploadRequest) {
+
List reportTemplates = reportTemplatePersistenceService.findByDossierTemplateId(reportTemplateUploadRequest.getDossierTemplateId());
for (ReportTemplateEntity reportTemplate : reportTemplates) {
- if (reportTemplate.getFileName().equals(reportTemplateUploadRequest.getFileName())) {
+ if (reportTemplate.getFileName().equals(reportTemplateUploadRequest.getFileName()) && reportTemplate.isMultiFileReport() && reportTemplateUploadRequest.isMultiFileReport()
+ || reportTemplate.getFileName().equals(reportTemplateUploadRequest.getFileName()) && !reportTemplate.isMultiFileReport() && !reportTemplateUploadRequest.isMultiFileReport()) {
throw new ConflictException("Template already exists.");
}
}
- String storageId = StorageIdUtils.getReportStorageId(reportTemplateUploadRequest.getDossierTemplateId(), reportTemplateUploadRequest
- .getFileName());
+
+ String storageId = StorageIdUtils.getReportStorageId(reportTemplateUploadRequest.getDossierTemplateId(), reportTemplateUploadRequest.getFileName());
storageService.storeObject(storageId, reportTemplateUploadRequest.getTemplate());
String templateId = UUID.randomUUID().toString();
- reportTemplatePersistenceService.insert(reportTemplateUploadRequest.getDossierTemplateId(), templateId, storageId, reportTemplateUploadRequest
- .getFileName(), reportTemplateUploadRequest.isMultiFileReport(), reportTemplateUploadRequest.isActiveByDefault());
+ reportTemplatePersistenceService.insert(reportTemplateUploadRequest.getDossierTemplateId(), templateId, storageId, reportTemplateUploadRequest.getFileName(), reportTemplateUploadRequest.isActiveByDefault(), reportTemplateUploadRequest.isMultiFileReport());
return convert(reportTemplatePersistenceService.find(templateId), ReportTemplate.class);
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ViewedPagesController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ViewedPagesController.java
index 26b093809..71c017758 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ViewedPagesController.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ViewedPagesController.java
@@ -1,5 +1,7 @@
package com.iqser.red.service.peristence.v1.server.controller;
+import com.iqser.red.service.peristence.v1.server.service.AnalysisFlagsCalculationService;
+import com.iqser.red.service.peristence.v1.server.service.FileStatusService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ViewedPagesPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.ViewedPage;
import com.iqser.red.service.persistence.service.v1.api.resources.ViewedPagesResource;
@@ -17,12 +19,16 @@ import static com.iqser.red.service.persistence.management.v1.processor.utils.Ma
public class ViewedPagesController implements ViewedPagesResource {
private final ViewedPagesPersistenceService viewedPagesPersistenceService;
+ private final FileStatusService fileStatusService;
+ private final AnalysisFlagsCalculationService analysisFlagsCalculationService;
public void addPage(@PathVariable(FILE_ID) String fileId, @PathVariable(ROLE) String role,
@RequestBody Integer page) {
viewedPagesPersistenceService.insertPage(fileId, role, page);
+ var file = fileStatusService.getStatus(fileId);
+ analysisFlagsCalculationService.calculateFlags(file.getDossierId(), fileId);
}
@@ -30,6 +36,8 @@ public class ViewedPagesController implements ViewedPagesResource {
@RequestBody Integer page) {
viewedPagesPersistenceService.removePage(fileId, role, page);
+ var file = fileStatusService.getStatus(fileId);
+ analysisFlagsCalculationService.calculateFlags(file.getDossierId(), fileId);
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/AnalysisFlagsCalculationService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/AnalysisFlagsCalculationService.java
index f074ea574..311fbf9e0 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/AnalysisFlagsCalculationService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/AnalysisFlagsCalculationService.java
@@ -1,33 +1,50 @@
package com.iqser.red.service.peristence.v1.server.service;
+import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ViewedPageEntity;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ViewedPagesPersistenceService;
+import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
+import com.iqser.red.service.redaction.v1.model.RedactionLogEntry;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
-import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
-import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
-import com.iqser.red.service.redaction.v1.model.RedactionLogEntry;
+import java.time.OffsetDateTime;
+import java.util.Map;
+import java.util.stream.Collectors;
-import lombok.RequiredArgsConstructor;
+@Slf4j
@Service
@RequiredArgsConstructor
public class AnalysisFlagsCalculationService {
private final FileStatusPersistenceService fileStatusPersistenceService;
private final RedactionLogService redactionLogService;
+ private final ViewedPagesPersistenceService viewedPagesPersistenceService;
@Async
public void calculateFlags(String dossierId, String fileId) {
+ long startTime = System.currentTimeMillis();
+
+ var file = fileStatusPersistenceService.getStatus(fileId);
var redactionLog = redactionLogService.getRedactionLog(dossierId, fileId, true);
+ var viewedPagesForCurrentReviewer = viewedPagesPersistenceService.findViewedPages(fileId, file.getCurrentReviewer());
+
+ Map viewedPages = viewedPagesForCurrentReviewer.stream().collect(Collectors.toMap(ViewedPageEntity::getPage, ViewedPageEntity::getViewedTime));
+
boolean hasRedactions = false;
boolean hasHints = false;
boolean hasSuggestions = false;
boolean hasImages = false;
+ boolean hasUpdates = false;
boolean hasComments = false;
+
for (RedactionLogEntry entry : redactionLog.getRedactionLogEntry()) {
if (entry.isExcluded()) {
continue;
@@ -35,38 +52,45 @@ public class AnalysisFlagsCalculationService {
String type = getType(entry.getType());
- if (entry.isRedacted() && !entry.isManual() || entry.isManual() && entry.getStatus()
- .equals(AnnotationStatus.APPROVED)) {
+ if (!hasRedactions && (entry.isRedacted() && !entry.isManual() || entry.isManual() && entry.getStatus()
+ .equals(AnnotationStatus.APPROVED))) {
hasRedactions = true;
}
- if (entry.isHint() && !type.equals("false_positive")) {
+ if (!hasHints && entry.isHint() && !type.equals("false_positive")) {
hasHints = true;
}
- if (entry.isHint() && type.equals("image") || entry.isImage()) {
+ if (!hasImages && (type.equals("image") || entry.isImage())) {
hasImages = true;
}
- if (entry.isManual() && entry.getStatus()
- .equals(AnnotationStatus.REQUESTED)) {
+ if (!hasSuggestions && entry.isManual() && entry.getStatus().equals(AnnotationStatus.REQUESTED)) {
hasSuggestions = true;
}
- if (entry.getComments() != null && !entry.getComments().isEmpty()) {
+ if (!hasComments && entry.getComments() != null && !entry.getComments().isEmpty()) {
hasComments = true;
}
- if (hasRedactions && hasHints && hasSuggestions && hasImages && hasComments) {
- break;
+ var lastChange = entry.getChanges().isEmpty() ? null : entry.getChanges().get(entry.getChanges().size() - 1);
+
+ var viewedPage = entry.getPositions().isEmpty() ? null : viewedPages.get(entry.getPositions().get(0).getPage());
+
+ if (lastChange != null && lastChange.getDateTime() != null && viewedPage != null && viewedPage.isBefore(lastChange.getDateTime())) {
+ hasUpdates = true;
}
+
}
- fileStatusPersistenceService.updateFlags(fileId, hasRedactions, hasHints, hasImages, hasSuggestions, hasComments);
+
+ fileStatusPersistenceService.updateFlags(fileId, hasRedactions, hasHints, hasImages, hasSuggestions, hasComments, hasUpdates);
+
+ log.info("Flag Calculations for file: {} took: {}ms", fileId, System.currentTimeMillis() - startTime);
}
- private String getType(String typeId){
+ private String getType(String typeId) {
return typeId.split(":")[0];
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierService.java
index 1b111d0a9..8b8f18b9f 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierService.java
@@ -6,7 +6,6 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.Confl
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -31,7 +30,7 @@ public class DossierService {
if (dossierPersistenceService.findAllDossiers()
.stream()
- .anyMatch(p -> !p.getStatus().equals(DossierStatus.DELETED) && p.getDossierName()
+ .anyMatch(p -> p.getHardDeletedTime() == null && p.getDossierName()
.equals(createOrUpdateDossierRequest.getDossierName()))) {
throw new ConflictException("Dossier with this name already exists");
}
@@ -48,7 +47,7 @@ public class DossierService {
if (dossier.getDossierName()
.equals(dossierRequest.getDossierName()) || dossierPersistenceService.findAllDossiers()
.stream()
- .filter(p -> !p.getStatus().equals(DossierStatus.DELETED) && p.getDossierName()
+ .filter(p -> p.getHardDeletedTime() == null && p.getDossierName()
.equals(dossierRequest.getDossierName()))
.findAny()
.isEmpty()) {
@@ -95,4 +94,7 @@ public class DossierService {
return dossierPersistenceService.findAllDossiers();
}
+ public boolean hasChangesSince(OffsetDateTime since) {
+ return dossierPersistenceService.hasChangesSince(since);
+ }
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierStatsService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierStatsService.java
new file mode 100644
index 000000000..28b9e33cb
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierStatsService.java
@@ -0,0 +1,66 @@
+package com.iqser.red.service.peristence.v1.server.service;
+
+import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
+import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
+import com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStats;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException.DOSSIER_NOT_FOUND_MESSAGE;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class DossierStatsService {
+
+ private final DossierService dossierService;
+ private final FileStatusService fileStatusService;
+
+ public DossierStats getDossierStats(String dossierId) {
+ DossierStats dossierStats = new DossierStats();
+ // get the dossier
+ DossierEntity dossierEntity = dossierService.getDossierById(dossierId);
+ if (dossierEntity.getStatus().equals(DossierStatus.DELETED)) {
+ throw new DossierNotFoundException(String.format(DOSSIER_NOT_FOUND_MESSAGE, dossierId));
+ }
+ dossierStats.setDossierId(dossierId);
+ // get the associated files
+ List files = fileStatusService.getDossierStatus(dossierId);
+ dossierStats.setNumberOfFiles(files.size());
+ dossierStats.setNumberOfAnalysedPages(files.stream().mapToInt(FileEntity::getNumberOfAnalyses).sum());
+ files.stream().filter(FileEntity::isHasRedactions).findAny().ifPresent(
+ (v) -> dossierStats.setHasRedactionsFilePresent(true)
+ );
+ files.stream().filter(FileEntity::isHasHints).filter(f -> !f.isHasRedactions()).findAny().ifPresent(
+ (v) -> dossierStats.setHasHintsNoRedactionsFilePresent(true)
+ );
+ files.stream().filter(FileEntity::isHasSuggestions).findAny().ifPresent(
+ (v) -> dossierStats.setHasSuggestionsFilePresent(true)
+ );
+ files.stream().filter(FileEntity::isHasUpdates).findAny().ifPresent(
+ (v) -> dossierStats.setHasUpdatesFilePresent(true)
+ );
+ files.stream().filter(f -> !f.isHasRedactions())
+ .filter(f -> !f.isHasHints())
+ .filter(f -> !f.isHasSuggestions())
+ .filter(f -> !f.isHasUpdates())
+ .findAny().ifPresent(
+ (v) -> dossierStats.setHasNoFlagsFilePresent(true)
+ );
+ var fileCountPerProcessingStatus = files.stream().collect(Collectors.toMap(FileEntity::getProcessingStatus, e -> 1, Math::addExact));
+ dossierStats.setFileCountPerProcessingStatus(fileCountPerProcessingStatus);
+
+ var fileCountPerWorkflowStatus = files.stream().collect(Collectors.toMap(FileEntity::getWorkflowStatus, e -> 1, Math::addExact));
+ dossierStats.setFileCountPerWorkflowStatus(fileCountPerWorkflowStatus);
+ return dossierStats;
+ }
+
+}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ExcludeFromAnalysisService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ExcludeFromAnalysisService.java
index 9f71aa34b..f471dfea4 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ExcludeFromAnalysisService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ExcludeFromAnalysisService.java
@@ -1,39 +1,26 @@
package com.iqser.red.service.peristence.v1.server.service;
-import com.google.common.collect.Sets;
-import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
-import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;
-import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
-import java.time.OffsetDateTime;
-import java.util.Set;
+import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
+
+import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class ExcludeFromAnalysisService {
- private final static Set VALID_STATES_FOR_EXCLUSION = Sets.newHashSet(FileStatus.UNASSIGNED, FileStatus.UNDER_REVIEW, FileStatus.UNDER_APPROVAL);
private final FileStatusService fileStatusService;
- private final FileManagementStorageService fileManagementStorageService;
- private final CommentPersistenceService commentPersistenceService;
- private final ForceRedactionPersistenceService forceRedactionPersistenceService;
- private final RemoveRedactionPersistenceService removeRedactionPersistenceService;
- private final AddRedactionPersistenceService addRedactionPersistenceService;
- private final FileStatusPersistenceService fileStatusPersistenceService;
public void toggleExclusion(String dossierId, String fileId, boolean excluded) {
var status = fileStatusService.getStatus(fileId);
- OffsetDateTime now = OffsetDateTime.now();
-
- if (!VALID_STATES_FOR_EXCLUSION.contains(status.getStatus())) {
- throw new BadRequestException("Files in status " + status.getStatus() + " cannot be excluded/included");
+ if (WorkflowStatus.APPROVED.equals(status.getWorkflowStatus())) {
+ throw new BadRequestException("File in workflow status " + status.getWorkflowStatus() + " cannot be excluded/included");
}
// toggle status
@@ -43,31 +30,9 @@ public class ExcludeFromAnalysisService {
// if file has been re-enabled - process it
fileStatusService.setStatusFullReprocess(dossierId, fileId, 2);
} else {
- // remove everything related to redaction
- fileManagementStorageService.deleteObject(dossierId, fileId, FileType.REDACTION_LOG);
- fileManagementStorageService.deleteObject(dossierId, fileId, FileType.TEXT);
- fileManagementStorageService.deleteObject(dossierId, fileId, FileType.SECTION_GRID);
-
- // wipe comments
- var comments = commentPersistenceService.findCommentsByFileID(fileId, false);
- comments.forEach((key, value) -> value.forEach(comment ->
- commentPersistenceService.softDelete(comment.getId(), now)));
-
- // wipe force redactions
- var forceRedactions = forceRedactionPersistenceService.findForceRedactions(fileId, false);
- forceRedactions.forEach(f -> forceRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
-
- // wipe add manual redactions
- var addRedactions = addRedactionPersistenceService.findAddRedactions(fileId, false);
- addRedactions.forEach(f -> addRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
-
- // wipe removeRedactions
- var removeRedactions = removeRedactionPersistenceService.findRemoveRedactions(fileId, false);
- removeRedactions.forEach(f -> removeRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
-
- fileStatusPersistenceService.updateHasComments(fileId, false);
-
+ fileStatusService.wipeFileData(dossierId, fileId);
}
}
+
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileService.java
index cf12a7c6f..a52edd699 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileService.java
@@ -13,6 +13,8 @@ import com.iqser.red.service.persistence.service.v1.api.model.annotations.Annota
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.BinaryFileRequest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
+
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -42,6 +44,7 @@ public class FileService {
private final DossierPersistenceService dossierPersistenceService;
private final ImageRecategorizationPersistenceService recategorizationPersistenceService;
private final LegalBasisChangePersistenceService legalBasisChangePersistenceService;
+ private final ResizeRedactionPersistenceService resizeRedactionPersistenceService;
private final IndexingService indexingService;
@@ -53,7 +56,7 @@ public class FileService {
var existingStatus = retrieveStatus(fileId);
if (existingStatus != null) {
- if (existingStatus.getStatus().name().equals(AnnotationStatus.APPROVED.name())) {
+ if (existingStatus.getWorkflowStatus().equals(WorkflowStatus.APPROVED)) {
throw new ConflictException("File already exists in status APPROVED");
}
@@ -81,8 +84,7 @@ public class FileService {
} else {
// the file is new, should create a new status for it.
log.info("File {} has no status yet, creating one and setting to unprocessed.", request.getFilename());
- fileStatusService.createStatus(request.getDossierId(), fileId, request.getUploader(), request.getFilename(), request
- .getData().length);
+ fileStatusService.createStatus(request.getDossierId(), fileId, request.getUploader(), request.getFilename(), 1);
}
return new JSONPrimitive<>(fileId);
}
@@ -128,6 +130,13 @@ public class FileService {
});
});
+ resizeRedactionPersistenceService.findResizeRedactions(fileId, false).forEach(annotation -> {
+ resizeRedactionPersistenceService.softDelete(fileId, annotation.getId().getAnnotationId(), softDeletedTime);
+ commentPersistenceService.findCommentsByAnnotationId(fileId, annotation.getId().getAnnotationId(), false).forEach(comment -> {
+ commentPersistenceService.softDelete(comment.getId(), softDeletedTime);
+ });
+ });
+
legalBasisChangePersistenceService.findLegalBasisChanges(fileId, false).forEach(legalBasisChange -> {
legalBasisChangePersistenceService.softDelete(fileId, legalBasisChange.getId().getAnnotationId(), softDeletedTime);
commentPersistenceService.findCommentsByAnnotationId(fileId, legalBasisChange.getId().getAnnotationId(), false)
@@ -173,6 +182,13 @@ public class FileService {
});
});
+ resizeRedactionPersistenceService.findResizeRedactions(fileId, true).forEach(annotation -> {
+ resizeRedactionPersistenceService.hardDelete(fileId, annotation.getId().getAnnotationId());
+ commentPersistenceService.findCommentsByAnnotationId(fileId, annotation.getId().getAnnotationId(), true).forEach(comment -> {
+ commentPersistenceService.hardDelete(comment.getId());
+ });
+ });
+
}
public void undeleteFile(String dossierTemplateId, String dossierId, String fileId, OffsetDateTime softDeletedTime) {
@@ -220,6 +236,17 @@ public class FileService {
}
});
+ resizeRedactionPersistenceService.findResizeRedactions(fileId, true).forEach(annotation -> {
+ if (annotation.getSoftDeletedTime().equals(softDeletedTime) || annotation.getSoftDeletedTime().isAfter(softDeletedTime)) {
+ resizeRedactionPersistenceService.undelete(fileId, annotation.getId().getAnnotationId());
+ commentPersistenceService.findCommentsByAnnotationId(fileId, annotation.getId().getAnnotationId(), true).forEach(comment -> {
+ if (comment.getSoftDeletedTime().equals(softDeletedTime) || comment.getSoftDeletedTime().isAfter(softDeletedTime)) {
+ commentPersistenceService.undelete(comment.getId());
+ }
+ });
+ }
+ });
+
indexingService.addToIndexingQueue(dossierTemplateId, dossierId, fileId, 2);
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java
index 09733d155..178aad519 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java
@@ -1,7 +1,6 @@
package com.iqser.red.service.peristence.v1.server.service;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
import com.iqser.red.service.redaction.v1.model.AnalyzeResult;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -25,12 +24,11 @@ public class FileStatusProcessingUpdateService {
public void analysisSuccessful(String dossierId, String fileId, AnalyzeResult analyzeResult) {
var dossier = dossierPersistenceService.getAndValidateDossier(dossierId);
- var lastSuccessfulStatus = fileStatusService.getStatus(fileId).getLastSuccessfulStatus();
retryTemplate.execute(retryContext -> {
log.info("Analysis Successful for dossier {} and file {}, Attempt to update status: {}", dossierId, fileId, retryContext
.getRetryCount());
- fileStatusService.setStatusSuccessful(dossierId, fileId, Objects.requireNonNullElse(lastSuccessfulStatus, FileStatus.UNASSIGNED), analyzeResult);
+ fileStatusService.setStatusSuccessful(dossierId, fileId, analyzeResult);
return null;
});
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java
index 75f765246..54e8931b3 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java
@@ -9,9 +9,11 @@ import com.iqser.red.service.peristence.v1.server.controller.RulesController;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.UserNotFoundException;
-import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService;
-import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*;
+import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
import com.iqser.red.service.redaction.v1.model.AnalyzeRequest;
import com.iqser.red.service.redaction.v1.model.AnalyzeResult;
import lombok.RequiredArgsConstructor;
@@ -38,6 +40,16 @@ public class FileStatusService {
private final RulesController rulesController;
private final ManualRedactionProviderService manualRedactionProviderService;
+ private final FileManagementStorageService fileManagementStorageService;
+
+ private final LegalBasisChangePersistenceService legalBasisChangePersistenceService;
+ private final ImageRecategorizationPersistenceService imageRecategorizationPersistenceService;
+ private final CommentPersistenceService commentPersistenceService;
+ private final ForceRedactionPersistenceService forceRedactionPersistenceService;
+ private final RemoveRedactionPersistenceService removeRedactionPersistenceService;
+ private final AddRedactionPersistenceService addRedactionPersistenceService;
+ private final ResizeRedactionPersistenceService resizeRedactionPersistenceService;
+
public List getDossierStatus(String dossierId) {
@@ -59,25 +71,25 @@ public class FileStatusService {
public void setStatusProcessing(String fileId) {
- fileStatusPersistenceService.updateStatus(fileId, FileStatus.PROCESSING);
+ fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.PROCESSING);
}
- public void setStatusSuccessful(String dossierId, String fileId, FileStatus status, AnalyzeResult analyzeResult) {
+ public void setStatusSuccessful(String dossierId, String fileId, AnalyzeResult analyzeResult) {
- fileStatusPersistenceService.updateStatusSuccessful(fileId, analyzeResult.getNumberOfPages(), status, analyzeResult.isHasUpdates(), analyzeResult.getDictionaryVersion(), analyzeResult.getRulesVersion(), analyzeResult.getLegalBasisVersion(), analyzeResult.getDuration(), analyzeResult.getDossierDictionaryVersion(), analyzeResult.getAnalysisVersion());
+ fileStatusPersistenceService.updateWorkflowStatus(fileId, analyzeResult.getNumberOfPages(), analyzeResult.getDictionaryVersion(), analyzeResult.getRulesVersion(), analyzeResult.getLegalBasisVersion(), analyzeResult.getDuration(), analyzeResult.getDossierDictionaryVersion(), analyzeResult.getAnalysisVersion());
}
- public void setStatusSuccessful(String fileId, FileStatus status) {
+ public void setStatusSuccessful(String fileId, WorkflowStatus workflowStatus) {
- fileStatusPersistenceService.updateStatusSuccessful(fileId, status, false);
+ fileStatusPersistenceService.updateWorkflowStatus(fileId, workflowStatus, false);
}
- public void setApprovalStatusSuccessful(String fileId, FileStatus status) {
+ public void setApprovalStatusSuccessful(String fileId, WorkflowStatus workflowStatus) {
- fileStatusPersistenceService.updateStatusSuccessful(fileId, status, true);
+ fileStatusPersistenceService.updateWorkflowStatus(fileId, workflowStatus, true);
}
@@ -108,7 +120,7 @@ public class FileStatusService {
return;
}
- fileStatusPersistenceService.updateStatus(fileId, FileStatus.REPROCESS);
+ fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.REPROCESS);
addToAnalysisQueue(dossierId, fileId, priority, sectionsToReanalyse);
}
@@ -122,7 +134,7 @@ public class FileStatusService {
return;
}
- fileStatusPersistenceService.updateStatus(fileId, FileStatus.OCR_PROCESSING);
+ fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.OCR_PROCESSING);
addToOcrQueue(dossierId, fileId, 2);
}
@@ -137,27 +149,26 @@ public class FileStatusService {
return;
}
- fileStatusPersistenceService.updateStatus(fileId, FileStatus.FULLREPROCESS);
+ fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.FULLREPROCESS);
addToAnalysisQueue(dossierId, fileId, priority, Sets.newHashSet());
}
public void setStatusIndexingSuccessful(String fileId) {
- FileEntity fileStatus = fileStatusPersistenceService.getStatus(fileId);
- fileStatusPersistenceService.setUpdateStatusIndexingSuccessful(fileId, fileStatus.getLastSuccessfulStatus());
+ fileStatusPersistenceService.setUpdateStatusIndexingSuccessful(fileId);
}
public void setStatusIndexing(String fileId) {
- fileStatusPersistenceService.updateStatus(fileId, FileStatus.INDEXING);
+ fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.INDEXING);
}
public void setStatusError(String fileId) {
- fileStatusPersistenceService.updateStatus(fileId, FileStatus.ERROR);
+ fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.ERROR);
}
@@ -175,8 +186,7 @@ public class FileStatusService {
public void setFileStatusUndeleted(String fileId) {
- var status = fileStatusPersistenceService.getStatus(fileId);
- fileStatusPersistenceService.undelete(fileId, status.getLastSuccessfulStatus());
+ fileStatusPersistenceService.undelete(fileId);
}
@@ -212,9 +222,7 @@ public class FileStatusService {
}
var fileAttributes = fileStatus.getFileAttributes();
-
- setStatusProcessing(fileId);
-
+
var analyseRequest = AnalyzeRequest.builder()
.dossierId(dossierId)
.sectionsToReanalyse(sectionsToReanalyse)
@@ -225,16 +233,14 @@ public class FileStatusService {
.fileAttributes(convert(fileAttributes))
.build();
- if (!fileStatus.getStatus().equals(FileStatus.UNPROCESSED) && !fileStatus.getStatus()
- .equals(FileStatus.FULLREPROCESS) && fileStatus.getRulesVersion() == rulesController.getVersion(dossier.getDossierTemplateId()) && (fileStatus.getLastFileAttributeChange() == null || fileStatus.getLastProcessed()
- .isAfter(fileStatus.getLastFileAttributeChange()))) {
- analyseRequest.setReanalyseOnlyIfPossible(true);
- } else {
- analyseRequest.setReanalyseOnlyIfPossible(false);
- }
+ analyseRequest.setReanalyseOnlyIfPossible(!fileStatus.getProcessingStatus().equals(ProcessingStatus.UNPROCESSED) && !fileStatus.getProcessingStatus()
+ .equals(ProcessingStatus.FULLREPROCESS) && fileStatus.getRulesVersion() == rulesController.getVersion(dossier.getDossierTemplateId()) && (fileStatus.getLastFileAttributeChange() == null || fileStatus.getLastProcessed()
+ .isAfter(fileStatus.getLastFileAttributeChange())));
analyseRequest.setExcludedPages(fileStatus.getExcludedPages());
+ setStatusProcessing(fileId);
+
try {
rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_QUEUE, objectMapper.writeValueAsString(analyseRequest), message -> {
message.getMessageProperties().setPriority(priority);
@@ -269,6 +275,7 @@ public class FileStatusService {
public void overwriteFile(String dossierId, String fileId, String uploader, String filename, int length) {
fileStatusPersistenceService.overwriteFile(fileId, uploader, filename);
+ wipeFileData(dossierId,fileId);
setStatusFullReprocess(dossierId, fileId, length);
}
@@ -279,6 +286,47 @@ public class FileStatusService {
}
+
+ public void wipeFileData(String dossierId, String fileId){
+ OffsetDateTime now = OffsetDateTime.now();
+ // remove everything related to redaction
+ fileManagementStorageService.deleteObject(dossierId, fileId, FileType.REDACTION_LOG);
+ fileManagementStorageService.deleteObject(dossierId, fileId, FileType.TEXT);
+ fileManagementStorageService.deleteObject(dossierId, fileId, FileType.SECTION_GRID);
+
+ // wipe comments
+ var comments = commentPersistenceService.findCommentsByFileID(fileId, false);
+ comments.forEach((key, value) -> value.forEach(comment ->
+ commentPersistenceService.softDelete(comment.getId(), now)));
+
+ // wipe force redactions
+ var forceRedactions = forceRedactionPersistenceService.findForceRedactions(fileId, false);
+ forceRedactions.forEach(f -> forceRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
+
+ // wipe add manual redactions
+ var addRedactions = addRedactionPersistenceService.findAddRedactions(fileId, false);
+ addRedactions.forEach(f -> addRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
+
+ // wipe removeRedactions
+ var removeRedactions = removeRedactionPersistenceService.findRemoveRedactions(fileId, false);
+ removeRedactions.forEach(f -> removeRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
+
+ // wipe image recat
+ var imageRecategorizations = imageRecategorizationPersistenceService.findRecategorizations(fileId, false);
+ imageRecategorizations.forEach(f -> imageRecategorizationPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));// wipe image recat
+
+ // wipe resize redactions
+ var resizeRedactions = resizeRedactionPersistenceService.findResizeRedactions(fileId, false);
+ resizeRedactions.forEach(f -> resizeRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
+
+ // wipe legal basis changes
+ var legalBasisChanges = legalBasisChangePersistenceService.findLegalBasisChanges(fileId, false);
+ legalBasisChanges.forEach(f -> legalBasisChangePersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
+
+ fileStatusPersistenceService.updateHasComments(fileId, false);
+ }
+
+
private List convert(
List fileAttributes) {
@@ -297,4 +345,7 @@ public class FileStatusService {
return fileAttributeList;
}
+ public boolean hasChangesSince(String dossierId, OffsetDateTime since) {
+ return fileStatusPersistenceService.hasChangesSince(dossierId,since);
+ }
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/IndexingService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/IndexingService.java
index 3afeea0cc..9979de3af 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/IndexingService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/IndexingService.java
@@ -6,7 +6,7 @@ import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfigu
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
import com.iqser.red.service.search.v1.model.IndexMessage;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -48,7 +48,7 @@ public class IndexingService {
for (Pair reindexDossierId : reindexDossierIds) {
List fileStatuses = fileStatusService.getDossierStatus(reindexDossierId.getRight());
for (FileEntity fileStatus : fileStatuses) {
- if (fileStatus.getStatus().equals(FileStatus.DELETED)) {
+ if (fileStatus.getProcessingStatus().equals(ProcessingStatus.DELETED)) {
continue;
}
if (fileIds != null && !fileIds.isEmpty() && !fileIds.contains(fileStatus.getId())) {
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/LicenseReportService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/LicenseReportService.java
index 1631ef55f..abd567702 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/LicenseReportService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/LicenseReportService.java
@@ -86,13 +86,12 @@ public class LicenseReportService {
reportData.setAddedDate(fileStatus.getAdded().toInstant());
reportData.setLastUpdatedDate(fileStatus.getLastUpdated() == null ? null : fileStatus.getLastUpdated().toInstant());
reportData.setDeletedDate(fileStatus.getDeleted() == null ? null : fileStatus.getDeleted().toInstant());
- reportData.setStatus(fileStatus.getStatus());
+ reportData.setWorkflowStatus(fileStatus.getWorkflowStatus());
reportData.setNumberOfAnalyzedPages(fileStatus.getNumberOfPages());
reportData.setNumberOfOcrPages(fileStatus.getLastOCRTime() != null ? fileStatus.getNumberOfPages() : 0);
reportData.setAnalysisCount(fileStatus.getNumberOfAnalyses());
totalPagesAnalyzed.addAndGet(fileStatus.getNumberOfPages());
totalPagesOcr.addAndGet(fileStatus.getLastOCRTime() != null ? fileStatus.getNumberOfPages() : 0);
- reportData.setStatus(fileStatus.getStatus());
totalNumberOfAnalyses.addAndGet(fileStatus.getNumberOfAnalyses());
return reportData;
}))
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionProviderService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionProviderService.java
index 4facc8599..71aae6410 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionProviderService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionProviderService.java
@@ -1,15 +1,17 @@
package com.iqser.red.service.peristence.v1.server.service;
+import com.iqser.red.service.peristence.v1.server.utils.ManualImageRecategorizationMapper;
+import com.iqser.red.service.peristence.v1.server.utils.ManualRedactionMapper;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.CommentEntity;
+import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import javax.transaction.Transactional;
+import java.util.*;
+import java.util.stream.Collectors;
import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
@@ -23,19 +25,24 @@ public class ManualRedactionProviderService {
private final CommentPersistenceService commentPersistenceService;
private final ImageRecategorizationPersistenceService recategorizationPersistenceService;
private final LegalBasisChangePersistenceService legalBasisChangePersistenceService;
+ private final ResizeRedactionPersistenceService resizeRedactionPersistenceService;
+ @Transactional
public ManualRedactions getManualRedactions(String fileId) {
- Set entriesToAdd = convert(addRedactionPersistenceService.findAddRedactions(fileId, false), ManualRedactionEntry.class);
+
+ Set entriesToAdd = convertEntriesToAdd(addRedactionPersistenceService.findAddRedactions(fileId, false));
Set removals = convert(removeRedactionPersistenceService.findRemoveRedactions(fileId, false), IdRemoval.class);
Set forceRedactions = convert(forceRedactionPersistenceService.findForceRedactions(fileId, false), ManualForceRedaction.class);
- Set recategorizations = convert(recategorizationPersistenceService.findRecategorizations(fileId, false), ManualImageRecategorization.class);
+ Set recategorizations = new HashSet<>(convert(recategorizationPersistenceService.findRecategorizations(fileId, false), ManualImageRecategorization.class, new ManualImageRecategorizationMapper()));
Set legalBasisChanges = convert(legalBasisChangePersistenceService.findLegalBasisChanges(fileId, false), ManualLegalBasisChange.class);
+ Set resizeRedactions = convert(resizeRedactionPersistenceService.findResizeRedactions(fileId, false), ManualResizeRedaction.class);
+
Map> commentEntities = commentPersistenceService.findCommentsByFileID(fileId, false);
Map> comments = new HashMap<>();
@@ -44,7 +51,15 @@ public class ManualRedactionProviderService {
});
- return new ManualRedactions(removals, entriesToAdd, forceRedactions, recategorizations, legalBasisChanges, comments);
+ return new ManualRedactions(removals, entriesToAdd, forceRedactions, recategorizations, legalBasisChanges, resizeRedactions, comments);
+ }
+
+
+ private Set convertEntriesToAdd(Set source) {
+
+ return source.stream().map(entry ->
+ convert(entry, ManualRedactionEntry.class, new ManualRedactionMapper())
+ ).collect(Collectors.toSet());
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java
index 9617e54af..884535e0b 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java
@@ -1,5 +1,6 @@
package com.iqser.red.service.peristence.v1.server.service;
+import com.google.common.collect.Sets;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import com.iqser.red.service.peristence.v1.server.controller.DictionaryController;
@@ -18,6 +19,7 @@ import org.springframework.stereotype.Service;
import java.nio.charset.StandardCharsets;
import java.time.OffsetDateTime;
+import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Optional;
@@ -38,8 +40,11 @@ public class ManualRedactionService {
private final FileManagementStorageService fileManagementStorageService;
private final ImageRecategorizationPersistenceService recategorizationPersistenceService;
private final LegalBasisChangePersistenceService legalBasisChangePersistenceService;
+ private final ResizeRedactionPersistenceService resizeRedactionPersistenceService;
private final FileStatusService fileStatusService;
private final ManualRedactionProviderService manualRedactionProviderService;
+ private final AnalysisFlagsCalculationService analysisFlagsCalculationService;
+ private final StopwordService stopwordService;
private final HashFunction hashFunction = Hashing.murmur3_128();
@@ -50,6 +55,11 @@ public class ManualRedactionService {
if (addRedactionRequest.isAddToDictionary()) {
try {
+
+ if (!addRedactionRequest.isForceAddToDictionary() && stopwordService.isStopword(addRedactionRequest.getValue())) {
+ throw new BadRequestException("The entry you are trying to add is a stopword");
+ }
+
dictionaryController.getDictionaryForType(addRedactionRequest.getTypeId());
} catch (FeignException e) {
if (e.status() == 404) {
@@ -78,6 +88,10 @@ public class ManualRedactionService {
fileStatusPersistenceService.updateLastManualRedaction(fileId, now);
}
+ if (!addRedactionRequest.getPositions().isEmpty()) {
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
+ }
+
return ManualAddResponse.builder().annotationId(annotationId).commentId(commentId).build();
}
@@ -106,6 +120,10 @@ public class ManualRedactionService {
fileStatusPersistenceService.updateLastManualRedaction(fileId, now);
}
+ if (!removeRedactionRequest.isRemoveFromDictionary()) {
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
+ }
+
return ManualAddResponse.builder()
.annotationId(removeRedactionRequest.getAnnotationId())
.commentId(commentId)
@@ -134,6 +152,8 @@ public class ManualRedactionService {
fileStatusPersistenceService.updateLastManualRedaction(fileId, now);
}
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
+
return ManualAddResponse.builder()
.annotationId(forceRedactionRequest.getAnnotationId())
.commentId(commentId)
@@ -162,6 +182,8 @@ public class ManualRedactionService {
fileStatusPersistenceService.updateLastManualRedaction(fileId, now);
}
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
+
return ManualAddResponse.builder()
.annotationId(legalBasisChangeRequest.getAnnotationId())
.commentId(commentId)
@@ -188,9 +210,11 @@ public class ManualRedactionService {
fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, now, true);
} else {
fileStatusPersistenceService.updateLastManualRedaction(fileId, now);
- fileStatusService.setStatusReprocess(dossierId, fileId, 100);
+ fileStatusService.setStatusReprocess(dossierId, fileId, 2);
}
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
+
return ManualAddResponse.builder()
.annotationId(imageRecategorizationRequest.getAnnotationId())
.commentId(commentId)
@@ -203,9 +227,40 @@ public class ManualRedactionService {
var createdComment = addComment(fileId, annotationId, commentRequest.getText(), commentRequest.getUser());
fileStatusPersistenceService.updateLastManualRedaction(fileId, OffsetDateTime.now());
+ fileStatusPersistenceService.updateHasComments(fileId, true);
+
return createdComment;
}
+ public ManualAddResponse addResizeRedaction(String dossierId, String fileId,
+ ResizeRedactionRequest resizeRedactionRequest) {
+
+ dossierPersistenceService.getAndValidateDossier(dossierId);
+
+ OffsetDateTime now = OffsetDateTime.now();
+ resizeRedactionPersistenceService.insert(fileId, resizeRedactionRequest);
+
+ Long commentId = null;
+ if (resizeRedactionRequest.getComment() != null) {
+
+ commentId = addComment(fileId, resizeRedactionRequest.getAnnotationId(), resizeRedactionRequest.getComment(), resizeRedactionRequest
+ .getUser()).getId();
+ }
+
+ if (resizeRedactionRequest.getStatus().equals(AnnotationStatus.REQUESTED)) {
+ fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, now, true);
+ } else {
+ fileStatusPersistenceService.updateLastManualRedaction(fileId, now);
+ }
+
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
+
+ return ManualAddResponse.builder()
+ .annotationId(resizeRedactionRequest.getAnnotationId())
+ .commentId(commentId)
+ .build();
+ }
+
public ManualRedactionEntryEntity getAddRedaction(String fileId, String annotationId) {
@@ -243,6 +298,12 @@ public class ManualRedactionService {
}
+ public ManualResizeRedactionEntity getResizeRedaction(String fileId, String annotationId) {
+
+ return resizeRedactionPersistenceService.findResizeRedaction(fileId, annotationId);
+ }
+
+
public void deleteAddRedaction(String dossierId, String fileId, String annotationId) {
var addRedaction = getAddRedaction(fileId, annotationId);
@@ -259,6 +320,10 @@ public class ManualRedactionService {
} else {
fileStatusPersistenceService.updateLastManualRedaction(fileId, OffsetDateTime.now());
}
+
+ if (!addRedaction.getPositions().isEmpty()) {
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
+ }
}
@@ -278,6 +343,7 @@ public class ManualRedactionService {
} else {
fileStatusPersistenceService.updateLastManualRedaction(fileId, OffsetDateTime.now());
}
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -293,6 +359,7 @@ public class ManualRedactionService {
} else {
fileStatusPersistenceService.updateLastManualRedaction(fileId, OffsetDateTime.now());
}
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -307,6 +374,7 @@ public class ManualRedactionService {
} else {
fileStatusPersistenceService.updateLastManualRedaction(fileId, OffsetDateTime.now());
}
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -321,8 +389,9 @@ public class ManualRedactionService {
fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, OffsetDateTime.now(), hasSuggestions);
} else {
fileStatusPersistenceService.updateLastManualRedaction(fileId, OffsetDateTime.now());
- fileStatusService.setStatusReprocess(dossierId, fileId, 100);
+ fileStatusService.setStatusReprocess(dossierId, fileId, 2);
}
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -333,6 +402,23 @@ public class ManualRedactionService {
// update indicator
fileStatusPersistenceService.updateHasComments(fileId, commentPersistenceService.fileHasComments(fileId));
+
+ }
+
+
+ public void deleteResizeRedaction(String dossierId, String fileId, String annotationId) {
+
+ var resizeRedaction = getResizeRedaction(fileId, annotationId);
+
+ resizeRedactionPersistenceService.softDelete(fileId, annotationId, OffsetDateTime.now());
+
+ if (resizeRedaction.getStatus().equals(AnnotationStatus.REQUESTED)) {
+ boolean hasSuggestions = calculateHasSuggestions(fileId);
+ fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, OffsetDateTime.now(), hasSuggestions);
+ } else {
+ fileStatusPersistenceService.updateLastManualRedaction(fileId, OffsetDateTime.now());
+ }
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -363,7 +449,7 @@ public class ManualRedactionService {
// if it was previously approved, revert the delete
if (idRemoval.getStatus() == AnnotationStatus.APPROVED) {
- addToDictionary(buildTypeId(redactionLogEntry,dossier), redactionLogEntry.getValue(), dossierId, fileId);
+ addToDictionary(buildTypeId(redactionLogEntry, dossier), redactionLogEntry.getValue(), dossierId, fileId);
}
}
}
@@ -372,6 +458,8 @@ public class ManualRedactionService {
boolean hasSuggestions = calculateHasSuggestions(fileId);
fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, OffsetDateTime.now(), hasSuggestions);
+
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
private String buildTypeId(RedactionLogEntry redactionLogEntry, DossierEntity dossier) {
@@ -389,6 +477,7 @@ public class ManualRedactionService {
forceRedactionPersistenceService.updateStatus(fileId, annotationId, annotationStatus);
boolean hasSuggestions = calculateHasSuggestions(fileId);
fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, OffsetDateTime.now(), hasSuggestions);
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -398,28 +487,30 @@ public class ManualRedactionService {
legalBasisChangePersistenceService.updateStatus(fileId, annotationId, annotationStatus);
boolean hasSuggestions = calculateHasSuggestions(fileId);
fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, OffsetDateTime.now(), hasSuggestions);
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
public void updateImageRecategorizationStatus(String dossierId, String fileId, String annotationId,
AnnotationStatus annotationStatus) {
+ ManualImageRecategorizationEntity imageRecategorization = recategorizationPersistenceService.findRecategorization(fileId, annotationId);
if (annotationStatus.equals(AnnotationStatus.DECLINED)) {
- ManualImageRecategorizationEntity imageRecategorization = recategorizationPersistenceService.findRecategorization(fileId, annotationId);
// if it was previously approved, revert the delete
if (imageRecategorization.getStatus() == AnnotationStatus.APPROVED) {
- fileStatusService.setStatusReprocess(dossierId, fileId, 100);
+ fileStatusService.setStatusReprocess(dossierId, fileId, 2);
}
} else if (annotationStatus.equals(AnnotationStatus.APPROVED)) {
- fileStatusService.setStatusReprocess(dossierId, fileId, 100);
+ fileStatusService.setStatusReprocess(dossierId, fileId, 2);
}
dossierPersistenceService.getAndValidateDossier(dossierId);
recategorizationPersistenceService.updateStatus(fileId, annotationId, annotationStatus);
boolean hasSuggestions = calculateHasSuggestions(fileId);
fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, OffsetDateTime.now(), hasSuggestions);
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -444,6 +535,19 @@ public class ManualRedactionService {
boolean hasSuggestions = calculateHasSuggestions(fileId);
fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, OffsetDateTime.now(), hasSuggestions);
+ if (!manualRedactionEntry.getPositions().isEmpty()) {
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
+ }
+ }
+
+
+ public void updateResizeRedactionStatus(String dossierId, String fileId, String annotationId, AnnotationStatus annotationStatus) {
+
+ dossierPersistenceService.getAndValidateDossier(dossierId);
+ resizeRedactionPersistenceService.updateStatus(fileId, annotationId, annotationStatus);
+ boolean hasSuggestions = calculateHasSuggestions(fileId);
+ fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, OffsetDateTime.now(), hasSuggestions);
+ analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
}
@@ -475,7 +579,6 @@ public class ManualRedactionService {
boolean removeFromDictionary, boolean revert) {
-
if (status == AnnotationStatus.APPROVED) {
if (removeFromDictionary) {
@@ -495,9 +598,9 @@ public class ManualRedactionService {
var redactionLogEntry = redactionLogEntryOptional.get();
if (revert) {
- addToDictionary(buildTypeId(redactionLogEntry,dossier), redactionLogEntry.getValue(), dossierId, fileId);
+ addToDictionary(buildTypeId(redactionLogEntry, dossier), redactionLogEntry.getValue(), dossierId, fileId);
} else {
- removeFromDictionary(buildTypeId(redactionLogEntry,dossier), redactionLogEntry.getValue(), dossierId, fileId);
+ removeFromDictionary(buildTypeId(redactionLogEntry, dossier), redactionLogEntry.getValue(), dossierId, fileId);
}
}
removeRedactionPersistenceService.updateStatus(fileId, annotationId, status, removeFromDictionary);
@@ -511,7 +614,7 @@ public class ManualRedactionService {
log.debug("Adding entries for {} / {}", dossierId, fileId);
dictionaryController.addEntries(typeId, List.of(value), false);
- fileStatusService.setStatusReprocess(dossierId, fileId, 100);
+ fileStatusService.setStatusReprocess(dossierId, fileId, 2);
} catch (Exception e) {
throw new BadRequestException(e.getMessage());
}
@@ -523,7 +626,7 @@ public class ManualRedactionService {
try {
log.debug("Deleting entries for {} / {}", dossierId, fileId);
dictionaryController.deleteEntries(typeId, List.of(value));
- fileStatusService.setStatusReprocess(dossierId, fileId, 100);
+ fileStatusService.setStatusReprocess(dossierId, fileId, 2);
} catch (FeignException e) {
throw new BadRequestException(e.getMessage());
}
@@ -538,7 +641,7 @@ public class ManualRedactionService {
.fileId(fileId)
.annotationId(annotationId)
.user(user)
- .date(OffsetDateTime.now())
+ .date(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS))
.build());
fileStatusPersistenceService.updateHasComments(fileId, true);
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ReanalysisRequiredStatusService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ReanalysisRequiredStatusService.java
new file mode 100644
index 000000000..a622e2a35
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ReanalysisRequiredStatusService.java
@@ -0,0 +1,132 @@
+package com.iqser.red.service.peristence.v1.server.service;
+
+import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.LegalBasisMappingPersistenceService;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.iqser.red.service.peristence.v1.server.service.ReanalysisRequiredStatusService.VersionType.*;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class ReanalysisRequiredStatusService {
+
+ private final DictionaryPersistenceService dictionaryPersistenceService;
+ private final RulesPersistenceService rulesPersistenceService;
+ private final DossierPersistenceService dossierPersistenceService;
+ private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService;
+
+
+ public FileModel enhanceFileStatusWithAnalysisRequirements(FileModel fileModel) {
+ return enhanceFileStatusWithAnalysisRequirements(Collections.singletonList(fileModel)).iterator().next();
+ }
+
+ public List enhanceFileStatusWithAnalysisRequirements(List fileModels) {
+
+ Map> dossierTemplateVersionMap = new HashMap<>();
+ Map dossierVersionMap = new HashMap<>();
+ Map dossierMap = new HashMap<>();
+ fileModels.forEach(entry -> entry.setAnalysisRequired(computeAnalysisRequired(entry, dossierTemplateVersionMap, dossierVersionMap, dossierMap)));
+
+ return fileModels;
+ }
+
+ private boolean computeAnalysisRequired(FileModel fileStatus,
+ Map> dossierTemplateVersionMap,
+ Map dossierVersionMap,
+ Map dossierMap) {
+
+ if(ProcessingStatus.ERROR.equals(fileStatus.getProcessingStatus())){
+ return true;
+ }
+
+ if(ProcessingStatus.PROCESSED.equals(fileStatus.getProcessingStatus()) || ProcessingStatus.UNPROCESSED.equals(fileStatus.getProcessingStatus())) {
+
+ switch (fileStatus.getWorkflowStatus()) {
+ case UNASSIGNED:
+ case UNDER_REVIEW:
+ case UNDER_APPROVAL:
+ if (fileStatus.getLastProcessed() == null) {
+ return true;
+ }
+ if (fileStatus.getLastFileAttributeChange() != null && fileStatus.getLastProcessed().isBefore(fileStatus.getLastFileAttributeChange())) {
+ return true;
+ } else {
+ return requiresReanalysisBasedOnVersionDifference(fileStatus, dossierTemplateVersionMap, dossierVersionMap, dossierMap);
+ }
+ default:
+ return false;
+ }
+ }
+ return false;
+
+ }
+
+ private boolean requiresReanalysisBasedOnVersionDifference(FileModel fileStatus,
+ Map> dossierTemplateVersionMap,
+ Map dossierVersionMap,
+ Map dossierMap) {
+
+ // enhance with dossierTemplateId
+ DossierEntity dossier = dossierMap.computeIfAbsent(fileStatus.getDossierId(), k -> dossierPersistenceService.getAndValidateDossier(fileStatus.getDossierId()));
+ fileStatus.setDossierTemplateId(dossier.getDossierTemplateId());
+
+ // get relevant versions
+ var dossierTemplateVersions = dossierTemplateVersionMap.computeIfAbsent(fileStatus.getDossierTemplateId(),
+ k -> buildVersionData(fileStatus.getDossierTemplateId()));
+ var dossierDictionaryVersion = dossierVersionMap.computeIfAbsent(fileStatus.getDossierId(),
+ k -> getDossierVersionData(fileStatus.getDossierId()));
+
+ // compute matches
+ var rulesVersionMatches = fileStatus.getRulesVersion() == dossierTemplateVersions.getOrDefault(RULES, -1L);
+ var dictionaryVersionMatches = fileStatus.getDictionaryVersion() == dossierTemplateVersions.getOrDefault(DICTIONARY, -1L);
+ var legalBasisVersionMatches = fileStatus.getLegalBasisVersion() == dossierTemplateVersions.getOrDefault(LEGAL_BASIS, -1L);
+ var dossierDictionaryVersionMatches = fileStatus.getDossierDictionaryVersion() == dossierDictionaryVersion;
+
+ var analysisRequired = !(rulesVersionMatches && dictionaryVersionMatches && legalBasisVersionMatches && dossierDictionaryVersionMatches);
+
+ if (analysisRequired) {
+ log.info("For file: {} analysis is required because -> ruleVersionMatches: {}/{}, dictionaryVersionMatches: {}/{}, legalBasisVersionMatches: {}/{}, dossierDictionaryVersionMatches: {}/{}",
+ fileStatus.getFilename(), fileStatus.getRulesVersion(), dossierTemplateVersions.getOrDefault(RULES, -1L),
+ fileStatus.getDictionaryVersion(), dossierTemplateVersions.getOrDefault(DICTIONARY, -1L),
+ fileStatus.getLegalBasisVersion(), dossierTemplateVersions.getOrDefault(LEGAL_BASIS, -1L),
+ fileStatus.getDossierDictionaryVersion(), dossierDictionaryVersion);
+ }
+ return analysisRequired;
+
+ }
+
+ private Long getDossierVersionData(String dossierId) {
+ return dictionaryPersistenceService.getVersionForDossier(dossierId);
+ }
+
+ private Map buildVersionData(String dossierTemplateId) {
+
+ var versions = new HashMap();
+
+ versions.put(RULES, rulesPersistenceService.getRules(dossierTemplateId).getVersion());
+ versions.put(DICTIONARY, dictionaryPersistenceService.getVersion(dossierTemplateId));
+ versions.put(LEGAL_BASIS, legalBasisMappingPersistenceService.getVersion(dossierTemplateId));
+
+
+ return versions;
+ }
+
+ public enum VersionType {
+ RULES, DICTIONARY, LEGAL_BASIS
+ }
+
+}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/RedactionLogService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/RedactionLogService.java
index 3df4916a7..dc89fd76f 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/RedactionLogService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/RedactionLogService.java
@@ -1,19 +1,24 @@
package com.iqser.red.service.peristence.v1.server.service;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+
import com.iqser.red.service.peristence.v1.server.client.RedactionClient;
+import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService;
import com.iqser.red.service.redaction.v1.model.RedactionLog;
import com.iqser.red.service.redaction.v1.model.RedactionRequest;
import com.iqser.red.service.redaction.v1.model.SectionGrid;
+
+import feign.FeignException;
import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class RedactionLogService {
private final FileManagementStorageService fileManagementStorageService;
- // private final ManualRedactionService manualRedactionService;
+ private final ManualRedactionProviderService manualRedactionService;
private final RedactionClient redactionClient;
private final DossierPersistenceService dossierPersistenceService;
private final FileStatusService fileStatusService;
@@ -21,18 +26,30 @@ public class RedactionLogService {
public RedactionLog getRedactionLog(String dossierId, String fileId, boolean withManualRedactions) {
+ var fileStatus = fileStatusService.getStatus(fileId);
+
+ if (fileStatus.isExcluded()) {
+ throw new NotFoundException("Excluded files have no redactionLog");
+ }
+
if (withManualRedactions) {
var dossier = dossierPersistenceService.getAndValidateDossier(dossierId);
- // var manualRedactions = manualRedactionService.getManualRedactions(fileId);
- var fileStatus = fileStatusService.getStatus(fileId);
- return redactionClient.getRedactionLog(RedactionRequest.builder()
- .dossierId(dossierId)
- .fileId(fileId)
- // TODO
-// .manualRedactions(manualRedactions)
- .dossierTemplateId(dossier.getDossierTemplateId())
- .excludedPages(fileStatus.getExcludedPages())
- .build());
+ var manualRedactions = manualRedactionService.getManualRedactions(fileId);
+
+ try {
+ return redactionClient.getRedactionLog(RedactionRequest.builder()
+ .dossierId(dossierId)
+ .fileId(fileId)
+ .manualRedactions(manualRedactions)
+ .dossierTemplateId(dossier.getDossierTemplateId())
+ .excludedPages(fileStatus.getExcludedPages())
+ .build());
+ } catch (FeignException e) {
+ if (e.status() == HttpStatus.NOT_FOUND.value()) {
+ throw new NotFoundException(e.getMessage());
+ }
+ throw e;
+ }
} else {
return fileManagementStorageService.getRedactionLog(dossierId, fileId);
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/StopwordService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/StopwordService.java
new file mode 100644
index 000000000..3795f25a0
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/StopwordService.java
@@ -0,0 +1,28 @@
+package com.iqser.red.service.peristence.v1.server.service;
+
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.stereotype.Service;
+
+import com.iqser.red.service.peristence.v1.server.utils.ResourceLoader;
+
+import lombok.RequiredArgsConstructor;
+
+@Service
+@RequiredArgsConstructor
+public class StopwordService {
+ Set stopwords = new HashSet<>();
+
+ @PostConstruct
+ public void init(){
+ stopwords = ResourceLoader.load("files/stopwords.txt");
+ }
+
+ public boolean isStopword(String word){
+ return stopwords.contains(word.toLowerCase(Locale.ROOT));
+ }
+}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadCleanupService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadCleanupService.java
index 810d6d7a9..20b62c902 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadCleanupService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadCleanupService.java
@@ -12,6 +12,7 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.time.OffsetDateTime;
+import java.time.temporal.ChronoUnit;
import java.util.List;
@Slf4j
@@ -27,7 +28,7 @@ public class DownloadCleanupService {
@Scheduled(fixedDelay = 300000, initialDelay = 300000)
public void processDocuments() {
- var now = OffsetDateTime.now();
+ var now = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS);
log.info("Checking for downloads to delete at {}", now);
List downloadStatusList = downloadStatusPersistenceService.getStatus();
downloadStatusList.forEach(downloadStatus -> {
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadMessageReceiver.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadMessageReceiver.java
index d9c8b60d1..2077b900b 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadMessageReceiver.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadMessageReceiver.java
@@ -4,34 +4,20 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration;
import com.iqser.red.service.peristence.v1.server.model.DownloadJob;
-import com.iqser.red.service.peristence.v1.server.service.DossierService;
-import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
-import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity;
-import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity;
-import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService;
-import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue;
-import com.iqser.red.service.redaction.report.v1.api.model.ReportRequestMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
-import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
-import java.util.Comparator;
-import java.util.List;
-import java.util.stream.Collectors;
-
@Slf4j
@Service
@RequiredArgsConstructor
@RabbitListener(queues = MessagingConfiguration.DOWNLOAD_QUEUE)
public class DownloadMessageReceiver {
+ private final DownloadProcessorService downloadProcessorService;
private final ObjectMapper objectMapper;
- private final RabbitTemplate rabbitTemplate;
- private final DownloadStatusPersistenceService downloadStatusPersistenceService;
- private final DossierService dossierService;
@RabbitHandler
@@ -40,39 +26,8 @@ public class DownloadMessageReceiver {
DownloadJob downloadJob = objectMapper.readValue(in, DownloadJob.class);
log.info("Preparing download for userId: {} and storageId: {}", downloadJob.getUserId(), downloadJob.getStorageId());
- DownloadStatusEntity downloadStatus = downloadStatusPersistenceService.getStatus(downloadJob.getStorageId());
- downloadStatusPersistenceService.updateStatus(downloadJob.getStorageId(), DownloadStatusValue.GENERATING);
-
- var dossier = downloadStatus.getFiles().iterator().next().getDossier();
-
-
- List filenameSortedFileIds = downloadStatus.getFiles()
- .stream()
- .sorted(Comparator.comparing(FileEntity::getFilename))
- .map(FileEntity::getId)
- .collect(Collectors.toList());
-
- addReportQueue(ReportRequestMessage.builder()
- .userId(downloadJob.getUserId())
- .downloadId(downloadJob.getStorageId())
- .dossierId(dossier.getId())
- .dossierTemplateId(dossierService.getDossierById(dossier.getId()).getDossierTemplateId())
- .fileIds(filenameSortedFileIds)
- .templateIds(dossier.getReportTemplates().stream().map(ReportTemplateEntity::getTemplateId).collect(Collectors.toSet()))
- .build(), 1);
+ downloadProcessorService.processDownload(downloadJob);
}
- private void addReportQueue(ReportRequestMessage reportRequestMessage, int priority) {
-
- try {
- rabbitTemplate.convertAndSend(MessagingConfiguration.REPORT_QUEUE, objectMapper.writeValueAsString(reportRequestMessage), message -> {
- message.getMessageProperties().setPriority(priority);
- return message;
- });
- } catch (JsonProcessingException e) {
- throw new RuntimeException(e);
- }
- }
-
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java
index 2108e85e8..32db56f7a 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java
@@ -109,6 +109,7 @@ public class DownloadPreparationService {
private void addReports(ReportResultMessage reportResultMessage, FileSystemBackedArchiver fileSystemBackedArchiver) {
long addReportsStart = System.currentTimeMillis();
+
for (StoredFileInformation storedFileInformation : reportResultMessage.getStoredFileInformation()) {
@@ -149,7 +150,7 @@ public class DownloadPreparationService {
private String removeExtension(String fileName) {
var index = fileName.lastIndexOf(".");
if (index > 0) {
- return fileName.substring(index);
+ return fileName.substring(0, index);
} else {
return fileName;
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadProcessorService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadProcessorService.java
new file mode 100644
index 000000000..bc528517b
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadProcessorService.java
@@ -0,0 +1,70 @@
+package com.iqser.red.service.peristence.v1.server.service.download;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration;
+import com.iqser.red.service.peristence.v1.server.model.DownloadJob;
+import com.iqser.red.service.peristence.v1.server.service.DossierService;
+import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
+import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity;
+import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity;
+import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService;
+import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue;
+import com.iqser.red.service.redaction.report.v1.api.model.ReportRequestMessage;
+import lombok.RequiredArgsConstructor;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@RequiredArgsConstructor
+public class DownloadProcessorService {
+
+ private final DownloadStatusPersistenceService downloadStatusPersistenceService;
+ private final DossierService dossierService;
+ private final RabbitTemplate rabbitTemplate;
+ private final ObjectMapper objectMapper;
+
+ @Transactional
+ public void processDownload(DownloadJob downloadJob) {
+
+ DownloadStatusEntity downloadStatus = downloadStatusPersistenceService.getStatus(downloadJob.getStorageId());
+ downloadStatusPersistenceService.updateStatus(downloadJob.getStorageId(), DownloadStatusValue.GENERATING);
+
+ var dossier = downloadStatus.getFiles().iterator().next().getDossier();
+
+ List filenameSortedFileIds = downloadStatus.getFiles()
+ .stream()
+ .sorted(Comparator.comparing(FileEntity::getFilename))
+ .map(FileEntity::getId)
+ .collect(Collectors.toList());
+
+ addReportQueue(ReportRequestMessage.builder()
+ .userId(downloadJob.getUserId())
+ .downloadId(downloadJob.getStorageId())
+ .dossierId(dossier.getId())
+ .dossierTemplateId(dossierService.getDossierById(dossier.getId()).getDossierTemplateId())
+ .fileIds(filenameSortedFileIds)
+ .templateIds(dossier.getReportTemplates().stream().map(ReportTemplateEntity::getTemplateId).collect(Collectors.toSet()))
+ .build(), 1);
+ }
+
+
+ private void addReportQueue(ReportRequestMessage reportRequestMessage, int priority) {
+
+ try {
+ rabbitTemplate.convertAndSend(MessagingConfiguration.REPORT_QUEUE, objectMapper.writeValueAsString(reportRequestMessage), message -> {
+ message.getMessageProperties().setPriority(priority);
+ return message;
+ });
+ } catch (JsonProcessingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+
+}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/scheduler/AutomaticAnalysisScheduler.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/scheduler/AutomaticAnalysisScheduler.java
new file mode 100644
index 000000000..eb3bcb2a4
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/scheduler/AutomaticAnalysisScheduler.java
@@ -0,0 +1,99 @@
+package com.iqser.red.service.peristence.v1.server.service.scheduler;
+
+import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration;
+import com.iqser.red.service.peristence.v1.server.service.FileStatusService;
+import com.iqser.red.service.peristence.v1.server.service.ReanalysisRequiredStatusService;
+import com.iqser.red.service.peristence.v1.server.utils.FileModelMapper;
+import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.amqp.core.AmqpAdmin;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class AutomaticAnalysisScheduler {
+
+ @Value("${persistence-service.automaticAnalysis.pageFactor:500}")
+ private int pageFactor;
+ private final FileStatusService fileStatusService;
+ private final ReanalysisRequiredStatusService reanalysisRequiredStatusService;
+ private final AmqpAdmin amqpAdmin;
+
+
+ @PostConstruct
+ protected void postConstruct() {
+
+ log.info("Automatic Analysis pageFactor: {}", pageFactor);
+ }
+
+
+ @Scheduled(fixedDelay = 10000, initialDelay = 10000)
+ public void checkFilesThatRequireReanalysisAndQueueIfPossible() {
+
+ var redactionQueueInfo = amqpAdmin.getQueueInfo(MessagingConfiguration.REDACTION_QUEUE);
+ if (redactionQueueInfo != null) {
+ log.info("Checking queue status to see if background analysis can happen. Currently {} holds {} elements and has {} consumers", MessagingConfiguration.REDACTION_QUEUE, redactionQueueInfo
+ .getMessageCount(), redactionQueueInfo.getConsumerCount());
+ // only 1 file in queue
+ var consumerCount = redactionQueueInfo.getConsumerCount();
+ if (redactionQueueInfo.getMessageCount() <= consumerCount) {
+ // queue up 5 files
+ var allStatuses = getAllStatuses();
+ var allStatusesIterator = allStatuses.iterator();
+ log.info("Files that require reanalysis: {}", allStatuses.size());
+
+ var worstCaseScenarioQueuedPages = 0;
+
+ while (worstCaseScenarioQueuedPages < pageFactor * consumerCount && allStatusesIterator.hasNext()) {
+ var next = allStatusesIterator.next();
+ // in case the file doesn't have numberOfPages set, we assume an average.
+ worstCaseScenarioQueuedPages += next.getNumberOfPages() <= 0 ? pageFactor : next.getNumberOfPages();
+ log.info("Queued file: {} for automatic analysis!", next.getFilename());
+ fileStatusService.setStatusReprocess(next.getDossierId(), next.getId(), 1);
+ }
+ }
+
+ } else {
+ log.info("Failed to obtain queue info for queue: {}", MessagingConfiguration.REDACTION_QUEUE);
+ }
+ }
+
+
+ private List getAllStatuses() {
+
+ return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convert(fileStatusService.getAllStatuses()
+ .stream()
+ .filter(f -> !f.getProcessingStatus().equals(ProcessingStatus.DELETED))
+ .filter(f -> !f.getWorkflowStatus().equals(WorkflowStatus.APPROVED))
+ .filter(f -> !isProcessing(f))
+ .collect(Collectors.toList()), FileModel.class, new FileModelMapper()))
+ .stream()
+ .filter(FileModel::isAnalysisRequired)
+ .collect(Collectors.toList());
+ }
+
+
+ private boolean isProcessing(FileEntity file) {
+
+ return !file.getProcessingStatus().equals(ProcessingStatus.PROCESSED) && !file.getProcessingStatus()
+ .equals(ProcessingStatus.UNPROCESSED) && !file.getProcessingStatus()
+ .equals(ProcessingStatus.DELETED) && !file.getProcessingStatus().equals(ProcessingStatus.ERROR);
+ }
+
+}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/scheduler/DeletedFilesCleanupService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/scheduler/DeletedFilesCleanupService.java
new file mode 100644
index 000000000..54c433bb9
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/scheduler/DeletedFilesCleanupService.java
@@ -0,0 +1,56 @@
+package com.iqser.red.service.peristence.v1.server.service.scheduler;
+
+import java.time.OffsetDateTime;
+import java.util.List;
+
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import com.iqser.red.service.peristence.v1.server.service.DossierService;
+import com.iqser.red.service.peristence.v1.server.service.FileService;
+import com.iqser.red.service.peristence.v1.server.service.FileStatusService;
+import com.iqser.red.service.peristence.v1.server.settings.FileManagementServiceSettings;
+import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
+import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class DeletedFilesCleanupService {
+
+ private final DossierService dossierService;
+ private final FileStatusService fileStatusService;
+ private final FileService fileService;
+ private final FileManagementServiceSettings settings;
+
+
+ @Scheduled(fixedDelay = 300000, initialDelay = 300000)
+ public void timedDeletion() {
+
+ var now = OffsetDateTime.now();
+ List dossiers = dossierService.getAllDossiers();
+
+ for (DossierEntity dossierEntity : dossiers) {
+ if (dossierEntity.getSoftDeletedTime() != null && dossierEntity.getHardDeletedTime() == null) {
+ if (dossierEntity.getSoftDeletedTime().isBefore(now.minusHours(settings.getSoftDeleteCleanupTime()))) {
+ dossierService.hardDeleteDossier(dossierEntity.getId());
+ log.info("Hard deleted dossier with dossier id {} ", dossierEntity.getId());
+ }
+ } else {
+ var fileEntities = fileStatusService.getDossierStatus(dossierEntity.getId());
+ for (FileEntity fileEntity : fileEntities) {
+ if (fileEntity.getHardDeletedTime() == null && fileEntity.getDeleted() != null && fileEntity.getDeleted()
+ .isBefore(now.minusHours(settings.getSoftDeleteCleanupTime()))) {
+ fileService.hardDeleteFile(dossierEntity.getId(), fileEntity.getId());
+ fileStatusService.setFileStatusHardDeleted(fileEntity.getId());
+ log.info("Hard deleted file with dossier id {} and file id {}", dossierEntity.getId(), fileEntity.getId());
+ }
+ }
+ }
+ }
+ }
+
+}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/settings/FileManagementServiceSettings.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/settings/FileManagementServiceSettings.java
index 6608279ed..36b550f39 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/settings/FileManagementServiceSettings.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/settings/FileManagementServiceSettings.java
@@ -17,5 +17,6 @@ public class FileManagementServiceSettings {
private int downloadCleanupDownloadFilesHours = 8;
private int downloadCleanupNotDownloadFilesHours = 72;
+ private int softDeleteCleanupTime = 96;
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileSystemBackedArchiver.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileSystemBackedArchiver.java
index 2d75360cc..63ececd41 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileSystemBackedArchiver.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileSystemBackedArchiver.java
@@ -6,6 +6,7 @@ import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
+import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFilePermission;
@@ -17,17 +18,27 @@ import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
+import org.apache.commons.lang3.SystemUtils;
+
@Slf4j
public class FileSystemBackedArchiver implements AutoCloseable {
- private Set createdFolders = new HashSet<>();
- private File tempFile;
- private ZipOutputStream zipOutputStream;
+ private final Set createdFolders = new HashSet<>();
+ private final File tempFile;
+ private final ZipOutputStream zipOutputStream;
@SneakyThrows
public FileSystemBackedArchiver() {
- FileAttribute> attr = PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------"));
- tempFile = Files.createTempFile("archive", ".zip", attr).toFile();
+ if(SystemUtils.IS_OS_UNIX) {
+ FileAttribute> attr = PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------"));
+ tempFile = Files.createTempFile("archive", ".zip", attr).toFile();
+ } else {
+ tempFile = Files.createTempFile("archive", ".zip").toFile();
+ tempFile.setReadable(true, true);
+ tempFile.setWritable(true, true);
+ tempFile.setExecutable(true, true);
+ }
+
zipOutputStream = new ZipOutputStream(new FileOutputStream(tempFile));
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualRedactionMapper.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualRedactionMapper.java
index 0d2044f81..76f00ce9e 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualRedactionMapper.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualRedactionMapper.java
@@ -2,14 +2,18 @@ package com.iqser.red.service.peristence.v1.server.utils;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualRedactionEntry;
+import com.iqser.red.service.persistence.service.v1.api.model.annotations.Rectangle;
import java.util.function.BiConsumer;
+import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
+
public class ManualRedactionMapper implements BiConsumer {
@Override
public void accept(ManualRedactionEntryEntity manualRedactionEntryEntity, ManualRedactionEntry manualRedactionEntry) {
manualRedactionEntry.setType(manualRedactionEntryEntity.getTypeId().substring(0, manualRedactionEntryEntity.getTypeId().indexOf(":")));
+ manualRedactionEntry.setPositions(convert(manualRedactionEntryEntity.getPositions(), Rectangle.class));
}
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualResizeRedactionMapper.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualResizeRedactionMapper.java
new file mode 100644
index 000000000..88f21b0b0
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualResizeRedactionMapper.java
@@ -0,0 +1,19 @@
+package com.iqser.red.service.peristence.v1.server.utils;
+
+import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
+
+import java.util.function.BiConsumer;
+
+import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualResizeRedactionEntity;
+import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualResizeRedaction;
+import com.iqser.red.service.persistence.service.v1.api.model.annotations.Rectangle;
+
+public class ManualResizeRedactionMapper implements BiConsumer {
+
+ @Override
+ public void accept(ManualResizeRedactionEntity manualResizeRedactionEntity, ManualResizeRedaction manualRedaction) {
+
+ manualRedaction.setPositions(convert(manualResizeRedactionEntity.getPositions(), Rectangle.class));
+ }
+
+}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ResourceLoader.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ResourceLoader.java
new file mode 100644
index 000000000..3db0aa0b0
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ResourceLoader.java
@@ -0,0 +1,31 @@
+package com.iqser.red.service.peristence.v1.server.utils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public class ResourceLoader {
+
+ public Set load(String classpathPath) {
+
+ URL resource = ResourceLoader.class.getClassLoader().getResource(classpathPath);
+ if (resource == null) {
+ throw new IllegalArgumentException("could not load classpath resource: " + classpathPath);
+ }
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(resource.openStream(), StandardCharsets.UTF_8))) {
+ return br.lines().collect(Collectors.toSet());
+ } catch (IOException e) {
+ throw new IllegalArgumentException("could not load classpath resource: " + classpathPath, e);
+ }
+
+ }
+
+}
+
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml
index 4ddc12234..28b4b5734 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml
@@ -60,4 +60,5 @@ storage:
bucket-name: 'redaction'
region: 'us-east-1'
endpoint: 'https://s3.amazonaws.com'
+ backend: 's3'
diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/files/stopwords.txt b/persistence-service-v1/persistence-service-server-v1/src/main/resources/files/stopwords.txt
new file mode 100644
index 000000000..d21c2cca1
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/files/stopwords.txt
@@ -0,0 +1,665 @@
+a
+able
+about
+above
+abst
+accordance
+according
+accordingly
+across
+act
+actually
+added
+adj
+affected
+affecting
+affects
+after
+afterwards
+again
+against
+ah
+all
+almost
+alone
+along
+already
+also
+although
+always
+am
+among
+amongst
+an
+and
+announce
+another
+any
+anybody
+anyhow
+anymore
+anyone
+anything
+anyway
+anyways
+anywhere
+apparently
+approximately
+are
+aren
+arent
+arise
+around
+as
+aside
+ask
+asking
+at
+auth
+available
+away
+awfully
+b
+back
+be
+became
+because
+become
+becomes
+becoming
+been
+before
+beforehand
+begin
+beginning
+beginnings
+begins
+behind
+being
+believe
+below
+beside
+besides
+between
+beyond
+biol
+both
+brief
+briefly
+but
+by
+c
+ca
+came
+can
+cannot
+can't
+cause
+causes
+certain
+certainly
+co
+com
+come
+comes
+contain
+containing
+contains
+could
+couldnt
+d
+date
+did
+didn't
+different
+do
+does
+doesn't
+doing
+done
+don't
+down
+downwards
+due
+during
+e
+each
+ed
+edu
+effect
+eg
+eight
+eighty
+either
+else
+elsewhere
+end
+ending
+enough
+especially
+et
+et-al
+etc
+even
+ever
+every
+everybody
+everyone
+everything
+everywhere
+ex
+except
+f
+far
+few
+ff
+fifth
+first
+five
+fix
+followed
+following
+follows
+for
+former
+formerly
+forth
+found
+four
+from
+further
+furthermore
+g
+gave
+get
+gets
+getting
+give
+given
+gives
+giving
+go
+goes
+gone
+got
+gotten
+h
+had
+happens
+hardly
+has
+hasn't
+have
+haven't
+having
+he
+hed
+hence
+her
+here
+hereafter
+hereby
+herein
+heres
+hereupon
+hers
+herself
+hes
+hi
+hid
+him
+himself
+his
+hither
+home
+how
+howbeit
+however
+hundred
+i
+id
+ie
+if
+i'll
+im
+immediate
+immediately
+importance
+important
+in
+inc
+indeed
+index
+information
+instead
+into
+invention
+inward
+is
+isn't
+it
+itd
+it'll
+its
+itself
+i've
+j
+just
+k
+keep keeps
+kept
+kg
+km
+know
+known
+knows
+l
+largely
+last
+lately
+later
+latter
+latterly
+least
+less
+lest
+let
+lets
+like
+liked
+likely
+line
+little
+'ll
+look
+looking
+looks
+ltd
+m
+made
+mainly
+make
+makes
+many
+may
+maybe
+me
+mean
+means
+meantime
+meanwhile
+merely
+mg
+might
+million
+miss
+ml
+more
+moreover
+most
+mostly
+mr
+mrs
+much
+mug
+must
+my
+myself
+n
+na
+name
+namely
+nay
+nd
+near
+nearly
+necessarily
+necessary
+need
+needs
+neither
+never
+nevertheless
+new
+next
+nine
+ninety
+no
+nobody
+non
+none
+nonetheless
+noone
+nor
+normally
+nos
+not
+noted
+nothing
+now
+nowhere
+o
+obtain
+obtained
+obviously
+of
+off
+often
+oh
+ok
+okay
+old
+omitted
+on
+once
+one
+ones
+only
+onto
+or
+ord
+other
+others
+otherwise
+ought
+our
+ours
+ourselves
+out
+outside
+over
+overall
+owing
+own
+p
+page
+pages
+part
+particular
+particularly
+past
+per
+perhaps
+placed
+please
+plus
+poorly
+possible
+possibly
+potentially
+pp
+predominantly
+present
+previously
+primarily
+probably
+promptly
+proud
+provides
+put
+q
+que
+quickly
+quite
+qv
+r
+ran
+rather
+rd
+re
+readily
+really
+recent
+recently
+ref
+refs
+regarding
+regardless
+regards
+related
+relatively
+research
+respectively
+resulted
+resulting
+results
+right
+run
+s
+said
+same
+saw
+say
+saying
+says
+sec
+section
+see
+seeing
+seem
+seemed
+seeming
+seems
+seen
+self
+selves
+sent
+seven
+several
+shall
+she
+shed
+she'll
+shes
+should
+shouldn't
+show
+showed
+shown
+showns
+shows
+significant
+significantly
+similar
+similarly
+since
+six
+slightly
+so
+some
+somebody
+somehow
+someone
+somethan
+something
+sometime
+sometimes
+somewhat
+somewhere
+soon
+sorry
+specifically
+specified
+specify
+specifying
+still
+stop
+strongly
+sub
+substantially
+successfully
+such
+sufficiently
+suggest
+sup
+sure t
+take
+taken
+taking
+tell
+tends
+th
+than
+thank
+thanks
+thanx
+that
+that'll
+thats
+that've
+the
+their
+theirs
+them
+themselves
+then
+thence
+there
+thereafter
+thereby
+thered
+therefore
+therein
+there'll
+thereof
+therere
+theres
+thereto
+thereupon
+there've
+these
+they
+theyd
+they'll
+theyre
+they've
+think
+this
+those
+thou
+though
+thoughh
+thousand
+throug
+through
+throughout
+thru
+thus
+til
+tip
+to
+together
+too
+took
+toward
+towards
+tried
+tries
+truly
+try
+trying
+ts
+twice
+two
+u
+un
+under
+unfortunately
+unless
+unlike
+unlikely
+until
+unto
+up
+upon
+ups
+us
+use
+used
+useful
+usefully
+usefulness
+uses
+using
+usually
+v
+value
+various
+'ve
+very
+via
+viz
+vol
+vols
+vs
+w
+want
+wants
+was
+wasnt
+way
+we
+wed
+welcome
+we'll
+went
+were
+werent
+we've
+what
+whatever
+what'll
+whats
+when
+whence
+whenever
+where
+whereafter
+whereas
+whereby
+wherein
+wheres
+whereupon
+wherever
+whether
+which
+while
+whim
+whither
+who
+whod
+whoever
+whole
+who'll
+whom
+whomever
+whos
+whose
+why
+widely
+willing
+wish
+with
+within
+without
+wont
+words
+world
+would
+wouldnt
+www
+x
+y
+yes
+yet
+you
+youd
+you'll
+your
+youre
+yours
+yourself
+yourselves
+you've
+z
+zero
\ No newline at end of file
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierStatsClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierStatsClient.java
new file mode 100644
index 000000000..29f6de325
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierStatsClient.java
@@ -0,0 +1,8 @@
+package com.iqser.red.service.peristence.v1.server.integration.client;
+
+import com.iqser.red.service.persistence.service.v1.api.resources.DossierStatsResource;
+import org.springframework.cloud.openfeign.FeignClient;
+
+@FeignClient(name = "DossierStats", url = "http://localhost:${server.port}")
+public interface DossierStatsClient extends DossierStatsResource {
+}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/NotificationPreferencesClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/NotificationPreferencesClient.java
new file mode 100644
index 000000000..c137e1a5c
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/NotificationPreferencesClient.java
@@ -0,0 +1,8 @@
+package com.iqser.red.service.peristence.v1.server.integration.client;
+
+import com.iqser.red.service.persistence.service.v1.api.resources.NotificationPreferencesResource;
+import org.springframework.cloud.openfeign.FeignClient;
+
+@FeignClient(name = "NotificationPreferencesClient", url = "http://localhost:${server.port}")
+public interface NotificationPreferencesClient extends NotificationPreferencesResource {
+}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTemplateTesterAndProvider.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTemplateTesterAndProvider.java
index 0ffb8d824..ba6f4ad77 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTemplateTesterAndProvider.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTemplateTesterAndProvider.java
@@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.OffsetDateTime;
+import java.time.temporal.ChronoUnit;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
@@ -20,15 +21,12 @@ public class DossierTemplateTesterAndProvider {
public DossierTemplate provideTestTemplate() {
CreateOrUpdateDossierTemplateRequest cru = new CreateOrUpdateDossierTemplateRequest();
- cru.setCreatedBy("1");
- cru.setDateAdded(OffsetDateTime.now());
- cru.setDateModified(OffsetDateTime.now());
cru.setDownloadFileTypes(Sets.newHashSet(DownloadFileType.ORIGINAL));
cru.setName("Template 1");
cru.setDescription("Template 1");
cru.setRequestingUser("1");
- cru.setValidFrom(OffsetDateTime.now());
- cru.setValidTo(OffsetDateTime.now());
+ cru.setValidFrom(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
+ cru.setValidTo(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
DossierTemplate result = dossierTemplateClient.createOrUpdateDossierTemplate(cru);
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java
index 0d4f7d80e..77d67b450 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java
@@ -6,10 +6,13 @@ import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.Do
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier;
+import org.assertj.core.api.AssertionsForClassTypes;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.OffsetDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
@@ -23,24 +26,28 @@ public class DossierTesterAndProvider {
private DossierClient dossierClient;
public Dossier provideTestDossier(DossierTemplate testTemplate) {
+ return provideTestDossier(testTemplate, "Dossier1");
+ }
+ public Dossier provideTestDossier(DossierTemplate testTemplate, String dossierName) {
CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest();
cru.setDownloadFileTypes(Sets.newHashSet(DownloadFileType.ORIGINAL));
- cru.setDossierName("Dossier 1");
- cru.setDescription("Dossier 1");
+ cru.setDossierName(dossierName);
+ cru.setDescription(dossierName);
cru.setWatermarkEnabled(true);
cru.setMemberIds(Sets.newHashSet("1"));
cru.setOwnerId("1");
cru.setApproverIds(Sets.newHashSet("1"));
cru.setRequestingUser("1");
- cru.setDueDate(OffsetDateTime.now());
+ cru.setDueDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
cru.setDossierTemplateId(testTemplate.getId());
+ cru.setReportTemplateIds(List.of("reportTemplate1", "reportTemplate2"));
Dossier result = dossierClient.addDossier(cru);
- assertThat(result.getDossierName()).isEqualTo("Dossier 1");
+ assertThat(result.getDossierName()).isEqualTo(dossierName);
- Dossier loadedDossier = dossierClient.getDossierById(result.getId());
+ Dossier loadedDossier = dossierClient.getDossierById(result.getId(),false);
assertThat(loadedDossier).isEqualTo(result);
@@ -51,8 +58,16 @@ public class DossierTesterAndProvider {
var testTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
- return provideTestDossier(testTemplate);
+ return provideTestDossier(testTemplate, "Dossier1");
+ }
+
+ public Dossier provideTestDossier(String filename) {
+
+ var testTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
+
+ return provideTestDossier(testTemplate, filename);
}
+
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/FileTesterAndProvider.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/FileTesterAndProvider.java
index b57a2ff23..b7a656743 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/FileTesterAndProvider.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/FileTesterAndProvider.java
@@ -42,15 +42,22 @@ public class FileTesterAndProvider {
@SneakyThrows
public FileModel testAndProvideFile(Dossier dossier) {
+ return testAndProvideFile(dossier, "test.pdf");
+ }
- BinaryFileRequest upload = new BinaryFileRequest("test".getBytes(StandardCharsets.UTF_8), "test.pdf", dossier.getId(), "1");
+
+ @SneakyThrows
+ public FileModel testAndProvideFile(Dossier dossier, String fileName) {
+
+
+ BinaryFileRequest upload = new BinaryFileRequest("test".getBytes(StandardCharsets.UTF_8), fileName, dossier.getId(), "1");
JSONPrimitive uploadResult = uploadClient.upload(upload);
var file = fileClient.getFileStatus(dossier.getId(), uploadResult.getValue());
assertThat(file.getId()).isNotBlank();
- assertThat(fileClient.getDossierStatus(dossier.getId()).size()).isEqualTo(1);
+ assertThat(fileClient.getDossierStatus(dossier.getId()).size()).isGreaterThanOrEqualTo(1);
fileManagementStorageService.storeObject(dossier.getId(), file.getId(), FileType.REDACTION_LOG, objectMapper.writeValueAsBytes(new RedactionLog(1, List.of(RedactionLogEntry.builder().id("annotationId").type("manual").value("value").build()),
null, 0, 0, 0, 0)));
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AuditTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AuditTest.java
index 383e25792..06f6b5aa6 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AuditTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AuditTest.java
@@ -39,5 +39,8 @@ public class AuditTest extends AbstractPersistenceServerServiceTest {
var result = auditClient.search(AuditSearchRequest.builder().category("c1").page(0).pageSize(10).build());
assertThat(result.getTotalHits()).isEqualTo(2);
+ result = auditClient.search(AuditSearchRequest.builder().build());
+ assertThat(result.getTotalHits()).isEqualTo(3);
+
}
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatsTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatsTest.java
new file mode 100644
index 000000000..9713fa4c2
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatsTest.java
@@ -0,0 +1,120 @@
+package com.iqser.red.service.peristence.v1.server.integration.tests;
+
+import com.iqser.red.service.peristence.v1.server.integration.client.DossierStatsClient;
+import com.iqser.red.service.peristence.v1.server.integration.client.FileClient;
+import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider;
+import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider;
+import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider;
+import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStats;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class DossierStatsTest extends AbstractPersistenceServerServiceTest {
+
+ private static final int NUMBER_PAGES_ANALYZED = 5;
+ @Autowired
+ private DossierTemplateTesterAndProvider dossierTemplateTesterAndProvider;
+
+ @Autowired
+ private DossierTesterAndProvider dossierTesterAndProvider;
+
+ @Autowired
+ private FileTesterAndProvider fileTesterAndProvider;
+
+ @Autowired
+ private FileClient fileClient;
+
+ @Autowired
+ private DossierStatsClient dossierStatsClient;
+
+ private Dossier dossier1;
+ private Dossier dossier2;
+
+
+ @Before
+ public void setupData() {
+ var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
+ dossier1 = dossierTesterAndProvider.provideTestDossier(dossierTemplate);
+ //provides 2 files
+ var file1 = fileTesterAndProvider.testAndProvideFile(dossier1, "file1");
+ var file2 = fileTesterAndProvider.testAndProvideFile(dossier1, "file2");
+
+ assertThat(fileClient.getAllStatuses().size()).isEqualTo(2);
+ // alter file 1
+ var loadedFile1 = fileClient.getFileStatus(dossier1.getId(), file1.getId());
+ assertThat(loadedFile1.isHasRedactions()).isFalse();
+ fileRepository.findById(file1.getId()).ifPresent((file) -> {
+ file.setNumberOfAnalyses(NUMBER_PAGES_ANALYZED);
+ file.setHasRedactions(true);
+ file.setHasHints(true);
+ file.setHasUpdates(true);
+ fileRepository.save(file);
+ });
+ loadedFile1 = fileClient.getFileStatus(dossier1.getId(), file1.getId());
+ assertThat(loadedFile1.isHasRedactions()).isTrue();
+
+ // alter file 2
+ fileRepository.findById(file2.getId()).ifPresent((file) -> {
+ file.setHasSuggestions(true);
+ fileRepository.save(file);
+ });
+
+ // second dossier
+ dossier2 = dossierTesterAndProvider.provideTestDossier(dossierTemplate, "Dossier2");
+ var file3 = fileTesterAndProvider.testAndProvideFile(dossier2, "file3");
+ var file4 = fileTesterAndProvider.testAndProvideFile(dossier2, "file4");
+
+ //alter file 4
+ fileRepository.findById(file4.getId()).ifPresent((file) -> {
+ file.setHasHints(true);
+ file.setWorkflowStatus(WorkflowStatus.APPROVED);
+ fileRepository.save(file);
+ });
+ }
+
+ @Test
+ public void testDossierStatsWithOneDossierId() {
+ DossierStats dossierStats = dossierStatsClient.getDossierStats(dossier1.getId());
+ assertThat(dossierStats.getDossierId()).isEqualTo(dossier1.getId());
+ assertThat(dossierStats.getNumberOfFiles()).isEqualTo(2);
+ assertThat(dossierStats.getNumberOfAnalysedPages()).isEqualTo(NUMBER_PAGES_ANALYZED);
+ assertThat(dossierStats.isHasRedactionsFilePresent()).isTrue();
+ assertThat(dossierStats.isHasHintsNoRedactionsFilePresent()).isFalse();
+ assertThat(dossierStats.isHasSuggestionsFilePresent()).isTrue();
+ assertThat(dossierStats.isHasUpdatesFilePresent()).isTrue();
+ assertThat(dossierStats.isHasNoFlagsFilePresent()).isFalse();
+ assertThat(dossierStats.getFileCountPerProcessingStatus().get(ProcessingStatus.PROCESSING)).isEqualTo(2);
+ }
+
+ @Test
+ public void testDossierStatsWithMoreDossierIds() {
+ Set dossierIds = new HashSet<>();
+ dossierIds.add(dossier1.getId());
+ dossierIds.add(dossier2.getId());
+
+ List dossierStatsList = dossierStatsClient.getDossierStats(dossierIds);
+
+ // get the result for dossier2
+ DossierStats dossierStats = dossierStatsList.stream().filter(d -> d.getDossierId().equals(dossier2.getId())).findAny().get();
+ assertThat(dossierStats.getNumberOfFiles()).isEqualTo(2);
+ assertThat(dossierStats.getNumberOfAnalysedPages()).isEqualTo(0);
+ assertThat(dossierStats.isHasRedactionsFilePresent()).isFalse();
+ assertThat(dossierStats.isHasHintsNoRedactionsFilePresent()).isTrue();
+ assertThat(dossierStats.isHasSuggestionsFilePresent()).isFalse();
+ assertThat(dossierStats.isHasUpdatesFilePresent()).isFalse();
+ assertThat(dossierStats.isHasNoFlagsFilePresent()).isTrue();
+ assertThat(dossierStats.getFileCountPerWorkflowStatus().get(WorkflowStatus.UNASSIGNED)).isEqualTo(1);
+ assertThat(dossierStats.getFileCountPerWorkflowStatus().get(WorkflowStatus.APPROVED)).isEqualTo(1);
+ }
+}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java
index 09fc5ce53..48bcc1d2e 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java
@@ -4,6 +4,7 @@ import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemp
import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest;
+import feign.FeignException;
import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -21,9 +22,13 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest {
@Test
public void testDossierTemplate() {
-
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
+ try {
+ dossierTemplateTesterAndProvider.provideTestTemplate();
+ } catch (FeignException e) {
+ assertThat(e.status()).isEqualTo(409);
+ }
var allTemplates = dossierTemplateClient.getAllDossierTemplates();
assertThat(allTemplates.size()).isEqualTo(1);
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java
index d3cfb8953..ce9b49306 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java
@@ -1,15 +1,19 @@
package com.iqser.red.service.peristence.v1.server.integration.tests;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import org.junit.Test;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
import com.google.common.collect.Sets;
import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient;
import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
-import org.junit.Test;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import static org.assertj.core.api.Assertions.assertThat;
+import feign.FeignException;
public class DossierTest extends AbstractPersistenceServerServiceTest {
@@ -28,7 +32,6 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
assertThat(allDossiers.size()).isEqualTo(1);
assertThat(allDossiers.get(0)).isEqualTo(dossier);
-
// update
CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest();
cru.setDossierTemplateId(dossier.getId());
@@ -39,7 +42,7 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
assertThat(updated.getDossierName()).isEqualTo("Dossier 1 Update");
- var loadedTemplate = dossierClient.getDossierById(updated.getId());
+ var loadedTemplate = dossierClient.getDossierById(updated.getId(),false);
assertThat(loadedTemplate).isEqualTo(updated);
@@ -58,5 +61,6 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
assertThat(dossierClient.getAllDossiers()).isEmpty();
assertThat(dossierClient.getSoftDeletedDossiers()).isEmpty();
+ assertThatThrownBy(() -> dossierClient.undeleteDossiers(Sets.newHashSet(dossier.getId()))).isInstanceOf(FeignException.class);
}
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java
index 50fadd89c..ba729cc99 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java
@@ -1,6 +1,7 @@
package com.iqser.red.service.peristence.v1.server.integration.tests;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient;
import com.iqser.red.service.peristence.v1.server.integration.client.DownloadClient;
import com.iqser.red.service.peristence.v1.server.integration.client.ReportTemplateClient;
import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider;
@@ -8,18 +9,27 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTes
import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.peristence.v1.server.service.download.DownloadReportMessageReceiver;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadRequest;
import com.iqser.red.service.redaction.report.v1.api.model.ReportResultMessage;
import com.iqser.red.service.redaction.report.v1.api.model.StoredFileInformation;
import com.iqser.red.storage.commons.service.StorageService;
+
+import lombok.Builder;
import lombok.SneakyThrows;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.ByteArrayInputStream;
+import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
import static org.assertj.core.api.Assertions.assertThat;
@@ -49,6 +59,9 @@ public class DownloadPreparationTest extends AbstractPersistenceServerServiceTes
@Autowired
private ReportTemplateClient reportTemplateClient;
+ @Autowired
+ private DossierClient dossierClient;
+
@Test
@SneakyThrows
@@ -56,7 +69,7 @@ public class DownloadPreparationTest extends AbstractPersistenceServerServiceTes
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
- var dossier = dossierTesterAndProvider.provideTestDossier();
+ var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate);
var file = fileTesterAndProvider.testAndProvideFile(dossier);
@@ -71,6 +84,23 @@ public class DownloadPreparationTest extends AbstractPersistenceServerServiceTes
assertThat(availableTemplates).isNotEmpty();
+ dossierClient.updateDossier(CreateOrUpdateDossierRequest.builder()
+ .dossierName(dossier.getDossierName())
+ .date(dossier.getDate())
+ .description(dossier.getDescription())
+ .ownerId(dossier.getOwnerId())
+ .memberIds(dossier.getMemberIds())
+ .approverIds(dossier.getApproverIds())
+ .downloadFileTypes(dossier.getDownloadFileTypes())
+ .watermarkEnabled(dossier.isWatermarkEnabled())
+ .dueDate(dossier.getDueDate())
+ .dossierTemplateId(dossier.getDossierTemplateId())
+ .reportTemplateIds(availableTemplates.stream().map(a -> a.getTemplateId()).collect(Collectors.toList()))
+ .build(), dossier.getId());
+
+ var updatedDossier = dossierClient.getDossierById(dossier.getId(),false);
+ assertThat(updatedDossier.getReportTemplateIds()).isNotEmpty();
+
downloadClient.prepareDownload(DownloadRequest.builder()
.userId("1")
.dossierId(dossier.getId())
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java
index 4d712a84b..d57a99b37 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java
@@ -1,31 +1,34 @@
package com.iqser.red.service.peristence.v1.server.integration.tests;
-import com.iqser.red.service.peristence.v1.server.integration.client.FileAttributeClient;
-import com.iqser.red.service.peristence.v1.server.integration.client.FileAttributeConfigClient;
-import com.iqser.red.service.peristence.v1.server.integration.client.FileClient;
-import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider;
-import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider;
-import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.FileAttributesGeneralConfiguration;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ImportCsvRequest;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeConfig;
-import lombok.SneakyThrows;
-import org.apache.commons.io.IOUtils;
-import org.assertj.core.util.Lists;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.io.ClassPathResource;
+import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
-import static org.assertj.core.api.Assertions.assertThat;
+import org.apache.commons.io.IOUtils;
+import org.assertj.core.util.Lists;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ClassPathResource;
+
+import com.google.common.collect.Sets;
+import com.iqser.red.service.peristence.v1.server.integration.client.FileAttributeClient;
+import com.iqser.red.service.peristence.v1.server.integration.client.FileAttributeConfigClient;
+import com.iqser.red.service.peristence.v1.server.integration.client.FileClient;
+import com.iqser.red.service.peristence.v1.server.integration.client.UploadClient;
+import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider;
+import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider;
+import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.FileAttributesGeneralConfiguration;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ImportCsvRequest;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeConfig;
+
+import lombok.SneakyThrows;
public class FileAttributeTest extends AbstractPersistenceServerServiceTest {
-
@Autowired
private FileTesterAndProvider fileTesterAndProvider;
@@ -41,15 +44,18 @@ public class FileAttributeTest extends AbstractPersistenceServerServiceTest {
@Autowired
private FileClient fileClient;
+ @Autowired
+ private UploadClient uploadClient;
+
@SneakyThrows
@Test
public void testFileAttributes() {
+
var dossier = dossierTesterAndProvider.provideTestDossier();
var file = fileTesterAndProvider.testAndProvideFile(dossier);
-
FileAttributesGeneralConfiguration generalConfig = new FileAttributesGeneralConfiguration();
generalConfig.setDelimiter(",");
generalConfig.setFilenameMappingColumnHeaderName("Name");
@@ -61,36 +67,48 @@ public class FileAttributeTest extends AbstractPersistenceServerServiceTest {
List configs = new ArrayList<>();
configs.add(FileAttributeConfig.builder().csvColumnHeader("Name").primaryAttribute(true).label("Name").build());
- configs.add(FileAttributeConfig.builder().csvColumnHeader("Attribute A").primaryAttribute(false).label("Attribute A").build());
- configs.add(FileAttributeConfig.builder().csvColumnHeader("Attribute B").primaryAttribute(false).label("Attribute B").build());
- configs.add(FileAttributeConfig.builder().csvColumnHeader("Attribute C").primaryAttribute(false).label("Attribute C").build());
- configs.add(FileAttributeConfig.builder().csvColumnHeader("Attribute D").primaryAttribute(false).label("Attribute D").build());
+ configs.add(FileAttributeConfig.builder()
+ .csvColumnHeader("Attribute A")
+ .primaryAttribute(false)
+ .label("Attribute A")
+ .build());
+ configs.add(FileAttributeConfig.builder()
+ .csvColumnHeader("Attribute B")
+ .primaryAttribute(false)
+ .label("Attribute B")
+ .build());
+ configs.add(FileAttributeConfig.builder()
+ .csvColumnHeader("Attribute C")
+ .primaryAttribute(false)
+ .label("Attribute C")
+ .build());
+ configs.add(FileAttributeConfig.builder()
+ .csvColumnHeader("Attribute D")
+ .primaryAttribute(false)
+ .label("Attribute D")
+ .build());
fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), configs);
-
List loadedConfigs = fileAttributeConfigClient.getFileAttributeConfigs(dossier.getDossierTemplateId());
assertThat(loadedConfigs.size()).isEqualTo(5);
-
fileAttributeConfigClient.deleteFileAttributeConfigs(loadedConfigs.stream()
.filter(a -> a.getCsvColumnHeader().equalsIgnoreCase("Attribute C"))
.findAny()
.map(FileAttributeConfig::getId)
.orElseThrow(() -> new IllegalArgumentException("Should exists!")));
-
fileAttributeConfigClient.deleteFileAttributeConfigs(loadedConfigs.stream()
.filter(a -> a.getCsvColumnHeader().equalsIgnoreCase("Attribute D"))
.findAny()
.map(FileAttributeConfig::getId)
- .stream().collect(Collectors.toList()));
-
+ .stream()
+ .collect(Collectors.toList()));
loadedConfigs = fileAttributeConfigClient.getFileAttributeConfigs(dossier.getDossierTemplateId());
assertThat(loadedConfigs.size()).isEqualTo(3);
-
FileAttributeConfig newConfig = new FileAttributeConfig();
newConfig.setPrimaryAttribute(true);
newConfig.setLabel("Test Attribute");
@@ -98,7 +116,6 @@ public class FileAttributeTest extends AbstractPersistenceServerServiceTest {
loadedConfigs = fileAttributeConfigClient.getFileAttributeConfigs(dossier.getDossierTemplateId());
assertThat(loadedConfigs.size()).isEqualTo(4);
-
newConfig.setId(created.getId());
newConfig.setLabel("Test Attribute Update");
var updated = fileAttributeConfigClient.addOrUpdateFileAttributeConfig(dossier.getDossierTemplateId(), newConfig);
@@ -106,23 +123,26 @@ public class FileAttributeTest extends AbstractPersistenceServerServiceTest {
assertThat(loadedConfigs.size()).isEqualTo(4);
assertThat(updated.getLabel()).isEqualTo("Test Attribute Update");
-
fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), Map.of(updated.getId(), "Lorem Ipsum"));
-
- Map fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes();
+ Map fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId())
+ .getFileAttributes();
assertThat(fileAttributes.size()).isEqualTo(1);
assertThat(fileAttributes.entrySet().iterator().next().getValue()).isEqualTo("Lorem Ipsum");
-
var request = new ImportCsvRequest();
request.setCsvFile(IOUtils.toByteArray(new ClassPathResource("files/test.csv").getInputStream()));
fileAttributeClient.importCsv(dossier.getId(), request);
-
+ fileAttributeClient.importCsv(dossier.getId(), request);
fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes();
- assertThat(fileAttributes.size()).isEqualTo(3);
+ assertThat(fileAttributes.size()).isEqualTo(2);
+ fileAttributes.put(fileAttributes.keySet().iterator().next(), "changed");
+ fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), fileAttributes);
+
+ fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes();
+ assertThat(fileAttributes.size()).isEqualTo(2);
fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), Lists.newArrayList());
@@ -131,8 +151,73 @@ public class FileAttributeTest extends AbstractPersistenceServerServiceTest {
fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes();
assertThat(fileAttributes.size()).isEqualTo(0);
-
}
+ @SneakyThrows
+ @Test
+ public void testDeleteFile() {
+ // Create file with attributes
+ var dossier = dossierTesterAndProvider.provideTestDossier();
+ var file = fileTesterAndProvider.testAndProvideFile(dossier);
+
+ FileAttributesGeneralConfiguration generalConfig = new FileAttributesGeneralConfiguration();
+ generalConfig.setDelimiter(",");
+ generalConfig.setFilenameMappingColumnHeaderName("Name");
+ generalConfig.setDossierTemplateId(dossier.getDossierTemplateId());
+
+ fileAttributeConfigClient.setFileAttributesGeneralConfig(dossier.getDossierTemplateId(), generalConfig);
+ var loadedConfig = fileAttributeConfigClient.getFileAttributesGeneralConfig(dossier.getDossierTemplateId());
+ assertThat(loadedConfig.getDelimiter()).isEqualTo(",");
+
+ List configs = new ArrayList<>();
+ configs.add(FileAttributeConfig.builder().csvColumnHeader("Name").primaryAttribute(true).label("Name").build());
+ configs.add(FileAttributeConfig.builder()
+ .csvColumnHeader("Attribute A")
+ .primaryAttribute(false)
+ .label("Attribute A")
+ .build());
+ configs.add(FileAttributeConfig.builder()
+ .csvColumnHeader("Attribute B")
+ .primaryAttribute(false)
+ .label("Attribute B")
+ .build());
+ configs.add(FileAttributeConfig.builder()
+ .csvColumnHeader("Attribute C")
+ .primaryAttribute(false)
+ .label("Attribute C")
+ .build());
+ configs.add(FileAttributeConfig.builder()
+ .csvColumnHeader("Attribute D")
+ .primaryAttribute(false)
+ .label("Attribute D")
+ .build());
+
+ fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), configs);
+
+ List loadedConfigs = fileAttributeConfigClient.getFileAttributeConfigs(dossier.getDossierTemplateId());
+ assertThat(loadedConfigs.size()).isEqualTo(5);
+
+ fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), Map.of(loadedConfigs.get(0)
+ .getId(), "Lorem Ipsum"));
+
+ Map fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId())
+ .getFileAttributes();
+ assertThat(fileAttributes.size()).isEqualTo(1);
+ assertThat(fileAttributes.entrySet().iterator().next().getValue()).isEqualTo("Lorem Ipsum");
+
+ // Delete file
+ uploadClient.deleteFile(dossier.getId(), file.getId());
+ uploadClient.hardDeleteFiles(dossier.getId(), Sets.newHashSet(file.getId()));
+ var deletedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
+ assertThat(deletedFile.getFileAttributes()).isEmpty();
+
+ // Reupload file
+ var newFile = fileTesterAndProvider.testAndProvideFile(dossier);
+ assertThat(file.getId()).isEqualTo(newFile.getId());
+
+ var loadedFile = fileClient.getFileStatus(dossier.getId(), newFile.getId());
+ assertThat(loadedFile.getFileAttributes()).isEmpty();
+ }
+
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileProcessingTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileProcessingTest.java
index 91124422d..bd05a2b41 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileProcessingTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileProcessingTest.java
@@ -1,16 +1,19 @@
package com.iqser.red.service.peristence.v1.server.integration.tests;
-import com.iqser.red.service.peristence.v1.server.integration.client.FileClient;
-import com.iqser.red.service.peristence.v1.server.integration.client.FileProcessingClient;
-import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider;
-import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider;
-import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
-import com.iqser.red.service.redaction.v1.model.AnalyzeResult;
+import static org.assertj.core.api.Assertions.assertThat;
+
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
-import static org.assertj.core.api.Assertions.assertThat;
+import com.iqser.red.service.peristence.v1.server.integration.client.FileClient;
+import com.iqser.red.service.peristence.v1.server.integration.client.FileProcessingClient;
+import com.iqser.red.service.peristence.v1.server.integration.client.UploadClient;
+import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider;
+import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider;
+import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
+import com.iqser.red.service.redaction.v1.model.AnalyzeResult;
public class FileProcessingTest extends AbstractPersistenceServerServiceTest {
@@ -26,8 +29,13 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest {
@Autowired
private FileClient fileClient;
+ @Autowired
+ private UploadClient uploadClient;
+
+
@Test
public void testFileProcessing() {
+
var dossier = dossierTesterAndProvider.provideTestDossier();
var file = fileTesterAndProvider.testAndProvideFile(dossier);
@@ -36,44 +44,87 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest {
fileProcessingClient.analysisFailed(dossier.getId(), file.getId());
var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.ERROR);
-
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.ERROR);
fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), AnalyzeResult.builder()
.analysisVersion(100)
.fileId(file.getId())
- .dossierId(dossier.getId()).build());
+ .dossierId(dossier.getId())
+ .build());
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.UNASSIGNED);
+ assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNASSIGNED);
assertThat(loadedFile.getAnalysisVersion()).isEqualTo(100);
-
fileProcessingClient.ocrFailed(dossier.getId(), file.getId());
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.ERROR);
-
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.ERROR);
fileProcessingClient.ocrSuccessful(dossier.getId(), file.getId());
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.PROCESSING);
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSING);
assertThat(loadedFile.getLastOCRTime()).isNotNull();
-
fileProcessingClient.indexing(dossier.getId(), file.getId());
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.INDEXING);
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.INDEXING);
assertThat(loadedFile.getLastIndexed()).isNull();
-
fileProcessingClient.indexingFailed(dossier.getId(), file.getId());
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.ERROR);
-
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.ERROR);
fileProcessingClient.indexingSuccessful(dossier.getId(), file.getId());
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.UNASSIGNED);
+ assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNASSIGNED);
assertThat(loadedFile.getLastIndexed()).isNotNull();
}
+
+
+ @Test
+ public void testFileProcessingAfterDeletion() {
+
+ var dossier = dossierTesterAndProvider.provideTestDossier();
+
+ var file = fileTesterAndProvider.testAndProvideFile(dossier);
+
+ assertThat(file.getLastOCRTime()).isNull();
+
+ fileProcessingClient.analysisFailed(dossier.getId(), file.getId());
+ var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.ERROR);
+
+ fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), AnalyzeResult.builder()
+ .analysisVersion(100)
+ .fileId(file.getId())
+ .dossierId(dossier.getId())
+ .build());
+ loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
+ assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNASSIGNED);
+ assertThat(loadedFile.getAnalysisVersion()).isEqualTo(100);
+
+ // Delete file
+ uploadClient.deleteFile(dossier.getId(), file.getId());
+ loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.DELETED);
+ assertThat(loadedFile.getDeleted()).isNotNull();
+
+ fileProcessingClient.ocrSuccessful(dossier.getId(), file.getId());
+ loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.DELETED);
+
+ fileProcessingClient.indexing(dossier.getId(), file.getId());
+ loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.DELETED);
+
+ fileProcessingClient.indexingFailed(dossier.getId(), file.getId());
+ loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.DELETED);
+
+ fileProcessingClient.indexingSuccessful(dossier.getId(), file.getId());
+ loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.DELETED);
+
+ }
+
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java
index 1bb97a150..07fa7723b 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java
@@ -13,7 +13,8 @@ import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPers
import com.iqser.red.service.persistence.service.v1.api.model.annotations.*;
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.BinaryFileRequest;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
+
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -54,10 +55,10 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- fileClient.setCurrentFileReviewer(dossier.getId(), file.getId(), JSONPrimitive.of("1"));
+ fileClient.setCurrentFileReviewer(dossier.getId(), file.getId(),"1");
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
assertThat(loadedFile.getCurrentReviewer()).isEqualTo("1");
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.UNDER_REVIEW);
+ assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW);
fileClient.excludePages(dossier.getId(), file.getId(), Sets.newHashSet(1));
@@ -70,30 +71,30 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
assertThat(loadedFile.getExcludedPages()).isEmpty();
- fileClient.setCurrentFileReviewer(dossier.getId(), file.getId(), JSONPrimitive.of("1"));
+ fileClient.setCurrentFileReviewer(dossier.getId(), file.getId(), "1");
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
assertThat(loadedFile.getCurrentReviewer()).isEqualTo("1");
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.UNDER_REVIEW);
+ assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW);
fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "1");
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.UNDER_APPROVAL);
+ assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL);
fileClient.setStatusUnderReview(dossier.getId(), file.getId());
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.UNDER_REVIEW);
+ assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW);
fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "1");
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.UNDER_APPROVAL);
+ assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL);
fileClient.setStatusApproved(dossier.getId(), file.getId());
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.APPROVED);
+ assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.APPROVED);
assertThat(uploadClient.getOriginal(dossier.getId(), file.getId())).isNotNull();
@@ -141,7 +142,7 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
}
@Test
- public void testFilewithRedactions() {
+ public void testFileWithRedactions() {
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
@@ -174,7 +175,6 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
var loadedFile = fileClient.getFileStatus(dossierId, fileId);
- assertThat(loadedFile.isHasAnnotationComments()).isEqualTo(true);
assertThat(manualRedactionClient.getAddRedaction(fileId, addRedaction.getAnnotationId()).getFileId()).isEqualTo(loadedFile.getId());
assertThat(manualRedactionClient.getRemoveRedaction(fileId, removeRedaction.getAnnotationId()).getFileId()).isEqualTo(loadedFile.getId());
assertThat(manualRedactionClient.getForceRedaction(fileId, forceRedaction.getAnnotationId()).getFileId()).isEqualTo(loadedFile.getId());
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LegalBasisTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LegalBasisTest.java
index bec322643..17bb9bf8d 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LegalBasisTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LegalBasisTest.java
@@ -40,7 +40,7 @@ public class LegalBasisTest extends AbstractPersistenceServerServiceTest {
mappings.add(LegalBasis.builder().name("test 1").description("test 1").reason("test 1").build());
mappings.add(LegalBasis.builder().name("test 2").description("test 2").reason("test 2").build());
legalBasisClient.setLegalBasisMapping(dossierTemplate.getId(), mappings);
- assertThat(legalBasisClient.getVersion(dossierTemplate.getId())).isEqualTo(1);
+ assertThat(legalBasisClient.getVersion(dossierTemplate.getId())).isEqualTo(2);
var mapping = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId());
@@ -48,9 +48,31 @@ public class LegalBasisTest extends AbstractPersistenceServerServiceTest {
assertThat(mapping.stream().map(LegalBasis::getName).collect(Collectors.toList())).containsExactlyInAnyOrder("test 1", "test 2");
+ var legalBasis = LegalBasis.builder().name("test 3").description("test 3").reason("test 3").build();
+ legalBasisClient.addOrUpdateLegalBasis(dossierTemplate.getId(), legalBasis);
+
+
+ mapping = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId());
+ assertThat(mapping.size()).isEqualTo(3);
+ assertThat(mapping.stream().map(LegalBasis::getName).collect(Collectors.toList())).containsExactlyInAnyOrder("test 1", "test 2", "test 3");
+
+
+ legalBasis = LegalBasis.builder().name("test 3").reason("test 3").description("test 3 - updated").build();
+ legalBasisClient.addOrUpdateLegalBasis(dossierTemplate.getId(), legalBasis);
+
+ mapping = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId());
+ assertThat(mapping.size()).isEqualTo(3);
+ assertThat(mapping.stream().map(LegalBasis::getDescription).collect(Collectors.toList())).containsExactlyInAnyOrder("test 1", "test 2", "test 3 - updated");
+
+
+ legalBasisClient.deleteLegalBasis(dossierTemplate.getId(),Lists.newArrayList("test 1"));
+ mapping = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId());
+ assertThat(mapping.size()).isEqualTo(2);
+
+
legalBasisClient.setLegalBasisMapping(dossierTemplate.getId(), Lists.newArrayList());
assertThat(legalBasisClient.getLegalBasisMapping(dossierTemplate.getId())).isEmpty();
- assertThat(legalBasisClient.getVersion(dossierTemplate.getId())).isEqualTo(2);
+ assertThat(legalBasisClient.getVersion(dossierTemplate.getId())).isEqualTo(6);
}
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LicenseReportTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LicenseReportTest.java
index bdfca6899..e398b6347 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LicenseReportTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LicenseReportTest.java
@@ -11,6 +11,7 @@ import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.time.OffsetDateTime;
+import java.time.temporal.ChronoUnit;
import static org.assertj.core.api.Assertions.assertThat;
@@ -37,8 +38,8 @@ public class LicenseReportTest extends AbstractPersistenceServerServiceTest {
LicenseReportRequest request = new LicenseReportRequest();
request.setDossierIds(Lists.newArrayList(dossier.getId()));
- request.setStartDate(OffsetDateTime.now().minusHours(10).toInstant());
- request.setEndDate(OffsetDateTime.now().plusHours(10).toInstant());
+ request.setStartDate(OffsetDateTime.now().minusHours(10).toInstant().truncatedTo(ChronoUnit.MILLIS));
+ request.setEndDate(OffsetDateTime.now().plusHours(10).toInstant().truncatedTo(ChronoUnit.MILLIS));
request.setRequestId("123");
assertThat(licenseReportClient.getLicenseReport(request, 0, 20)).isNotNull();
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java
index f802e8a5d..bfe9789d3 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java
@@ -14,6 +14,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import static org.assertj.core.api.Assertions.assertThat;
+import java.util.List;
+
public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
@Autowired
@@ -51,7 +53,11 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
assertThat(loadedComment.getText()).isEqualTo("test");
- var addRedaction = manualRedactionClient.addAddRedaction(dossier.getId(), file.getId(), AddRedactionRequest.builder().addToDictionary(true)
+ var addRedaction = manualRedactionClient.addAddRedaction(dossier.getId(), file.getId(), AddRedactionRequest.builder()
+ .positions(List.of(Rectangle.builder().topLeftY(1).topLeftX(1).height(1).width(1).build()))
+
+
+ .addToDictionary(true)
.addToDossierDictionary(false).status(AnnotationStatus.REQUESTED).typeId(type.getId()).user("user").reason("1").value("test").legalBasis("1").build());
var loadedAddRedaction = manualRedactionClient.getAddRedaction(file.getId(), addRedaction.getAnnotationId());
assertThat(loadedAddRedaction.getUser()).isEqualTo("user");
@@ -155,7 +161,6 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
var imageRecategorization2 = manualRedactionClient.addImageRecategorization(dossier.getId(), file.getId(), ImageRecategorizationRequest.builder()
.annotationId(addRedaction2.getAnnotationId()).comment("comment").status(AnnotationStatus.APPROVED).user("test").typeId("new-type:id").build());
-
var loadedImageRecategorization2 = manualRedactionClient.getImageRecategorization(file.getId(), imageRecategorization2.getAnnotationId());
assertThat(loadedImageRecategorization2.getStatus()).isEqualTo(AnnotationStatus.APPROVED);
@@ -163,6 +168,22 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
loadedImageRecategorization2 = manualRedactionClient.getImageRecategorization(file.getId(), imageRecategorization2.getAnnotationId());
assertThat(loadedImageRecategorization2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED);
+ var resizeRedaction = manualRedactionClient.addResizeRedaction(dossier.getId(), file.getId(), ResizeRedactionRequest.builder()
+ .annotationId(addRedaction.getAnnotationId()).page(1).comment("comment").status(AnnotationStatus.REQUESTED).positions(List.of(Rectangle.builder().topLeftY(2).topLeftX(2).height(2).width(2).build())).user("test").value("some value").build());
+ var loadedResizeRedaction = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction.getAnnotationId());
+ assertThat(loadedResizeRedaction.getStatus()).isEqualTo(AnnotationStatus.REQUESTED);
+ assertThat(loadedResizeRedaction.getUser()).isEqualTo("test");
+ assertThat(loadedResizeRedaction.getPositions()).isNotEmpty();
+ assertThat(loadedResizeRedaction.getValue()).isEqualTo("some value");
+
+ manualRedactionClient.updateResizeRedactionStatus(dossier.getId(), file.getId(), resizeRedaction.getAnnotationId(), JSONPrimitive.of(AnnotationStatus.APPROVED));
+ loadedResizeRedaction = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction.getAnnotationId());
+ assertThat(loadedResizeRedaction.getStatus()).isEqualTo(AnnotationStatus.APPROVED);
+
+ manualRedactionClient.updateResizeRedactionStatus(dossier.getId(), file.getId(), resizeRedaction.getAnnotationId(), JSONPrimitive.of(AnnotationStatus.DECLINED));
+ loadedResizeRedaction = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction.getAnnotationId());
+ assertThat(loadedResizeRedaction.getStatus()).isEqualTo(AnnotationStatus.DECLINED);
+
ManualRedactions manualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId());
assertThat(manualRedactions.getForceRedactions()).isNotEmpty();
@@ -208,5 +229,17 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
manualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId());
manualRedactions.getLegalBasisChanges().forEach(e -> manualRedactionClient.deleteLegalBasisChange(dossier.getId(), file.getId(), e.getAnnotationId()));
+ var resizeRedaction2 = manualRedactionClient.addResizeRedaction(dossier.getId(), file.getId(), ResizeRedactionRequest.builder()
+ .annotationId(addRedaction.getAnnotationId()).page(1).comment("comment").status(AnnotationStatus.APPROVED).positions(List.of(Rectangle.builder().topLeftY(2).topLeftX(2).height(2).width(2).build())).user("test").value("some value").build());
+ var loadedResizeRedaction2 = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction2.getAnnotationId());
+ assertThat(loadedResizeRedaction2.getStatus()).isEqualTo(AnnotationStatus.APPROVED);
+ assertThat(loadedResizeRedaction2.getUser()).isEqualTo("test");
+ assertThat(loadedResizeRedaction2.getPositions()).isNotEmpty();
+ assertThat(loadedResizeRedaction2.getValue()).isEqualTo("some value");
+
+ manualRedactionClient.updateResizeRedactionStatus(dossier.getId(), file.getId(), resizeRedaction2.getAnnotationId(), JSONPrimitive.of(AnnotationStatus.REQUESTED));
+ loadedResizeRedaction2 = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction2.getAnnotationId());
+ assertThat(loadedResizeRedaction2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED);
+
}
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesTest.java
new file mode 100644
index 000000000..73b7b7314
--- /dev/null
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesTest.java
@@ -0,0 +1,79 @@
+package com.iqser.red.service.peristence.v1.server.integration.tests;
+
+import com.iqser.red.service.peristence.v1.server.integration.client.NotificationPreferencesClient;
+import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
+import com.iqser.red.service.persistence.service.v1.api.model.notification.EmailNotificationType;
+import com.iqser.red.service.persistence.service.v1.api.model.notification.NotificationPreferences;
+import feign.FeignException;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class NotificationPreferencesTest extends AbstractPersistenceServerServiceTest {
+
+ private static final String USER_ID = "1234";
+ private static final String DOSSIER_YOU_OWN_NOTIFICATION_1 = "Dossier status changes";
+ private static final String DOSSIER_YOU_OWN_NOTIFICATION_2 = "Requests to join dossier";
+ private static final String DOSSIER_YOU_OWN_NOTIFICATION_3 = "Document status changes";
+ private static final String DOSSIER_YOU_OWN_NOTIFICATION_4 = "Document is sent for approval";
+
+ @Autowired
+ private NotificationPreferencesClient notificationPreferencesClient;
+
+ private NotificationPreferences notificationPreferences;
+ List inAppNotifications = new ArrayList<>();
+ List emailNotifications = new ArrayList<>();
+
+ @Before
+ public void setupData() {
+ inAppNotifications.add(DOSSIER_YOU_OWN_NOTIFICATION_1);
+ inAppNotifications.add(DOSSIER_YOU_OWN_NOTIFICATION_2);
+ inAppNotifications.add(DOSSIER_YOU_OWN_NOTIFICATION_3);
+ emailNotifications.add(DOSSIER_YOU_OWN_NOTIFICATION_1);
+ emailNotifications.add(DOSSIER_YOU_OWN_NOTIFICATION_2);
+ emailNotifications.add(DOSSIER_YOU_OWN_NOTIFICATION_4);
+ notificationPreferences = new NotificationPreferences(USER_ID, true, true, EmailNotificationType.DAILY, emailNotifications, inAppNotifications);
+ }
+
+ @Test
+ public void testNotificationPreferences() {
+ // add notification
+ notificationPreferencesClient.setNotificationPreferences(USER_ID, notificationPreferences);
+
+ NotificationPreferences notificationReceived = notificationPreferencesClient.getNotificationPreferences(USER_ID);
+
+ assertThat(notificationReceived.getEmailNotificationType()).isEqualTo(EmailNotificationType.DAILY);
+ assertThat(notificationReceived.isEmailNotificationsEnabled()).isTrue();
+ assertThat(notificationReceived.isInAppNotificationsEnabled()).isTrue();
+ assertThat(notificationReceived.getInAppNotifications().size()).isEqualTo(notificationPreferences.getInAppNotifications().size());
+ assertThat(notificationReceived.getEmailNotifications().size()).isEqualTo(notificationPreferences.getEmailNotifications().size());
+
+ // update notification
+ notificationPreferences.getInAppNotifications().add(DOSSIER_YOU_OWN_NOTIFICATION_4);
+ notificationPreferences.setEmailNotificationsEnabled(false);
+
+ notificationPreferencesClient.setNotificationPreferences(USER_ID, notificationPreferences);
+
+ notificationReceived = notificationPreferencesClient.getNotificationPreferences(USER_ID);
+
+ assertThat(notificationReceived.getEmailNotificationType()).isEqualTo(EmailNotificationType.DAILY);
+ assertThat(notificationReceived.isEmailNotificationsEnabled()).isFalse();
+ assertThat(notificationReceived.isInAppNotificationsEnabled()).isTrue();
+ assertThat(notificationReceived.getInAppNotifications().size()).isEqualTo(notificationPreferences.getInAppNotifications().size());
+ assertThat(notificationReceived.getEmailNotifications().size()).isEqualTo(notificationPreferences.getEmailNotifications().size());
+
+
+ // delete notification
+ notificationPreferencesClient.deleteNotificationPreferences(USER_ID);
+ try {
+ notificationReceived = notificationPreferencesClient.getNotificationPreferences(USER_ID);
+ } catch (FeignException e) {
+ assertThat(e.status()).isEqualTo(404);
+ }
+ }
+}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalysisTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalysisTest.java
index 8d40cd6b6..615b95c59 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalysisTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalysisTest.java
@@ -7,7 +7,9 @@ import com.iqser.red.service.peristence.v1.server.integration.service.FileTester
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
+import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
+
import org.assertj.core.util.Sets;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -42,61 +44,49 @@ public class ReanalysisTest extends AbstractPersistenceServerServiceTest {
reanalysisClient.ocrDossier(dossier.getId());
var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.OCR_PROCESSING);
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.OCR_PROCESSING);
+ resetProcessingStatus(file);
-
- resetStatus(file);
- loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.UNASSIGNED);
-
-
- resetStatus(file);
reanalysisClient.ocrFile(dossier.getId(), file.getId(), true);
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.OCR_PROCESSING);
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.OCR_PROCESSING);
+ resetProcessingStatus(file);
- resetStatus(file);
reanalysisClient.ocrFiles(dossier.getId(), Set.of(file.getId()));
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.OCR_PROCESSING);
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.OCR_PROCESSING);
+ resetProcessingStatus(file);
-
- resetStatus(file);
reanalysisClient.reanalyzeFiles(dossier.getId(), Set.of(file.getId()), true);
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.PROCESSING);
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSING);
+ resetProcessingStatus(file);
-
- resetStatus(file);
reanalysisClient.reanalyzeFile(dossier.getId(), file.getId(), Sets.newHashSet());
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.PROCESSING);
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSING);
+ resetProcessingStatus(file);
-
- resetStatus(file);
reanalysisClient.reanalyzeDossier(dossier.getId(), true);
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.PROCESSING);
-
-
- resetStatus(file);
- reanalysisClient.reindex(dossier.getId(), Set.of(file.getId()));
- fileClient.getFileStatus(dossier.getId(), file.getId());
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSING);
+ resetProcessingStatus(file);
}
- private void resetStatus(FileModel file) {
+ private void resetProcessingStatus(FileModel file) {
fileRepository.findById(file.getId()).ifPresent(savedFile -> {
- savedFile.setStatus(FileStatus.UNASSIGNED);
+ savedFile.setProcessingStatus(ProcessingStatus.UNPROCESSED);
fileRepository.save(savedFile);
});
var loadedFile = fileClient.getFileStatus(file.getDossierId(), file.getId());
- assertThat(loadedFile.getStatus()).isEqualTo(FileStatus.UNASSIGNED);
+ assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.UNPROCESSED);
}
+
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java
index 66f46ddc1..6f67c7608 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java
@@ -1,13 +1,15 @@
package com.iqser.red.service.peristence.v1.server.integration.tests;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
import com.iqser.red.service.peristence.v1.server.integration.client.ReportTemplateClient;
import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import static org.assertj.core.api.Assertions.assertThat;
public class ReportTemplateTest extends AbstractPersistenceServerServiceTest {
@@ -17,38 +19,412 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest {
@Autowired
private ReportTemplateClient reportTemplateClient;
+
+ /*
+ * Upload report, verify it exist and delete afterwards
+ */
@Test
public void testReportTemplate() {
+ // Arrange
+ String fileName = "report.xlsx";
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
+ // Act & Assert
var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
- .multiFileReport(true)
- .fileName("test.docx")
- .template(new byte[]{1, 2, 3, 4}).build());
-
+ .multiFileReport(false)
+ .fileName(fileName)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isNotEmpty();
-
- var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator().next().getTemplateId());
+ var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
+ .next()
+ .getTemplateId());
assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
-
+ assertThat(firstTemplate.getFileName()).isEqualTo(fileName);
var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId());
assertThat(download.getFile().length).isEqualTo(4);
-
reportTemplateClient.deleteTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
}
+
+
+ /*
+ * Upload multiFile report, verify it exist with correct fileName and delete afterwards
+ */
+ @Test
+ public void testMultiFileReportTemplate() {
+
+ // Arrange
+ String fileName = "report.xlsx";
+ var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
+
+ // Act & Assert
+ var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isEmpty();
+
+ reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
+ .activeByDefault(true)
+ .dossierTemplateId(dossierTemplate.getId())
+ .multiFileReport(true)
+ .fileName(fileName)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
+
+ availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isNotEmpty();
+
+ var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
+ .next()
+ .getTemplateId());
+ assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
+ assertThat(firstTemplate.getFileName()).isEqualTo("report.xlsx");
+
+ var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId());
+ assertThat(download.getFile().length).isEqualTo(4);
+
+ reportTemplateClient.deleteTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId());
+
+ availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isEmpty();
+
+ }
+
+
+ /*
+ * Try to upload template two times
+ */
+ @Test
+ public void testReportTemplateTwoTimes() {
+
+ // Arrange
+ String fileName = "report.xlsx";
+ var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
+
+ // Act & Assert
+ var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isEmpty();
+
+ reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
+ .activeByDefault(true)
+ .dossierTemplateId(dossierTemplate.getId())
+ .multiFileReport(false)
+ .fileName(fileName)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
+
+ availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isNotEmpty();
+
+ final Throwable thrown = catchThrowable(() -> {
+ reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
+ .activeByDefault(true)
+ .dossierTemplateId(dossierTemplate.getId())
+ .multiFileReport(false)
+ .fileName(fileName)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
+ });
+
+ assertThat(thrown.getMessage()).contains("Template already exists");
+
+ }
+
+
+ /*
+ * Try to upload multi file template two times
+ */
+ @Test
+ public void testMultiFileReportTemplateTwoTimes() {
+
+ // Arrange
+ String fileName = "report.xlsx";
+ var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
+
+ // Act & Assert
+ var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isEmpty();
+
+ reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
+ .activeByDefault(true)
+ .dossierTemplateId(dossierTemplate.getId())
+ .multiFileReport(true)
+ .fileName(fileName)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
+
+ availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isNotEmpty();
+
+ final Throwable thrown = catchThrowable(() -> {
+ reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
+ .activeByDefault(true)
+ .dossierTemplateId(dossierTemplate.getId())
+ .multiFileReport(true)
+ .fileName(fileName)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
+ });
+
+ assertThat(thrown.getMessage()).contains("Template already exists");
+
+ }
+
+
+ /*
+ * Upload template file and then multi file template with the same name
+ */
+ @Test
+ public void testReportTemplateAndThenMultiFileReportTemple() {
+
+ // Arrange
+ String fileName = "report.xlsx";
+ var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
+
+ // Act & Assert
+ var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isEmpty();
+
+ reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
+ .activeByDefault(true)
+ .dossierTemplateId(dossierTemplate.getId())
+ .multiFileReport(false)
+ .fileName(fileName)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
+
+ availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isNotEmpty();
+
+ var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
+ .next()
+ .getTemplateId());
+ assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
+ assertThat(firstTemplate.getFileName()).isEqualTo(fileName);
+
+ var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId());
+ assertThat(download.getFile().length).isEqualTo(4);
+
+ reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
+ .activeByDefault(true)
+ .dossierTemplateId(dossierTemplate.getId())
+ .multiFileReport(true)
+ .fileName(fileName)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
+
+ availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isNotEmpty();
+ assertThat(availableTemplates.size()).isEqualTo(2);
+
+ var secondTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.get(1)
+ .getTemplateId());
+ assertThat(availableTemplates.get(1)).isEqualTo(secondTemplate);
+ assertThat(secondTemplate.getFileName()).isEqualTo("report.xlsx");
+
+ }
+
+
+ /*
+ * Upload multi file template and then template file with the same name
+ */
+ @Test
+ public void testMultiFileReportTemplateAndThenReportTemple() {
+
+ // Arrange
+ String fileName = "report.xlsx";
+ var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
+
+ // Act & Assert
+ var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isEmpty();
+
+ reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
+ .activeByDefault(true)
+ .dossierTemplateId(dossierTemplate.getId())
+ .multiFileReport(true)
+ .fileName(fileName)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
+
+ availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isNotEmpty();
+
+ var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
+ .next()
+ .getTemplateId());
+ assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
+ assertThat(firstTemplate.getFileName()).isEqualTo("report.xlsx");
+
+ var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId());
+ assertThat(download.getFile().length).isEqualTo(4);
+
+ reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
+ .activeByDefault(true)
+ .dossierTemplateId(dossierTemplate.getId())
+ .multiFileReport(false)
+ .fileName(fileName)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
+
+ availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isNotEmpty();
+ assertThat(availableTemplates.size()).isEqualTo(2);
+
+ var secondTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.get(1)
+ .getTemplateId());
+ assertThat(availableTemplates.get(1)).isEqualTo(secondTemplate);
+ assertThat(secondTemplate.getFileName()).isEqualTo(fileName);
+
+ }
+
+
+ /*
+ * Upload MF with ending xlsx
+ */
+ @Test
+ public void testMultiFileReportTemplateAsExcel() {
+ // Arrange
+ String fileName = "report with really_weird~Name(567) [}=§$783 XYz&";
+ String fileEnding = ".xlsx";
+ var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
+
+ // Act & Assert
+ var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isEmpty();
+
+ reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
+ .activeByDefault(true)
+ .dossierTemplateId(dossierTemplate.getId())
+ .multiFileReport(true)
+ .fileName(fileName + fileEnding)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
+
+ availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isNotEmpty();
+
+ var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
+ .next()
+ .getTemplateId());
+ assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
+ assertThat(firstTemplate.getFileName()).isEqualTo(fileName + fileEnding);
+
+ }
+
+
+ /*
+ * Upload MF with ending docx
+ */
+ @Test
+ public void testMultiFileReportTemplateAsWord() {
+ // Arrange
+ String fileName = "report with really_weird~Name(567) [}=§$783 XYz&";
+ String fileEnding = ".docx";
+ var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
+
+ // Act & Assert
+ var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isEmpty();
+
+ reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
+ .activeByDefault(true)
+ .dossierTemplateId(dossierTemplate.getId())
+ .multiFileReport(true)
+ .fileName(fileName + fileEnding)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
+
+ availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isNotEmpty();
+
+ var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
+ .next()
+ .getTemplateId());
+ assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
+ assertThat(firstTemplate.getFileName()).isEqualTo(fileName + fileEnding);
+
+ }
+
+
+ /*
+ * Upload multiFile report with fantasy fileEnding
+ */
+ @Test
+ public void testMultiFileReportTemplateWithFantasyName() {
+ // Arrange
+ String fileName = "report with really_weird~Name(567) [}=§$783 XYz&";
+ String fileEnding = ".fantasyEnding";
+ var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
+
+ // Act & Assert
+ var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isEmpty();
+
+ reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
+ .activeByDefault(true)
+ .dossierTemplateId(dossierTemplate.getId())
+ .multiFileReport(true)
+ .fileName(fileName + fileEnding)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
+
+ availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isNotEmpty();
+
+ var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
+ .next()
+ .getTemplateId());
+ assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
+ assertThat(firstTemplate.getFileName()).isEqualTo(fileName + fileEnding);
+
+ }
+
+
+ /*
+ * Upload multiFile report with fantasy fileEnding
+ */
+ @Test
+ public void testMultiFileReportTemplateWithDotsInName() {
+ // Arrange
+ String fileName = "awesome.report.with.many.dots";
+ String fileEnding = ".xlsx";
+ var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
+
+ // Act & Assert
+ var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isEmpty();
+
+ reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
+ .activeByDefault(true)
+ .dossierTemplateId(dossierTemplate.getId())
+ .multiFileReport(true)
+ .fileName(fileName + fileEnding)
+ .template(new byte[]{1, 2, 3, 4})
+ .build());
+
+ availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
+ assertThat(availableTemplates).isNotEmpty();
+
+ var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
+ .next()
+ .getTemplateId());
+ assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
+ assertThat(firstTemplate.getFileName()).isEqualTo(fileName + fileEnding);
+
+ }
+
}
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/TypeTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/TypeTest.java
index 552fb35ca..058a9e759 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/TypeTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/TypeTest.java
@@ -6,15 +6,12 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTes
import com.iqser.red.service.peristence.v1.server.integration.service.TypeProvider;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Colors;
-import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntry;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type;
import org.assertj.core.util.Lists;
import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
-import java.util.List;
-
import static org.assertj.core.api.Assertions.assertThat;
public class TypeTest extends AbstractPersistenceServerServiceTest {
@@ -42,9 +39,11 @@ public class TypeTest extends AbstractPersistenceServerServiceTest {
var loadedType = dictionaryClient.getDictionaryForType(type.getId());
+ assertThat(loadedType.getEntries().size()).isEqualTo(3);
+
assertThat(loadedType.getVersion()).isGreaterThan(type.getVersion());
- List dict = dictionaryClient.getEntriesForType(type.getId());
+ var dict = dictionaryClient.getEntriesForType(type.getId());
assertThat(dict.size()).isEqualTo(3);
@@ -54,6 +53,13 @@ public class TypeTest extends AbstractPersistenceServerServiceTest {
assertThat(loadedType.getVersion()).isGreaterThan(type.getVersion() + 1);
+ dict = dictionaryClient.getEntriesForType(type.getId());
+
+ assertThat(dict.size()).isEqualTo(3);
+ for (var entry : dict) {
+ assertThat(entry.isDeleted()).isTrue();
+ }
+
var request = new Type();
BeanUtils.copyProperties(type, request);
@@ -72,7 +78,7 @@ public class TypeTest extends AbstractPersistenceServerServiceTest {
assertThat(typesForTemplate).isEmpty();
- var dossier = dossierTesterAndProvider.provideTestDossier();
+ var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate);
var dossierType = typeProvider.testAndProvideType(dossierTemplate, dossier, "dossier-dict");
var typesForDossier = dictionaryClient.getAllTypesForDossier(dossierType.getDossierId());
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java
index da29a3ff5..8d148e7fa 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java
@@ -15,8 +15,10 @@ import com.iqser.red.storage.commons.service.StorageService;
import org.assertj.core.util.Lists;
import org.junit.After;
import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
+import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -34,6 +36,7 @@ import org.springframework.test.context.junit4.SpringRunner;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;
+import java.util.TimeZone;
@RunWith(SpringRunner.class)
@EnableFeignClients(basePackageClasses = FileClient.class)
@@ -42,6 +45,8 @@ import static org.mockito.Mockito.when;
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public abstract class AbstractPersistenceServerServiceTest {
+ @MockBean
+ private AmqpAdmin amqpAdmin;
@MockBean
protected RabbitTemplate rabbitTemplate;
@MockBean
@@ -57,7 +62,7 @@ public abstract class AbstractPersistenceServerServiceTest {
@Autowired
private DossierRepository dossierRepository;
@Autowired
- private FileRepository fileRepository;
+ protected FileRepository fileRepository;
@Autowired
private ViewedPagesRepository viewedPagesRepository;
@Autowired
@@ -100,12 +105,15 @@ public abstract class AbstractPersistenceServerServiceTest {
private DossierAttributeRepository dossierAttributeRepository;
@Autowired
private DossierAttributeConfigRepository dossierAttributeConfigRepository;
+ @Autowired
+ private NotificationPreferencesRepository notificationPreferencesRepository;
@Before
public void setupOptimize() {
doNothing().when(pdfTronRedactionClient).testDigitalCurrentSignature(Mockito.any());
+ when(amqpAdmin.getQueueInfo(Mockito.any())).thenReturn(null);
when(pdfTronRedactionClient.optimize(Mockito.any())).thenAnswer((args) ->
new PdfTronOptimizeResponse(((PdfTronOptimizeRequest) args.getArguments()[0]).getDocument()));
when(pdfTronRedactionClient.redact(Mockito.any())).thenAnswer((args) ->
@@ -154,6 +162,7 @@ public abstract class AbstractPersistenceServerServiceTest {
fileRepository.deleteAll();
dossierRepository.deleteAll();
dossierTemplateRepository.deleteAll();
+ notificationPreferencesRepository.deleteAll();
}
static class Initializer implements ApplicationContextInitializer {
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FileSystemBackedStorageService.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FileSystemBackedStorageService.java
index 2697696b7..0f6e9a125 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FileSystemBackedStorageService.java
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FileSystemBackedStorageService.java
@@ -1,6 +1,7 @@
package com.iqser.red.service.peristence.v1.server.integration.utils;
import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist;
+import com.iqser.red.storage.commons.service.S3StorageService;
import com.iqser.red.storage.commons.service.StorageService;
import lombok.SneakyThrows;
import org.apache.commons.io.IOUtils;
@@ -13,7 +14,7 @@ import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
-public class FileSystemBackedStorageService extends StorageService {
+public class FileSystemBackedStorageService extends S3StorageService {
private final Map dataMap = new HashMap<>();
diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml b/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml
index cee644845..980811b00 100644
--- a/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml
+++ b/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml
@@ -45,6 +45,7 @@ storage:
endpoint: 'http://localhost:9000'
key: minioadmin
secret: minioadmin
+ backend: 's3'
server:
diff --git a/persistence-service-v1/pom.xml b/persistence-service-v1/pom.xml
index 49dc35da3..60fce933f 100755
--- a/persistence-service-v1/pom.xml
+++ b/persistence-service-v1/pom.xml
@@ -6,7 +6,7 @@
com.iqser.red
platform-dependency
- 1.1.3
+ 1.1.5
4.0.0
@@ -28,7 +28,7 @@
com.iqser.red
platform-commons-dependency
- 1.3.6
+ 1.7.0
import
pom