diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/EntityLogController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/EntityLogController.java index fa33c61bf..aaea93cdf 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/EntityLogController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/EntityLogController.java @@ -28,9 +28,9 @@ public class EntityLogController implements EntityLogResource { public EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(value = "excludedType", required = false) List excludedTypes, - @RequestParam(value = "unprocessed", required = false, defaultValue = FALSE) boolean unprocessed) { + @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) { - return entityLogService.getEntityLog(dossierId, fileId, excludedTypes, unprocessed); + return entityLogService.getEntityLog(dossierId, fileId, excludedTypes, includeUnprocessed); } diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/EntityLogResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/EntityLogResource.java index ef7c8133c..7fcf79d52 100644 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/EntityLogResource.java +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/EntityLogResource.java @@ -38,7 +38,7 @@ public interface EntityLogResource { EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(value = "excludedType", required = false) List excludedTypes, - @RequestParam(value = "unprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed); + @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed); @PostMapping(value = ENTITY_LOG_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE + "/filtered", produces = MediaType.APPLICATION_JSON_VALUE) diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/EntityLogInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/EntityLogInternalController.java index e6d1e6f32..0dd4d4fbb 100644 --- a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/EntityLogInternalController.java +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/EntityLogInternalController.java @@ -22,7 +22,7 @@ public class EntityLogInternalController implements EntityLogResource { public EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(value = "excludedType", required = false) List excludedTypes, - @RequestParam(value = "unprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) { + @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) { return entityLogService.getEntityLog(dossierId, fileId, excludedTypes, includeUnprocessed); } diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/EntityLogResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/EntityLogResource.java index 9b8adc609..1a7b7c23b 100644 --- a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/EntityLogResource.java +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/EntityLogResource.java @@ -35,5 +35,5 @@ public interface EntityLogResource { EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(value = "excludedType", required = false) List excludedTypes, - @RequestParam(value = "unprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed); + @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogService.java index 226cb32c8..84e980d94 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogService.java @@ -1,5 +1,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service; +import static com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils.toTypeId; + import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.Collections; @@ -12,9 +14,11 @@ import java.util.Set; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.UnprocessedManualEntityClient; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionProviderService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Change; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ChangeType; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog; @@ -51,6 +55,7 @@ public class EntityLogService { UnprocessedManualEntityClient unprocessedManualEntityClient; DossierService dossierService; CommentService commentService; + DictionaryPersistenceService dictionaryPersistenceService; public EntityLog getEntityLog(String dossierId, String fileId) { @@ -76,9 +81,10 @@ public class EntityLogService { } if (includeUnprocessed) { + DossierEntity dossier = dossierService.getDossierById(dossierId); ManualRedactions manualRedactions = manualRedactionProviderService.getManualRedactions(fileId, true); - List unprocessedManualEntities = getUnprocessedManualEntities(dossierId, fileId, manualRedactions); - mergeEntityLog(manualRedactions, unprocessedManualEntities, entityLog); + List unprocessedManualEntities = getUnprocessedManualEntities(dossierId, fileId, dossier.getDossierTemplateId(), manualRedactions); + mergeEntityLog(manualRedactions, unprocessedManualEntities, entityLog, dossier.getDossierTemplateId()); } Map commentCountPerAnnotationId = commentService.getCommentCounts(fileId); @@ -124,17 +130,16 @@ public class EntityLogService { return entityLog; } - private List getUnprocessedManualEntities(String dossierId, String fileId, ManualRedactions manualRedactions) { + private List getUnprocessedManualEntities(String dossierId, String fileId, String dossierTemplateId, ManualRedactions manualRedactions) { - DossierEntity dossier = dossierService.getDossierById(dossierId); - return unprocessedManualEntityClient.mergeUnprocessedManualEntities(fileId, dossierId, dossier.getDossierTemplateId(), manualRedactions); + return unprocessedManualEntityClient.mergeUnprocessedManualEntities(fileId, dossierId, dossierTemplateId, manualRedactions); } - public void mergeEntityLog(ManualRedactions manualRedactions, List unprocessedManualEntities, EntityLog entityLog) { + public void mergeEntityLog(ManualRedactions manualRedactions, List unprocessedManualEntities, EntityLog entityLog, String dossierTemplateId) { log.info("Merging EntityLog"); - mergeManualRedactionEntries(manualRedactions.getEntriesToAdd(), unprocessedManualEntities, entityLog); + mergeManualRedactionEntries(manualRedactions.getEntriesToAdd(), unprocessedManualEntities, entityLog, dossierTemplateId); mergeIdsToRemove(manualRedactions.getIdsToRemove(), entityLog); mergeResizeRedactions(manualRedactions.getResizeRedactions(), entityLog); mergeLegalBasisChanges(manualRedactions.getLegalBasisChanges(), entityLog); @@ -144,7 +149,7 @@ public class EntityLogService { } - private void mergeManualRedactionEntries(Set manualRedactionEntries, List unprocessedManualEntities, EntityLog entityLog) { + private void mergeManualRedactionEntries(Set manualRedactionEntries, List unprocessedManualEntities, EntityLog entityLog, String dossierTemplateId) { manualRedactionEntries.forEach(manualRedactionEntry -> { UnprocessedManualEntity unprocessedManualEntity = unprocessedManualEntities.stream() @@ -162,7 +167,7 @@ public class EntityLogService { .value(manualRedactionEntry.getValue()) .legalBasis(manualRedactionEntry.getLegalBasis()) .reason(manualRedactionEntry.getReason()) - .entryType(isHint(manualRedactionEntry.getType()) ? EntryType.HINT : EntryType.ENTITY) + .entryType(isHint(manualRedactionEntry.getType(), dossierTemplateId) ? EntryType.HINT : EntryType.ENTITY) .imported(false) .matchedRule("") .section(manualRedactionEntry.getSection()) @@ -199,12 +204,12 @@ public class EntityLogService { idRemovals.forEach(idRemoval -> { var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(idRemoval.getAnnotationId())).findAny(); if (entity.isPresent()) { - entity.get().setState(EntryState.REMOVED); - addChanges(entity.get().getChanges(), ChangeType.REMOVED); + entity.get().setState(EntryState.IGNORED); + addChanges(entity.get().getChanges(), ChangeType.REMOVED, entityLog.getAnalysisNumber()); entity.get().getManualChanges().add(ManualChange.builder() .manualRedactionType(ManualRedactionType.REMOVE_LOCALLY) .requestedDate(idRemoval.getRequestDate()) - .processedDate(idRemoval.getProcessedDate()) + .processedDate(null) .userId(idRemoval.getUser()).build()); } }); @@ -222,11 +227,11 @@ public class EntityLogService { newPosition.getWidth(), newPosition.getHeight(), newPosition.getPage()))); - addChanges(entity.get().getChanges(), ChangeType.CHANGED); + addChanges(entity.get().getChanges(), ChangeType.CHANGED, entityLog.getAnalysisNumber()); entity.get().getManualChanges().add(ManualChange.builder() .manualRedactionType(ManualRedactionType.RESIZE) .requestedDate(manualResizeRedaction.getRequestDate()) - .processedDate(manualResizeRedaction.getProcessedDate()) + .processedDate(null) .userId(manualResizeRedaction.getUser()).build()); } }); @@ -238,12 +243,16 @@ public class EntityLogService { var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(manualLegalBasisChange.getAnnotationId())).findAny(); if (entity.isPresent()) { entity.get().setLegalBasis(manualLegalBasisChange.getLegalBasis()); - addChanges(entity.get().getChanges(), ChangeType.CHANGED); + entity.get().setSection(manualLegalBasisChange.getSection()); + entity.get().setValue(manualLegalBasisChange.getValue()); + addChanges(entity.get().getChanges(), ChangeType.CHANGED, entityLog.getAnalysisNumber()); entity.get().getManualChanges().add(ManualChange.builder() .manualRedactionType(ManualRedactionType.LEGAL_BASIS_CHANGE) .requestedDate(manualLegalBasisChange.getRequestDate()) - .processedDate(manualLegalBasisChange.getProcessedDate()) - .propertyChanges(Map.of("value", manualLegalBasisChange.getValue())) + .processedDate(null) + .propertyChanges(Map.of("value", manualLegalBasisChange.getValue(), + "section", manualLegalBasisChange.getSection(), + "legalBasis", manualLegalBasisChange.getLegalBasis())) .userId(manualLegalBasisChange.getUser()) .build()); } @@ -256,7 +265,7 @@ public class EntityLogService { var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(recategorization.getAnnotationId())).findAny(); if (entity.isPresent()) { entity.get().setType(recategorization.getType()); - addChanges(entity.get().getChanges(), ChangeType.CHANGED); + addChanges(entity.get().getChanges(), ChangeType.CHANGED, entityLog.getAnalysisNumber()); entity.get().getManualChanges().add(ManualChange.builder() .manualRedactionType(ManualRedactionType.RECATEGORIZE) .requestedDate(recategorization.getRequestDate()) @@ -274,7 +283,7 @@ public class EntityLogService { if (entity.isPresent()) { entity.get().setLegalBasis(forceRedaction.getLegalBasis()); entity.get().setState(EntryState.APPLIED); - addChanges(entity.get().getChanges(), ChangeType.CHANGED); + addChanges(entity.get().getChanges(), ChangeType.CHANGED, entityLog.getAnalysisNumber()); entity.get().getManualChanges().add(ManualChange.builder() .manualRedactionType(ManualRedactionType.FORCE_REDACT) .requestedDate(forceRedaction.getRequestDate()) @@ -285,23 +294,27 @@ public class EntityLogService { }); } - private void addChanges(List changes, ChangeType changeType) { + private void addChanges(List changes, ChangeType changeType, int analysisNumber) { if (!changes.isEmpty()) { - var lastChange = changes.get(changes.size() -1); changes.add(Change.builder() - .analysisNumber(lastChange.getAnalysisNumber() + 1) + .analysisNumber(analysisNumber + 1) .dateTime(OffsetDateTime.now()) .type(changeType) .build()); } else { - changes.add(Change.builder().analysisNumber(1).dateTime(OffsetDateTime.now()).type(changeType).build()); + changes.add(Change.builder().analysisNumber(analysisNumber).dateTime(OffsetDateTime.now()).type(changeType).build()); } } - private boolean isHint(String manualRedactionEntryType) { + private boolean isHint(String type, String dossierTemplateId) { - return !(manualRedactionEntryType.equals("manual")); + String typeId = toTypeId(type, dossierTemplateId); + TypeEntity typeEntity = dictionaryPersistenceService.getType(typeId); + if (typeEntity == null) { + throw new NotFoundException("TypeEntity could not be found for typeId: " + typeId); + } + return typeEntity.isHint(); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogTest.java index a3d80147e..d0899c48c 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; import java.time.OffsetDateTime; @@ -22,6 +23,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import org.testcontainers.shaded.com.google.common.collect.Lists; import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.UnprocessedManualEntityClient; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.service.CommentService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierService; @@ -29,6 +31,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.EntityL import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionProviderService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ChangeType; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry; @@ -67,12 +70,15 @@ public class EntityLogTest { @MockBean private UnprocessedManualEntityClient unprocessedManualEntityClient; + @MockBean + private DictionaryPersistenceService dictionaryPersistenceService; + private EntityLogService entityLogService; @BeforeEach public void setUp() { - entityLogService = new EntityLogService(fileManagementStorageService, fileStatusService, manualRedactionProviderService, unprocessedManualEntityClient, dossierService, commentService); + entityLogService = new EntityLogService(fileManagementStorageService, fileStatusService, manualRedactionProviderService, unprocessedManualEntityClient, dossierService, commentService, dictionaryPersistenceService); } @@ -114,6 +120,7 @@ public class EntityLogTest { when(dossierService.getDossierById(dossierId)).thenReturn(DossierEntity.builder() .dossierTemplateId(dossierTemplateId) .build()); + when(dictionaryPersistenceService.getType(anyString())).thenReturn(TypeEntity.builder().isHint(false).build()); EntityLog response = entityLogService.getEntityLog(dossierId, fileId, null, true); @@ -138,7 +145,7 @@ public class EntityLogTest { assertTrue(optionalRemoveEntryLogEntry.isPresent()); var removeEntryLogEntry = optionalRemoveEntryLogEntry.get(); assertEquals(removeEntryLogEntry.getEntryType(), EntryType.ENTITY); - assertEquals(removeEntryLogEntry.getState(), EntryState.REMOVED); + assertEquals(removeEntryLogEntry.getState(), EntryState.IGNORED); assertEquals(removeEntryLogEntry.getManualChanges().get(0).getManualRedactionType(), ManualRedactionType.REMOVE_LOCALLY); assertEquals(removeEntryLogEntry.getChanges().get(0).getType(), ChangeType.REMOVED); @@ -258,6 +265,7 @@ public class EntityLogTest { .annotationId(entryLegalBasisId) .value("Random") .legalBasis("New legal basis") + .section("Section") .build() )) .forceRedactions(Set.of(