diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogMergeService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogMergeService.java index 6aad3f7c5..a99665a0f 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogMergeService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogMergeService.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -339,6 +340,10 @@ public class EntityLogMergeService { public void mergeIdToRemove(IdRemoval idRemoval, EntityLogEntry entityLogEntry, int analysisNumber) { entityLogEntry.setState(EntryState.IGNORED); + //special case, only for local add, other local changes and then remove + if (!entityLogEntry.getEngines().isEmpty() && Set.of(Engine.MANUAL).containsAll(entityLogEntry.getEngines())) { + entityLogEntry.setState(EntryState.REMOVED); + } entityLogEntry.getEngines().add(Engine.MANUAL); addChanges(entityLogEntry.getChanges(), ChangeType.REMOVED, analysisNumber, idRemoval.getRequestDate()); entityLogEntry.getManualChanges().add(ManualChangeFactory.toLocalManualChange(idRemoval)); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMergeTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMergeTest.java index b69cd69bf..66b9a9d86 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMergeTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMergeTest.java @@ -61,6 +61,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.mongo.service.Ent @ExtendWith(SpringExtension.class) public class EntityLogMergeTest { + final String FILE_ID = "fileId"; @MockBean private FileStatusService fileStatusService; @@ -293,6 +294,13 @@ public class EntityLogMergeTest { .findFirst(); assertTrue(optionalForceRedactionEntryLogEntry.isPresent()); assertEquals(EntryState.APPLIED, optionalForceRedactionEntryLogEntry.get().getState()); + + var optionalRemovedEntryLogEntry = response.getEntityLogEntry() + .stream() + .filter(entityLogEntry1 -> entityLogEntry1.getId().equals(entryToRemoveId)) + .findFirst(); + assertTrue(optionalRemovedEntryLogEntry.isPresent()); + assertEquals(EntryState.IGNORED, optionalRemovedEntryLogEntry.get().getState()); } @@ -346,6 +354,93 @@ public class EntityLogMergeTest { .get(index + 1).getState(), EntryState.PENDING); } + @Test + void testMergeEntityLogWithManualAddAndRemoveChanges() { + + String dossierId = "dossierId"; + String dossierTemplateId = "dossierTemplateId"; + + String entryToRemoveId = UUID.randomUUID().toString(); + String dictEntryToResizeId = UUID.randomUUID().toString(); + String entryLegalBasisId = UUID.randomUUID().toString(); + String forceRedactionId = UUID.randomUUID().toString(); + + String localId = UUID.randomUUID().toString(); + + ManualRedactions manualRedactions = ManualRedactions.builder() + .entriesToAdd(Set.of(provideManualAdd(localId, "Darth Vader"))) + .idsToRemove(Set.of(IdRemoval.builder().annotationId(localId).requestDate(OffsetDateTime.now()).user("user").fileId(FILE_ID).build())) + .build(); + + var entityLog = provideEntityLog(entryToRemoveId, dictEntryToResizeId, entryLegalBasisId, forceRedactionId, true); + + when(manualRedactionProviderService.getManualRedactions(any(), any())).thenReturn(manualRedactions); + when(fileStatusService.getStatus(FILE_ID)).thenReturn(FileModel.builder().excluded(false).dossierStatusId(dossierTemplateId).id(FILE_ID).build()); + when(fileManagementStorageService.getEntityLog(dossierId, FILE_ID)).thenReturn(entityLog); + when(dossierService.getDossierById(dossierId)).thenReturn(DossierEntity.builder().dossierTemplateId(dossierTemplateId).build()); + when(dictionaryPersistenceService.getType(anyString())).thenReturn(TypeEntity.builder().isHint(false).build()); + when(fileStatusPersistenceService.getStatus(FILE_ID)).thenReturn(FileEntity.builder().id(FILE_ID).fileAttributes(Collections.emptyList()).build()); + when(fileStatusService.convertAttributes(any(), anyString())).thenReturn(Collections.emptyList()); + + EntityLog response = entityLogMergeService.mergeEntityLog(manualRedactions, entityLog, DossierEntity.builder().dossierTemplateId(dossierTemplateId).build()); + + assertNotNull(response); + assertFalse(response.getEntityLogEntry().isEmpty()); + + var optionalEntityLogEntry = response.getEntityLogEntry() + .stream() + .filter(entityLogEntry -> entityLogEntry.getId().equals(localId)) + .findFirst(); + assertTrue(optionalEntityLogEntry.isPresent()); + assertEquals(EntryType.ENTITY, optionalEntityLogEntry.get().getEntryType()); + assertEquals(EntryState.REMOVED, optionalEntityLogEntry.get().getState()); + + } + + @Test + void testMergeEntityLogWithManualAddAndResizeAndRemoveChanges() { + + String dossierId = "dossierId"; + String dossierTemplateId = "dossierTemplateId"; + + String entryToRemoveId = UUID.randomUUID().toString(); + String dictEntryToResizeId = UUID.randomUUID().toString(); + String entryLegalBasisId = UUID.randomUUID().toString(); + String forceRedactionId = UUID.randomUUID().toString(); + + String localId = UUID.randomUUID().toString(); + + ManualRedactions manualRedactions = ManualRedactions.builder() + .entriesToAdd(Set.of(provideManualAdd(localId, "Darth Vader"))) + .resizeRedactions(Set.of(provideManualResize(localId, "Darth", dictEntryToResizeId))) + .idsToRemove(Set.of(IdRemoval.builder().annotationId(localId).requestDate(OffsetDateTime.now()).user("user").fileId(FILE_ID).build())) + .build(); + + var entityLog = provideEntityLog(entryToRemoveId, dictEntryToResizeId, entryLegalBasisId, forceRedactionId, true); + + when(manualRedactionProviderService.getManualRedactions(any(), any())).thenReturn(manualRedactions); + when(fileStatusService.getStatus(FILE_ID)).thenReturn(FileModel.builder().excluded(false).dossierStatusId(dossierTemplateId).id(FILE_ID).build()); + when(fileManagementStorageService.getEntityLog(dossierId, FILE_ID)).thenReturn(entityLog); + when(dossierService.getDossierById(dossierId)).thenReturn(DossierEntity.builder().dossierTemplateId(dossierTemplateId).build()); + when(dictionaryPersistenceService.getType(anyString())).thenReturn(TypeEntity.builder().isHint(false).build()); + when(fileStatusPersistenceService.getStatus(FILE_ID)).thenReturn(FileEntity.builder().id(FILE_ID).fileAttributes(Collections.emptyList()).build()); + when(fileStatusService.convertAttributes(any(), anyString())).thenReturn(Collections.emptyList()); + + EntityLog response = entityLogMergeService.mergeEntityLog(manualRedactions, entityLog, DossierEntity.builder().dossierTemplateId(dossierTemplateId).build()); + + assertNotNull(response); + assertFalse(response.getEntityLogEntry().isEmpty()); + + var optionalEntityLogEntry = response.getEntityLogEntry() + .stream() + .filter(entityLogEntry -> entityLogEntry.getId().equals(localId)) + .findFirst(); + assertTrue(optionalEntityLogEntry.isPresent()); + assertEquals(EntryType.ENTITY, optionalEntityLogEntry.get().getEntryType()); + assertEquals(EntryState.REMOVED, optionalEntityLogEntry.get().getState()); + + } + private EntityLog provideEntityLog(String entryToRemoveId, String entryToResizeId, String entryLegalBasisId, String forceRedactionId, boolean dictEntry) { @@ -468,5 +563,39 @@ public class EntityLogMergeTest { .build(); } + private ManualRedactionEntry provideManualAdd(String entryToAddId, String valueToAdd) { + return ManualRedactionEntry.builder() + .positions(List.of(new Rectangle(1f, 2f, 3f, 4f, 1))) + .annotationId(entryToAddId) + .value(valueToAdd) + .reason("Reason") + .addToDictionary(false) + .addToDossierDictionary(false) + .fileId(FILE_ID) + .rectangle(false) + .requestDate(OffsetDateTime.now()) + .dictionaryEntryType(DictionaryEntryType.ENTRY) + .type("manual") + .user("User") + .build(); + } + + private ManualResizeRedaction provideManualResize(String entryToResizeId, String resizedValue, String dictId) { + List positions = new ArrayList<>(); + positions.add(new Rectangle(2, 2, 2, 2, 1)); + return ManualResizeRedaction.builder() + .fileId(FILE_ID) + .value(resizedValue) + .annotationId(entryToResizeId) + .positions(positions) + .requestDate(OffsetDateTime.now()) + .updateDictionary(false) + .addToAllDossiers(false) + .user("User") + .fileId("file") + .build(); + } + + }