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 1ad3ec012..da9b07716 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 @@ -64,6 +64,20 @@ 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); + }); + } + + @Transactional public void updateStatusSuccessful(String fileId, FileStatus status, boolean approval) { 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 c41da39e5..83e0bbb66 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,5 +1,6 @@ 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; @@ -28,6 +29,7 @@ public class FileStatusController implements StatusResource { private final FileStatusService fileStatusService; private final DossierService dossierService; private final ExcludeFromAnalysisService excludeFromAnalysis; + private final AnalysisFlagsCalculationService analysisFlagsCalculationService; @Override public List getAllStatuses() { @@ -121,6 +123,7 @@ public class FileStatusController implements StatusResource { excludedPages.addAll(pages); fileStatusService.setExcludedPages(fileId, pages); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); } @@ -130,6 +133,7 @@ public class FileStatusController implements StatusResource { Set excludedPages = fileStatus.getExcludedPages(); excludedPages.removeAll(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/ManualRedactionController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ManualRedactionController.java index 0a28f2851..ae5c13785 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,5 +1,6 @@ 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.persistence.service.v1.api.model.annotations.*; import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; @@ -16,6 +17,7 @@ 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 @@ -23,7 +25,9 @@ public class ManualRedactionController implements ManualRedactionResource { @PathVariable(FILE_ID) String fileId, @RequestBody AddRedactionRequest addRedactionRequest) { - return manualRedactionService.addAddRedaction(dossierId, fileId, addRedactionRequest); + var resp = manualRedactionService.addAddRedaction(dossierId, fileId, addRedactionRequest); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); + return resp; } @@ -32,7 +36,9 @@ public class ManualRedactionController implements ManualRedactionResource { @PathVariable(FILE_ID) String fileId, @RequestBody RemoveRedactionRequest removeRedactionRequest) { - return manualRedactionService.addRemoveRedaction(dossierId, fileId, removeRedactionRequest); + var resp = manualRedactionService.addRemoveRedaction(dossierId, fileId, removeRedactionRequest); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); + return resp; } @@ -41,7 +47,9 @@ public class ManualRedactionController implements ManualRedactionResource { @PathVariable(FILE_ID) String fileId, @RequestBody ForceRedactionRequest forceRedactionRequest) { - return manualRedactionService.addForceRedaction(dossierId, fileId, forceRedactionRequest); + var resp = manualRedactionService.addForceRedaction(dossierId, fileId, forceRedactionRequest); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); + return resp; } @@ -50,7 +58,9 @@ public class ManualRedactionController implements ManualRedactionResource { @PathVariable(FILE_ID) String fileId, @RequestBody LegalBasisChangeRequest legalBasisChangeRequest) { - return manualRedactionService.addLegalBasisChange(dossierId, fileId, legalBasisChangeRequest); + var resp = manualRedactionService.addLegalBasisChange(dossierId, fileId, legalBasisChangeRequest); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); + return resp; } @@ -59,7 +69,9 @@ public class ManualRedactionController implements ManualRedactionResource { @PathVariable(FILE_ID) String fileId, @RequestBody ImageRecategorizationRequest imageRecategorizationRequest) { - return manualRedactionService.addImageRecategorization(dossierId, fileId, imageRecategorizationRequest); + var resp = manualRedactionService.addImageRecategorization(dossierId, fileId, imageRecategorizationRequest); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); + return resp; } @@ -68,7 +80,9 @@ public class ManualRedactionController implements ManualRedactionResource { @PathVariable(ANNOTATION_ID) String annotationId, @RequestBody CommentRequest comment) { - return convert(manualRedactionService.addComment(fileId, annotationId, comment), Comment.class); + var resp = convert(manualRedactionService.addComment(fileId, annotationId, comment), Comment.class); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); + return resp; } @@ -122,6 +136,7 @@ public class ManualRedactionController implements ManualRedactionResource { @PathVariable(ANNOTATION_ID) String annotationId) { manualRedactionService.deleteAddRedaction(dossierId, fileId, annotationId); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); } @@ -130,6 +145,7 @@ public class ManualRedactionController implements ManualRedactionResource { @PathVariable(ANNOTATION_ID) String annotationId) { manualRedactionService.deleteRemoveRedaction(dossierId, fileId, annotationId); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); } @@ -138,6 +154,7 @@ public class ManualRedactionController implements ManualRedactionResource { @PathVariable(ANNOTATION_ID) String annotationId) { manualRedactionService.deleteForceRedaction(dossierId, fileId, annotationId); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); } @@ -146,6 +163,7 @@ public class ManualRedactionController implements ManualRedactionResource { @PathVariable(ANNOTATION_ID) String annotationId) { manualRedactionService.deleteLegalBasisChange(dossierId, fileId, annotationId); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); } @@ -155,6 +173,7 @@ public class ManualRedactionController implements ManualRedactionResource { @PathVariable(ANNOTATION_ID) String annotationId) { manualRedactionService.deleteImageRecategorization(dossierId, fileId, annotationId); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); } @@ -162,6 +181,7 @@ 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); } @@ -172,6 +192,7 @@ public class ManualRedactionController implements ManualRedactionResource { @RequestBody JSONPrimitive updateStatusRequest) { manualRedactionService.updateAddRedactionStatus(dossierId, fileId, annotationId, updateStatusRequest.getValue()); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); } @@ -182,6 +203,7 @@ public class ManualRedactionController implements ManualRedactionResource { @RequestBody JSONPrimitive updateStatusRequest) { manualRedactionService.updateRemoveRedactionStatus(dossierId, fileId, annotationId, updateStatusRequest.getValue()); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); } @@ -192,6 +214,7 @@ public class ManualRedactionController implements ManualRedactionResource { @RequestBody JSONPrimitive updateStatusRequest) { manualRedactionService.updateForceRedactionStatus(dossierId, fileId, annotationId, updateStatusRequest.getValue()); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); } @@ -201,6 +224,7 @@ public class ManualRedactionController implements ManualRedactionResource { @RequestBody JSONPrimitive updateStatusRequest) { manualRedactionService.updateLegalBasisChangeStatus(dossierId, fileId, annotationId, updateStatusRequest.getValue()); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); } @@ -211,6 +235,7 @@ public class ManualRedactionController implements ManualRedactionResource { @RequestBody JSONPrimitive updateStatusRequest) { manualRedactionService.updateImageRecategorizationStatus(dossierId, fileId, annotationId, updateStatusRequest.getValue()); + analysisFlagsCalculationService.calculateFlags(dossierId, 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 new file mode 100644 index 000000000..6ba2da93e --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/AnalysisFlagsCalculationService.java @@ -0,0 +1,73 @@ +package com.iqser.red.service.peristence.v1.server.service; + +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 lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class AnalysisFlagsCalculationService { + + private final FileStatusPersistenceService fileStatusPersistenceService; + private final RedactionLogService redactionLogService; + + + @Async + public void calculateFlags(String dossierId, String fileId) { + + var redactionLog = redactionLogService.getRedactionLog(dossierId, fileId, true); + + boolean hasRedactions = false; + boolean hasHints = false; + boolean hasSuggestions = false; + boolean hasImages = false; + boolean hasComments = false; + + for (RedactionLogEntry entry : redactionLog.getRedactionLogEntry()) { + if (entry.isExcluded()) { + continue; + } + + String type = getType(entry.getTypeId()); + + if (entry.isRedacted() && !entry.isManual() || entry.isManual() && entry.getStatus() + .equals(AnnotationStatus.APPROVED)) { + hasRedactions = true; + } + + if (entry.isHint() && !type.equals("false_positive")) { + hasHints = true; + } + + if (entry.isHint() && type.equals("image") || entry.isImage()) { + hasImages = true; + } + + if (entry.isManual() && entry.getStatus() + .equals(AnnotationStatus.REQUESTED)) { + hasSuggestions = true; + } + + if (entry.getComments() != null && !entry.getComments().isEmpty()) { + hasComments = true; + } + + if (hasRedactions && hasHints && hasSuggestions && hasImages && hasComments) { + break; + } + } + + fileStatusPersistenceService.updateFlags(fileId, hasRedactions, hasHints, hasImages, hasSuggestions, hasComments); + } + + + 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/FileStatusProcessingUpdateService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java index 9c8d68db6..09733d155 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 @@ -19,6 +19,7 @@ public class FileStatusProcessingUpdateService { private final FileStatusService fileStatusService; private final IndexingService indexingService; private final DossierPersistenceService dossierPersistenceService; + private final AnalysisFlagsCalculationService analysisFlagsCalculationService; public void analysisSuccessful(String dossierId, String fileId, AnalyzeResult analyzeResult) { @@ -37,6 +38,7 @@ public class FileStatusProcessingUpdateService { indexingService.addToIndexingQueue(dossier.getDossierTemplateId(), dossierId, fileId, 2); } + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); }