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