From 4fbea2e3e7cbbcb9ddc6a94592de39a6792a0a7b Mon Sep 17 00:00:00 2001 From: corinaolariu Date: Wed, 10 Jul 2024 15:55:57 +0300 Subject: [PATCH 1/3] RED-9495 - Remove here for locally resized dictionary entry should remove the entry completly - any local resize, legal basis change and recategorization made to a dictionary entry will be unlinked and will create a new id to be used and will introduce 2 manual changes: local add and the manual change. - unit tests added --- .../controller/ManualRedactionController.java | 5 +- .../ManualLegalBasisChangeEntity.java | 2 + .../ManualRecategorizationEntity.java | 2 + .../ManualResizeRedactionEntity.java | 3 + .../service/EntityLogMergeService.java | 41 ++++++- .../ManualRedactionMapper.java | 15 ++- .../db/changelog/db.changelog-tenant.yaml | 4 +- ...-dict-annotation-id-to-manual_changes.yaml | 45 +++++++ .../integration/tests/EntityLogMergeTest.java | 110 ++++++++++++++++++ .../annotations/LegalBasisChangeRequest.java | 1 + .../annotations/RecategorizationRequest.java | 1 + .../annotations/ResizeRedactionRequest.java | 1 + .../entitymapped/ManualLegalBasisChange.java | 1 + .../entitymapped/ManualRecategorization.java | 1 + .../entitymapped/ManualResizeRedaction.java | 1 + 15 files changed, 225 insertions(+), 8 deletions(-) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/132-add-based-on-dict-annotation-id-to-manual_changes.yaml 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/ManualRedactionController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java index 0bd75f712..f937bfca0 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java @@ -71,12 +71,13 @@ public class ManualRedactionController implements ManualRedactionResource { public void undo(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set annotationIds, - @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) { + @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed, + @RequestParam(value = "localOnly", required = false, defaultValue = FALSE) boolean localOnly) { accessControlService.checkDossierExistenceAndAccessPermissionsToDossier(dossierId); accessControlService.verifyFileIsNotApproved(dossierId, fileId); accessControlService.verifyUserIsApprover(dossierId); - manualRedactionUndoService.undo(dossierId, fileId, annotationIds, includeUnprocessed); + manualRedactionUndoService.undo(dossierId, fileId, annotationIds, includeUnprocessed, localOnly); } 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 fd9a9e2e5..407144215 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 @@ -41,6 +41,8 @@ public class ManualLegalBasisChangeEntity implements IBaseAnnotation { private OffsetDateTime softDeletedTime; @Column private int page; + @Column + private String basedOnDictAnnotationId; @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/ManualRecategorizationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRecategorizationEntity.java index 461e3b320..3817e729b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRecategorizationEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRecategorizationEntity.java @@ -56,6 +56,8 @@ public class ManualRecategorizationEntity implements IBaseAnnotation { private String section; @Column private String value; + @Column + private String basedOnDictAnnotationId; @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/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 index 3f4effe1e..6a4f4c690 100644 --- 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 @@ -63,6 +63,9 @@ public class ManualResizeRedactionEntity implements IBaseAnnotation { @Column private boolean addToAllDossiers; + @Column + private String basedOnDictAnnotationId; + @ElementCollection @Fetch(value = FetchMode.SUBSELECT) private Set typeIdsOfModifiedDictionaries = new HashSet<>(); 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 18099ab4b..9b9d23e79 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 @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -108,19 +109,36 @@ public class EntityLogMergeService { List entityLogEntries, Map> allManualChanges) { + Map trackLocalChangesBasedOnDictEntriesMap = new HashMap<>(); Map addedLocalManualEntries = buildUnprocessedLocalManualRedactions(unprocessedManualRedactions, entityLog, dossier, analysisNumber)// .collect(Collectors.toMap(EntityLogEntry::getId, Function.identity())); entityLogEntries.addAll(addedLocalManualEntries.values()); buildPendingDictionaryChanges(unprocessedManualRedactions).forEach(entityLogEntries::add); - processEntityLogEntries(dossier, entityLogEntries, addedLocalManualEntries, analysisNumber, allManualChanges); + processEntityLogEntries(dossier, entityLogEntries, addedLocalManualEntries, analysisNumber, allManualChanges, trackLocalChangesBasedOnDictEntriesMap); + + adjustEntityLogEntriesAfterLocalChangesBasedOnDict(entityLogEntries, trackLocalChangesBasedOnDictEntriesMap, analysisNumber); } + private void adjustEntityLogEntriesAfterLocalChangesBasedOnDict(List entityLogEntries, Map trackLocalChangesBasedOnDictEntriesMap, int analysisNumber) { + var dictEntryIdsToUpdate = trackLocalChangesBasedOnDictEntriesMap.values(); + entityLogEntries.stream().filter(entityLogEntry -> dictEntryIdsToUpdate.contains(entityLogEntry.getId())) + .forEach(entityLogEntry -> { + List changes = new ArrayList<>(); + changes.add(ChangeFactory.toChange(ChangeType.REMOVED, + OffsetDateTime.now(), + analysisNumber, + PropertyChange.builder().property("state").oldValue(entityLogEntry.getState().name()).newValue(EntryState.REMOVED.name()).build())); + addChanges(entityLogEntry, changes); + entityLogEntry.setState(EntryState.REMOVED); + }); + } private void processEntityLogEntries(DossierEntity dossier, List entityLogEntries, Map addedLocalManualEntries, int analysisNumber, - Map> allManualChanges) { + Map> allManualChanges, + Map trackLocalChangesBasedOnDictEntriesMap) { int numberOfAddedPendingEntries = 0; // since list is dynamically growing we need to keep track of the number of added pending entries to ignore them in the loop for (int i = 0; i + numberOfAddedPendingEntries < entityLogEntries.size(); i++) { @@ -135,7 +153,8 @@ public class EntityLogMergeService { List pendingImageRecategorizations = mergeLocalManualChangesAndReturnNonMergeableAsPending(dossier, allManualChanges, entityLogEntry, - analysisNumber); + analysisNumber, + trackLocalChangesBasedOnDictEntriesMap); List pendingDictionaryEntries = buildPendingDictionaryEntries(allManualChanges, entityLogEntry); // insert pending entries directly after the associated entry to enable performant linking in UI @@ -226,7 +245,8 @@ public class EntityLogMergeService { private List mergeLocalManualChangesAndReturnNonMergeableAsPending(DossierEntity dossier, Map> allManualChanges, EntityLogEntry entityLogEntry, - int analysisNumber) { + int analysisNumber, + Map trackLocalChangesBasedOnDictEntriesMap) { return allManualChanges.getOrDefault(entityLogEntry.getId(), Collections.emptyList()) .stream() @@ -235,14 +255,27 @@ public class EntityLogMergeService { .map(localChange -> { if (localChange instanceof IdRemoval idRemoval) { mergeIdToRemove(idRemoval, entityLogEntry, analysisNumber); + if (trackLocalChangesBasedOnDictEntriesMap.containsKey(idRemoval.getAnnotationId())) { + trackLocalChangesBasedOnDictEntriesMap.remove(idRemoval.getAnnotationId()); + } return null; } else if (localChange instanceof ManualResizeRedaction manualResizeRedaction) { mergeResizeRedaction(manualResizeRedaction, entityLogEntry, analysisNumber); + if (manualResizeRedaction.getBasedOnDictAnnotationId() != null) { + trackLocalChangesBasedOnDictEntriesMap.put(manualResizeRedaction.getAnnotationId(), manualResizeRedaction.getBasedOnDictAnnotationId()); + } + return null; } else if (localChange instanceof ManualLegalBasisChange manualLegalBasisChange) { mergeLegalBasisChange(manualLegalBasisChange, entityLogEntry, analysisNumber); + if (manualLegalBasisChange.getBasedOnDictAnnotationId() != null) { + trackLocalChangesBasedOnDictEntriesMap.put(manualLegalBasisChange.getAnnotationId(), manualLegalBasisChange.getBasedOnDictAnnotationId()); + } return null; } else if (localChange instanceof ManualRecategorization manualRecategorization) { + if (manualRecategorization.getBasedOnDictAnnotationId() != null) { + trackLocalChangesBasedOnDictEntriesMap.put(manualRecategorization.getAnnotationId(), manualRecategorization.getBasedOnDictAnnotationId()); + } return mergeRecategorization(manualRecategorization, entityLogEntry, dossier, analysisNumber); } else if (localChange instanceof ManualForceRedaction manualForceRedaction) { mergeForceRedaction(manualForceRedaction, entityLogEntry, analysisNumber); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionMapper.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionMapper.java index a37dd0bba..c0281533e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionMapper.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionMapper.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.UUID; import java.util.function.Consumer; import org.springframework.stereotype.Service; @@ -155,6 +156,7 @@ public class ManualRedactionMapper { for (LegalBasisChangeRequestModel legalBasisChangeRequest : legalBasisChangeRequests) { + String uuid = UUID.randomUUID().toString(); EntityLogEntry entityLogEntry = entityLogMongoWrapperService.getEntityLogEntryById(dossierId, fileId, legalBasisChangeRequest.getAnnotationId()); LegalBasisChangeRequest request = LegalBasisChangeRequest.builder() .annotationId(legalBasisChangeRequest.getAnnotationId()) @@ -166,7 +168,10 @@ public class ManualRedactionMapper { .build(); if (!entityLogEntry.getEngines().contains(Engine.MANUAL) && entryIsEntityType(entityLogEntry)) { + request.setBasedOnDictAnnotationId(legalBasisChangeRequest.getAnnotationId()); + entityLogEntry.setId(uuid); manualRedactionEntryConsumer.accept(entityLogEntry); + request.setAnnotationId(uuid); } requests.add(RequestEntryPair.builder().request(request).entityLogEntry(entityLogEntry).build()); @@ -197,6 +202,7 @@ public class ManualRedactionMapper { entityLogEntries.forEach(entityLogEntry -> { String changedValue; String changedTypeId; + String uuid = UUID.randomUUID().toString(); if (recategorizationRequest.isAddToDictionary() || recategorizationRequest.isAddToAllDossiers()) { changedValue = recategorizationRequest.getValue(); @@ -233,7 +239,10 @@ public class ManualRedactionMapper { && !recategorizationRequest.isAddToAllDossiers() && !recategorizationRequest.isAddToDictionary() && entryIsEntityType(entityLogEntry)) { + request.setBasedOnDictAnnotationId(recategorizationRequest.getAnnotationId()); + entityLogEntry.setId(uuid); manualRedactionEntryConsumer.accept(entityLogEntry); + request.setAnnotationId(uuid); } requests.add(RequestEntryPair.builder().request(request).entityLogEntry(entityLogEntry).build()); @@ -289,6 +298,8 @@ public class ManualRedactionMapper { for (ResizeRedactionRequestModel resizeRedactionRequest : resizeRedactionRequests) { entityLogEntries.forEach(entityLogEntry -> { + String uuid = UUID.randomUUID().toString(); + ResizeRedactionRequest request = ResizeRedactionRequest.builder() .annotationId(resizeRedactionRequest.getAnnotationId()) .user(KeycloakSecurity.getUserId()) @@ -300,11 +311,13 @@ public class ManualRedactionMapper { .build(); if (!entityLogEntry.getEngines().contains(Engine.MANUAL) - && entryIsEntityType(entityLogEntry) && !request.isAddToAllDossiers() && !request.getUpdateDictionary() && entryIsEntityType(entityLogEntry)) { + request.setBasedOnDictAnnotationId(resizeRedactionRequest.getAnnotationId()); + entityLogEntry.setId(uuid); manualRedactionEntryConsumer.accept(entityLogEntry); + request.setAnnotationId(uuid); } requests.add(RequestEntryPair.builder().request(request).entityLogEntry(entityLogEntry).build()); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml index 97fd16e95..4c2b13bbe 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml @@ -214,4 +214,6 @@ databaseChangeLog: - include: file: db/changelog/tenant/130-add-primary-key-constraint-download-status-reports.yaml - include: - file: db/changelog/tenant/131-changed-max-size-for-id-in-entity.yaml \ No newline at end of file + file: db/changelog/tenant/131-changed-max-size-for-id-in-entity.yaml + - include: + file: db/changelog/tenant/132-add-based-on-dict-annotation-id-to-manual_changes.yaml \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/132-add-based-on-dict-annotation-id-to-manual_changes.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/132-add-based-on-dict-annotation-id-to-manual_changes.yaml new file mode 100644 index 000000000..8d1babada --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/132-add-based-on-dict-annotation-id-to-manual_changes.yaml @@ -0,0 +1,45 @@ +databaseChangeLog: + - changeSet: + id: add-annotation-info-to-manual-resize + author: colariu + changes: + - addColumn: + columns: + - column: + name: based_on_dict_annotation_id + type: VARCHAR(255) + tableName: manual_resize_redaction + - changeSet: + id: add-annotation-info-to-manual-legal-basis-change + author: colariu + changes: + - addColumn: + columns: + - column: + name: based_on_dict_annotation_id + type: VARCHAR(255) + tableName: manual_legal_basis_change + - changeSet: + id: add-annotation-info-to-manual-recategorization + author: colariu + changes: + - addColumn: + columns: + - column: + name: based_on_dict_annotation_id + type: VARCHAR(255) + tableName: manual_recategorization +# - changeSet: +# id: add-annotation-info-to-manual-force-redaction +# author: colariu +# changes: +# - addColumn: +# columns: +# - column: +# name: based_on_dict_annotation_id +# type: VARCHAR(255) +# - column: +# name: based_on_dict_entry +# type: BOOLEAN +# defaultValue: false +# tableName: manual_force_redaction \ 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/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 3e24ecb59..61baa7d5c 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 @@ -378,6 +378,115 @@ public class EntityLogMergeTest { .get(index + 1).getState(), EntryState.PENDING); } + //dict entry, resize local + @Test + public void testMergeEntityLogWithManualResizeBasedOnDictRedaction() { + + 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 entryToRecategorizeId = 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))) + .build(); + + var entityLog = provideEntityLog(entryToRemoveId, dictEntryToResizeId, entryLegalBasisId, forceRedactionId, entryToRecategorizeId, 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 optionalResizeEntryLogEntry = response.getEntityLogEntry() + .stream() + .filter(entityLogEntry1 -> entityLogEntry1.getId().equals(dictEntryToResizeId)) + .findFirst(); + assertTrue(optionalResizeEntryLogEntry.isPresent()); + assertEquals(EntryType.ENTITY, optionalResizeEntryLogEntry.get().getEntryType()); + assertEquals(EntryState.REMOVED, optionalResizeEntryLogEntry.get().getState()); + + var optionalResizeEntryLogEntry2 = response.getEntityLogEntry() + .stream() + .filter(entityLogEntry -> entityLogEntry.getId().equals(localId)) + .findFirst(); + assertTrue(optionalResizeEntryLogEntry2.isPresent()); + assertEquals(EntryType.ENTITY, optionalResizeEntryLogEntry2.get().getEntryType()); + assertEquals(EntryState.APPLIED, optionalResizeEntryLogEntry2.get().getState()); + assertFalse(optionalResizeEntryLogEntry.get().getId().equals(optionalResizeEntryLogEntry2.get().getId())); + } + + + //dict entry, resize local, remove local + @Test + public void testMergeEntityLogWithManualResizeAndRemoveChangesOnDictRedaction() { + + 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 entryToRecategorizeId = 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, entryToRecategorizeId, 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 optionalResizeEntryLogEntry = response.getEntityLogEntry() + .stream() + .filter(entityLogEntry1 -> entityLogEntry1.getId().equals(dictEntryToResizeId)) + .findFirst(); + assertTrue(optionalResizeEntryLogEntry.isPresent()); + assertEquals(EntryType.ENTITY, optionalResizeEntryLogEntry.get().getEntryType()); + assertEquals(EntryState.APPLIED, optionalResizeEntryLogEntry.get().getState()); + + var optionalResizeEntryLogEntry2 = response.getEntityLogEntry() + .stream() + .filter(entityLogEntry -> entityLogEntry.getId().equals(localId)) + .findFirst(); + assertTrue(optionalResizeEntryLogEntry2.isPresent()); + assertEquals(EntryType.ENTITY, optionalResizeEntryLogEntry2.get().getEntryType()); + assertEquals(EntryState.REMOVED, optionalResizeEntryLogEntry2.get().getState()); + assertFalse(optionalResizeEntryLogEntry.get().getId().equals(optionalResizeEntryLogEntry2.get().getId())); + + } + @Test void testMergeEntityLogWithManualAddAndRemoveChanges() { @@ -638,6 +747,7 @@ public class EntityLogMergeTest { .addToAllDossiers(false) .user("User") .fileId("file") + .basedOnDictAnnotationId(dictId) .build(); } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/LegalBasisChangeRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/LegalBasisChangeRequest.java index 881a9b943..4fa22c81a 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/LegalBasisChangeRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/LegalBasisChangeRequest.java @@ -18,5 +18,6 @@ public class LegalBasisChangeRequest { private int page; private String section; private String value; + private String basedOnDictAnnotationId; } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/RecategorizationRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/RecategorizationRequest.java index 2ddf01546..fdf9fae41 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/RecategorizationRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/RecategorizationRequest.java @@ -30,6 +30,7 @@ public class RecategorizationRequest implements ManualRequestWithAddToDictionary private DictionaryEntryType dictionaryEntryType; String legalBasis; String section; + private String basedOnDictAnnotationId; @Override diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ResizeRedactionRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ResizeRedactionRequest.java index 3fcf5792b..4d953df28 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ResizeRedactionRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ResizeRedactionRequest.java @@ -28,5 +28,6 @@ public class ResizeRedactionRequest { private String textAfter; private boolean addToAllDossiers; + private String basedOnDictAnnotationId; } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualLegalBasisChange.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualLegalBasisChange.java index c04f12e80..cd487f3b7 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualLegalBasisChange.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualLegalBasisChange.java @@ -16,6 +16,7 @@ public class ManualLegalBasisChange extends BaseAnnotation { private String section; private String value; private String legalBasis; + private String basedOnDictAnnotationId; @Override diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualRecategorization.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualRecategorization.java index 91bcbd8e3..f7435c18c 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualRecategorization.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualRecategorization.java @@ -19,6 +19,7 @@ public class ManualRecategorization extends BaseAnnotation { private boolean addToAllDossiers; private String section; private String value; + private String basedOnDictAnnotationId; @Override diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualResizeRedaction.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualResizeRedaction.java index fa200692a..1cd0d588f 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualResizeRedaction.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualResizeRedaction.java @@ -24,6 +24,7 @@ public class ManualResizeRedaction extends BaseAnnotation { private String textAfter; private Boolean updateDictionary; private boolean addToAllDossiers; + private String basedOnDictAnnotationId; @Override -- 2.47.2 From 0bf85842c19f72a7f4ca50af5d59d812580bc64f Mon Sep 17 00:00:00 2001 From: corinaolariu Date: Wed, 10 Jul 2024 16:03:09 +0300 Subject: [PATCH 2/3] RED-9495 - Remove here for locally resized dictionary entry should remove the entry completly - rollback changes for another ticket --- .../api/impl/controller/ManualRedactionController.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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/ManualRedactionController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java index f937bfca0..0bd75f712 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java @@ -71,13 +71,12 @@ public class ManualRedactionController implements ManualRedactionResource { public void undo(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set annotationIds, - @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed, - @RequestParam(value = "localOnly", required = false, defaultValue = FALSE) boolean localOnly) { + @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) { accessControlService.checkDossierExistenceAndAccessPermissionsToDossier(dossierId); accessControlService.verifyFileIsNotApproved(dossierId, fileId); accessControlService.verifyUserIsApprover(dossierId); - manualRedactionUndoService.undo(dossierId, fileId, annotationIds, includeUnprocessed, localOnly); + manualRedactionUndoService.undo(dossierId, fileId, annotationIds, includeUnprocessed); } -- 2.47.2 From 3fefb8efab7cf8528c1e95243549ece22ab2b209 Mon Sep 17 00:00:00 2001 From: corinaolariu Date: Thu, 11 Jul 2024 10:50:51 +0300 Subject: [PATCH 3/3] RED-9495 - Remove here for locally resized dictionary entry should remove the entry completly - update unit tests --- .../tests/ManualRedactionTest.java | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) 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 2fadcf156..a429d649c 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 @@ -5,6 +5,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -56,6 +57,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualRedactionType; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualAddResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactionResponse; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; import com.iqser.red.service.persistence.service.v1.api.shared.model.dictionary.Dictionary; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; @@ -1701,22 +1703,22 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { when(entityLogService.getEntityLog(any(), any(), anyBoolean())).thenReturn(entityLog); - manualRedactionClient.recategorizeBulk(dossier.getId(), - file.getId(), - Set.of(RecategorizationRequestModel.builder().annotationId("dv").legalBasis("").section("section").type(type.getType()).build()), - false); + ManualRedactionResponse response = manualRedactionClient.recategorizeBulk(dossier.getId(), + file.getId(), + Set.of(RecategorizationRequestModel.builder().annotationId("dv").legalBasis("").section("section").type(type.getType()).build()), + false); var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); assertEquals(allManualRedactions.getRecategorizations().size(), 1); assertTrue(allManualRedactions.getRecategorizations() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals("dv"))); + .anyMatch(entry -> entry.getAnnotationId().equals(response.getManualAddResponses().get(0).getAnnotationId()))); var unprocessedManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), true, true); assertEquals(unprocessedManualRedactions.getRecategorizations().size(), 1); assertTrue(unprocessedManualRedactions.getRecategorizations() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals("dv"))); + .anyMatch(entry -> entry.getAnnotationId().equals(response.getManualAddResponses().get(0).getAnnotationId()))); fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), @@ -1728,7 +1730,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { .dossierId(dossier.getId()) .build()); - manualRedactionClient.recategorizeBulk(dossier.getId(), + ManualRedactionResponse response2 = manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(RecategorizationRequestModel.builder().annotationId("dv2").legalBasis("").section("section").type(type.getType()).build()), false); @@ -1737,19 +1739,19 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { assertEquals(allManualRedactions.getRecategorizations().size(), 2); assertTrue(allManualRedactions.getRecategorizations() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals("dv"))); + .anyMatch(entry -> entry.getAnnotationId().equals(response.getManualAddResponses().get(0).getAnnotationId()))); assertTrue(allManualRedactions.getRecategorizations() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals("dv2"))); + .anyMatch(entry -> entry.getAnnotationId().equals(response2.getManualAddResponses().get(0).getAnnotationId()))); unprocessedManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), true, true); assertEquals(unprocessedManualRedactions.getRecategorizations().size(), 1); assertTrue(unprocessedManualRedactions.getRecategorizations() .stream() - .noneMatch(entry -> entry.getAnnotationId().equals("dv"))); + .noneMatch(entry -> entry.getAnnotationId().equals(response.getManualAddResponses().get(0).getAnnotationId()))); assertTrue(unprocessedManualRedactions.getRecategorizations() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals("dv2"))); + .anyMatch(entry -> entry.getAnnotationId().equals(response2.getManualAddResponses().get(0).getAnnotationId()))); fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), @@ -1765,10 +1767,10 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { assertEquals(allManualRedactions.getRecategorizations().size(), 2); assertTrue(allManualRedactions.getRecategorizations() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals("dv"))); + .anyMatch(entry -> entry.getAnnotationId().equals(response.getManualAddResponses().get(0).getAnnotationId()))); assertTrue(allManualRedactions.getRecategorizations() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals("dv2"))); + .anyMatch(entry -> entry.getAnnotationId().equals(response2.getManualAddResponses().get(0).getAnnotationId()))); unprocessedManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), true, true); assertTrue(unprocessedManualRedactions.getRecategorizations().isEmpty()); @@ -2105,13 +2107,13 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { .section("overriddenSection") .build(); - manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recatModel), false); + ManualRedactionResponse response =manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recatModel), false); var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); assertEquals(1, allManualRedactions.getRecategorizations().size()); assertTrue(allManualRedactions.getRecategorizations() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals("annotationId"))); + .anyMatch(entry -> entry.getAnnotationId().equals(response.getManualAddResponses().get(0).getAnnotationId()))); assertTrue(allManualRedactions.getRecategorizations() .stream() .anyMatch(entry -> entry.getLegalBasis().equals("lb2"))); @@ -2590,7 +2592,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Test - public void testLocalLegalBasisChange() { + public void testLocalLegalBasisChangeOnDictEntry() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); @@ -2626,7 +2628,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { .build())) .getManualAddResponses().get(0); - assertEquals(response.getEntityLogEntry().getId(), "AnnotationId"); + assertNotEquals(response.getEntityLogEntry().getId(), "AnnotationId"); assertEquals(response.getEntityLogEntry().getLegalBasis(), "new legal basis"); assertEquals(response.getEntityLogEntry().getManualChanges() .get(0).getManualRedactionType(), ManualRedactionType.LEGAL_BASIS_CHANGE); @@ -2635,7 +2637,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { } @Test - public void testLocalResize() { + public void testLocalResizeOnDictEntry() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); @@ -2674,7 +2676,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { false) .getManualAddResponses().get(0); - assertEquals(response.getEntityLogEntry().getId(), "AnnotationId"); + assertNotEquals(response.getEntityLogEntry().getId(), "AnnotationId"); assertEquals(response.getEntityLogEntry().getValue(), "Luke"); assertEquals(response.getEntityLogEntry().getPositions().get(0).getRectangle()[0], 5f); assertEquals(response.getEntityLogEntry().getPositions().get(0).getRectangle()[1], 5f); @@ -2688,7 +2690,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Test - public void testLocalRecategorize() { + public void testLocalRecategorizeOnDictEntry() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); @@ -2729,7 +2731,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { false) .getManualAddResponses().get(0); - assertEquals(response.getEntityLogEntry().getId(), "AnnotationId"); + assertNotEquals(response.getEntityLogEntry().getId(), "AnnotationId"); assertEquals(response.getEntityLogEntry().getType(), type2.getType()); assertEquals(response.getEntityLogEntry().getManualChanges() .get(0).getManualRedactionType(), ManualRedactionType.RECATEGORIZE); @@ -2832,7 +2834,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { false) .getManualAddResponses().get(0); - assertEquals(response.getEntityLogEntry().getId(), "AnnotationId"); + assertNotEquals(response.getEntityLogEntry().getId(), "AnnotationId"); assertEquals(response.getEntityLogEntry().getType(), type2.getType()); assertEquals(response.getEntityLogEntry().getManualChanges() .get(0).getManualRedactionType(), ManualRedactionType.RECATEGORIZE); -- 2.47.2