From 75847a43d5e6d1482a19894e3a62dd5957606daf Mon Sep 17 00:00:00 2001 From: Andrei Isvoran Date: Thu, 26 Oct 2023 15:37:33 +0300 Subject: [PATCH 1/5] RED-7782 - Merge unprocessed redactions into entity log without re-analysis. --- .../impl/controller/EntityLogController.java | 5 +- .../external/resource/EntityLogResource.java | 7 +- .../EntityLogInternalController.java | 5 +- .../internal/resources/EntityLogResource.java | 5 +- .../UnprocessedManualEntityClient.java | 10 + .../processor/service/EntityLogService.java | 218 ++++++++++++++- .../integration/tests/EntityLogTest.java | 260 ++++++++++++++++++ .../tests/ManualRedactionTest.java | 10 +- .../AbstractPersistenceServerServiceTest.java | 125 +++++---- .../v1/api/shared/model/MessageType.java | 3 +- persistence-service-v1/pom.xml | 2 +- 11 files changed, 589 insertions(+), 61 deletions(-) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionservice/UnprocessedManualEntityClient.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogTest.java 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 72965545b..fa33c61bf 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 @@ -27,9 +27,10 @@ public class EntityLogController implements EntityLogResource { @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") public EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, - @RequestParam(value = "excludedType", required = false) List excludedTypes) { + @RequestParam(value = "excludedType", required = false) List excludedTypes, + @RequestParam(value = "unprocessed", required = false, defaultValue = FALSE) boolean unprocessed) { - return entityLogService.getEntityLog(dossierId, fileId, excludedTypes); + return entityLogService.getEntityLog(dossierId, fileId, excludedTypes, unprocessed); } 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 289537a36..ef7c8133c 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 @@ -29,13 +29,16 @@ public interface EntityLogResource { String DOSSIER_ID = "dossierId"; String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + String FALSE = "false"; @GetMapping(value = ENTITY_LOG_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Gets the entity log for a fileId", description = "None") + @Operation(summary = "Gets the entity log for a fileId", description = "Gets the entity log for a given file. The flag includeUnprocessed will merge into the entity log all the unprocessed changes if it's set to true." + + "Default value for the flag is false.") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The entity log is not found.")}) EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, - @RequestParam(value = "excludedType", required = false) List excludedTypes); + @RequestParam(value = "excludedType", required = false) List excludedTypes, + @RequestParam(value = "unprocessed", 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 5ec246486..e6d1e6f32 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 @@ -21,9 +21,10 @@ 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 = "excludedType", required = false) List excludedTypes, + @RequestParam(value = "unprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) { - return entityLogService.getEntityLog(dossierId, fileId, excludedTypes); + 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 95cd6c908..9b8adc609 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 @@ -26,11 +26,14 @@ public interface EntityLogResource { String DOSSIER_ID = "dossierId"; String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + String FALSE = "false"; + @GetMapping(value = ENTITY_LOG_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Gets the entity log for a fileId", description = "None") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The entity log is not found.")}) EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, - @RequestParam(value = "excludedType", required = false) List excludedTypes); + @RequestParam(value = "excludedType", required = false) List excludedTypes, + @RequestParam(value = "unprocessed", 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/client/redactionservice/UnprocessedManualEntityClient.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionservice/UnprocessedManualEntityClient.java new file mode 100644 index 000000000..4378485c4 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionservice/UnprocessedManualEntityClient.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.management.v1.processor.client.redactionservice; + +import org.springframework.cloud.openfeign.FeignClient; + +import com.iqser.red.service.redaction.v1.resources.UnprocessedManualEntityResource; + +@FeignClient(name = "UnprocessedManualEntityClient", url = "${redaction-service.url}") +public interface UnprocessedManualEntityClient extends UnprocessedManualEntityResource { + +} 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 88bc4ebbd..b46109a65 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 @@ -3,37 +3,63 @@ package com.iqser.red.service.persistence.management.v1.processor.service; import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +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.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.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; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.FilteredEntityLogRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualChange; +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.ManualRedactions; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualLegalBasisChange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; +import com.iqser.red.service.redaction.v1.model.UnprocessedManualEntity; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; @Service @RequiredArgsConstructor @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +@Slf4j public class EntityLogService { FileManagementStorageService fileManagementStorageService; FileStatusService fileStatusService; + ManualRedactionProviderService manualRedactionProviderService; + UnprocessedManualEntityClient unprocessedManualEntityClient; + private final DossierService dossierService; CommentService commentService; public EntityLog getEntityLog(String dossierId, String fileId) { - return getEntityLog(dossierId, fileId, Collections.emptyList()); + return getEntityLog(dossierId, fileId, Collections.emptyList(), false); } - public EntityLog getEntityLog(String dossierId, String fileId, List excludedTypes) { + public EntityLog getEntityLog(String dossierId, String fileId, List excludedTypes, boolean includeUnprocessed) { var fileStatus = fileStatusService.getStatus(fileId); @@ -49,6 +75,12 @@ public class EntityLogService { entityLog.getEntityLogEntry().removeIf(entry -> excludedTypes.contains(entry.getType())); } + if (includeUnprocessed) { + ManualRedactions manualRedactions = manualRedactionProviderService.getManualRedactions(fileId, true); + List unprocessedManualEntities = getUnprocessedManualEntities(dossierId, fileId, manualRedactions); + mergeEntityLog(manualRedactions, unprocessedManualEntities, entityLog); + } + Map commentCountPerAnnotationId = commentService.getCommentCounts(fileId); entityLog.getEntityLogEntry().forEach(entityLogEntry -> entityLogEntry.setNumberOfComments(commentCountPerAnnotationId.getOrDefault(entityLogEntry.getId(), 0))); @@ -62,7 +94,7 @@ public class EntityLogService { filteredEntityLogRequest.setSpecifiedDate(OffsetDateTime.MIN); } - var entityLog = getEntityLog(dossierId, fileId, filteredEntityLogRequest.getExcludedTypes()); + var entityLog = getEntityLog(dossierId, fileId, filteredEntityLogRequest.getExcludedTypes(), false); var entityLogEntry = entityLog.getEntityLogEntry(); Iterator it = entityLogEntry.iterator(); @@ -92,4 +124,184 @@ public class EntityLogService { return entityLog; } + private List getUnprocessedManualEntities(String dossierId, String fileId, ManualRedactions manualRedactions) { + + DossierEntity dossier = dossierService.getDossierById(dossierId); + return unprocessedManualEntityClient.mergeUnprocessedManualEntities(fileId, dossierId, dossier.getDossierTemplateId(), manualRedactions); + + } + + public void mergeEntityLog(ManualRedactions manualRedactions, List unprocessedManualEntities, EntityLog entityLog) { + + log.info("Merging EntityLog"); + mergeManualRedactionEntries(manualRedactions.getEntriesToAdd(), unprocessedManualEntities, entityLog); + mergeIdsToRemove(manualRedactions.getIdsToRemove(), entityLog); + mergeResizeRedactions(manualRedactions.getResizeRedactions(), entityLog); + mergeLegalBasisChanges(manualRedactions.getLegalBasisChanges(), entityLog); + mergeRecategorizations(manualRedactions.getRecategorizations(), entityLog); + mergeForceRedactions(manualRedactions.getForceRedactions(), entityLog); + log.info("EntityLog merged successfully!"); + } + + + private void mergeManualRedactionEntries(Set manualRedactionEntries, List unprocessedManualEntities, EntityLog entityLog) { + + manualRedactionEntries.forEach(manualRedactionEntry -> { + UnprocessedManualEntity unprocessedManualEntity = unprocessedManualEntities.stream() + .filter(manualEntity -> manualEntity.getAnnotationId().equals(manualRedactionEntry.getAnnotationId())) + .findFirst().orElseThrow(() -> new NotFoundException("Entry with annotationId " + manualRedactionEntry.getAnnotationId() + " not found")); + List changes = new ArrayList<>(); + changes.add(Change.builder() + .analysisNumber(1) + .dateTime(OffsetDateTime.now()) + .type(ChangeType.ADDED) + .build()); + entityLog.getEntityLogEntry().add(EntityLogEntry.builder() + .id(manualRedactionEntry.getAnnotationId()) + .type(manualRedactionEntry.getType()) + .value(manualRedactionEntry.getValue()) + .legalBasis(manualRedactionEntry.getLegalBasis()) + .reason(manualRedactionEntry.getReason()) + .entryType(isHint(manualRedactionEntry.getType()) ? EntryType.HINT : EntryType.ENTITY) + .imported(false) + .matchedRule("") + .section(manualRedactionEntry.getSection()) + .color(unprocessedManualEntity.getColor()) + .positions(unprocessedManualEntity.getPositions()) + .textAfter(unprocessedManualEntity.getTextAfter()) + .textBefore(unprocessedManualEntity.getTextBefore()) + .startOffset(unprocessedManualEntity.getStartOffset()) + .endOffset(unprocessedManualEntity.getEndOffset()) + .containingNodeId(unprocessedManualEntity.getContainingNodeId()) + .closestHeadline(unprocessedManualEntity.getClosestHeadline()) + .imageHasTransparency(false) + .dictionaryEntry(manualRedactionEntry.isAddToDictionary()) + .dossierDictionaryEntry(manualRedactionEntry.isAddToDossierDictionary()) + .excluded(false) + .changes(changes) + .manualChanges(List.of(ManualChange.builder() + .manualRedactionType(ManualRedactionType.ADD_LOCALLY) + .requestedDate(manualRedactionEntry.getRequestDate()) + .processedDate(manualRedactionEntry.getProcessedDate()) + .userId(manualRedactionEntry.getUser()) + .propertyChanges(Map.of("value", manualRedactionEntry.getValue())) + .build())) + .engines(new HashSet<>()) + .reference(new HashSet<>()) + .importedRedactionIntersections(new HashSet<>()) + .build()); + }); + } + + + private void mergeIdsToRemove(Set idRemovals, EntityLog entityLog) { + + 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().getManualChanges().add(ManualChange.builder() + .manualRedactionType(ManualRedactionType.REMOVE_LOCALLY) + .requestedDate(idRemoval.getRequestDate()) + .processedDate(idRemoval.getProcessedDate()) + .userId(idRemoval.getUser()).build()); + } + }); + } + + private void mergeResizeRedactions(Set manualResizeRedactions, EntityLog entityLog) { + + manualResizeRedactions.forEach(manualResizeRedaction -> { + var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(manualResizeRedaction.getAnnotationId())).findAny(); + if (entity.isPresent()) { + var newPosition = manualResizeRedaction.getPositions().get(0); + entity.get().setPositions(List.of(new Position( + newPosition.getTopLeftX(), + newPosition.getTopLeftY(), + newPosition.getWidth(), + newPosition.getHeight(), + newPosition.getPage()))); + addChanges(entity.get().getChanges(), ChangeType.CHANGED); + entity.get().getManualChanges().add(ManualChange.builder() + .manualRedactionType(ManualRedactionType.RESIZE) + .requestedDate(manualResizeRedaction.getRequestDate()) + .processedDate(manualResizeRedaction.getProcessedDate()) + .userId(manualResizeRedaction.getUser()).build()); + } + }); + } + + private void mergeLegalBasisChanges(Set manualLegalBasisChanges, EntityLog entityLog) { + + manualLegalBasisChanges.forEach(manualLegalBasisChange -> { + 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().getManualChanges().add(ManualChange.builder() + .manualRedactionType(ManualRedactionType.LEGAL_BASIS_CHANGE) + .requestedDate(manualLegalBasisChange.getRequestDate()) + .processedDate(manualLegalBasisChange.getProcessedDate()) + .propertyChanges(Map.of("value", manualLegalBasisChange.getValue())) + .userId(manualLegalBasisChange.getUser()) + .build()); + } + }); + } + + private void mergeRecategorizations(Set recategorizations, EntityLog entityLog) { + + recategorizations.forEach(recategorization -> { + 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); + entity.get().getManualChanges().add(ManualChange.builder() + .manualRedactionType(ManualRedactionType.RECATEGORIZE) + .requestedDate(recategorization.getRequestDate()) + .processedDate(recategorization.getProcessedDate()) + .userId(recategorization.getUser()) + .build()); + } + }); + } + + private void mergeForceRedactions(Set forceRedactions, EntityLog entityLog) { + + forceRedactions.forEach(forceRedaction -> { + var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(forceRedaction.getAnnotationId())).findAny(); + if (entity.isPresent()) { + entity.get().setLegalBasis(forceRedaction.getLegalBasis()); + entity.get().setState(EntryState.APPLIED); + addChanges(entity.get().getChanges(), ChangeType.CHANGED); + entity.get().getManualChanges().add(ManualChange.builder() + .manualRedactionType(ManualRedactionType.FORCE_REDACT) + .requestedDate(forceRedaction.getRequestDate()) + .processedDate(forceRedaction.getProcessedDate()) + .userId(forceRedaction.getUser()) + .build()); + } + }); + } + + private void addChanges(List changes, ChangeType changeType) { + + if (!changes.isEmpty()) { + var lastChange = changes.get(changes.size() -1); + changes.add(Change.builder() + .analysisNumber(lastChange.getAnalysisNumber() + 1) + .dateTime(OffsetDateTime.now()) + .type(changeType) + .build()); + } else { + changes.add(Change.builder().analysisNumber(1).dateTime(OffsetDateTime.now()).type(changeType).build()); + } + } + + private boolean isHint(String manualRedactionEntryType) { + + return !(manualRedactionEntryType.equals("manual")); + } + } 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 new file mode 100644 index 000000000..6934c76d5 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogTest.java @@ -0,0 +1,260 @@ +package com.iqser.red.service.peristence.v1.server.integration.tests; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +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.Mockito.when; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; + +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.management.v1.processor.client.redactionservice.UnprocessedManualEntityClient; +import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogService; +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.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; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType; +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.ManualRedactions; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualLegalBasisChange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.redaction.v1.model.UnprocessedManualEntity; + +public class EntityLogTest extends AbstractPersistenceServerServiceTest { + + @Autowired + private FileTesterAndProvider fileTesterAndProvider; + + @Autowired + private DossierTesterAndProvider dossierTesterAndProvider; + + @Autowired + private DossierTemplateTesterAndProvider dossierTemplateTesterAndProvider; + + @Autowired + private FileStatusService fileStatusService; + + @Autowired + private FileManagementStorageService fileManagementStorageService; + + @MockBean + private ManualRedactionProviderService manualRedactionProviderService; + + @MockBean + private UnprocessedManualEntityClient unprocessedManualEntityClient; + + @Autowired + private EntityLogService entityLogService; + + + @Test + public void testGetEntityLogWithUnprocessedRedactions() { + + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); + var file = fileTesterAndProvider.testAndProvideFile(dossier); + + String entryToAddId = UUID.randomUUID().toString(); + String entryToRemoveId = UUID.randomUUID().toString(); + String entryToResizeId = UUID.randomUUID().toString(); + String entryLegalBasisId = UUID.randomUUID().toString(); + String forceRedactionId = UUID.randomUUID().toString(); + + ManualRedactions manualRedactions = provideManualRedactions(entryToAddId, entryToRemoveId, entryToResizeId, entryLegalBasisId, forceRedactionId, file.getId()); + UnprocessedManualEntity unprocessedManualEntity = UnprocessedManualEntity.builder() + .textBefore("textBefore") + .textAfter("textAfter") + .containingNodeId(List.of(0, 0)) + .endOffset(10) + .startOffset(1) + .annotationId(entryToAddId) + .closestHeadline("closestHeadline") + .color(new float[]{0,0,0}) + .build(); + + var entityLog = provideEntityLog(entryToRemoveId, entryToResizeId, entryLegalBasisId, forceRedactionId); + fileManagementStorageService.storeJSONObject(dossier.getId(), file.getId(), FileType.ENTITY_LOG, entityLog); + + when(manualRedactionProviderService.getManualRedactions(file.getId(), true)).thenReturn(manualRedactions); + when(unprocessedManualEntityClient.mergeUnprocessedManualEntities(any(), any(), any(), any())).thenReturn(List.of(unprocessedManualEntity)); + + EntityLog response = entityLogService.getEntityLog(dossier.getId(), file.getId(), Collections.emptyList(), true); + + assertNotNull(response); + assertFalse(response.getEntityLogEntry().isEmpty()); + + var optionalEntityLogEntry = response.getEntityLogEntry().stream().filter(entityLogEntry1 -> entityLogEntry1.getId().equals(entryToAddId)).findFirst(); + assertTrue(optionalEntityLogEntry.isPresent()); + var entityLogEntry = optionalEntityLogEntry.get(); + assertEquals(entityLogEntry.getType(), "manual"); + assertEquals(entityLogEntry.getEntryType(), EntryType.ENTITY); + assertNull(entityLogEntry.getState()); + assertEquals(entityLogEntry.getValue(), "Test"); + assertEquals(entityLogEntry.getReason(), "Reason"); + assertEquals(entityLogEntry.getTextAfter(), "textAfter"); + assertEquals(entityLogEntry.getTextBefore(), "textBefore"); + assertEquals(entityLogEntry.getStartOffset(), 1); + assertEquals(entityLogEntry.getEndOffset(), 10); + assertEquals(entityLogEntry.getManualChanges().get(0).getManualRedactionType(), ManualRedactionType.ADD_LOCALLY); + + var optionalRemoveEntryLogEntry = response.getEntityLogEntry().stream().filter(entityLogEntry1 -> entityLogEntry1.getId().equals(entryToRemoveId)).findFirst(); + assertTrue(optionalRemoveEntryLogEntry.isPresent()); + var removeEntryLogEntry = optionalRemoveEntryLogEntry.get(); + assertEquals(removeEntryLogEntry.getEntryType(), EntryType.ENTITY); + assertEquals(removeEntryLogEntry.getState(), EntryState.REMOVED); + assertEquals(removeEntryLogEntry.getManualChanges().get(0).getManualRedactionType(), ManualRedactionType.REMOVE_LOCALLY); + assertEquals(removeEntryLogEntry.getChanges().get(0).getType(), ChangeType.REMOVED); + + var optionalResizeEntryLogEntry = response.getEntityLogEntry().stream().filter(entityLogEntry1 -> entityLogEntry1.getId().equals(entryToResizeId)).findFirst(); + assertTrue(optionalResizeEntryLogEntry.isPresent()); + var resizeEntryLogEntry = optionalResizeEntryLogEntry.get(); + assertEquals(resizeEntryLogEntry.getPositions().get(0).getRectangle()[0], 2); + assertEquals(resizeEntryLogEntry.getPositions().get(0).getRectangle()[1], 2); + assertEquals(resizeEntryLogEntry.getPositions().get(0).getRectangle()[2], 2); + assertEquals(resizeEntryLogEntry.getPositions().get(0).getRectangle()[3], 2); + assertEquals(resizeEntryLogEntry.getPositions().get(0).getPageNumber(), 1); + assertEquals(resizeEntryLogEntry.getEntryType(), EntryType.ENTITY); + assertEquals(resizeEntryLogEntry.getState(), EntryState.APPLIED); + assertEquals(resizeEntryLogEntry.getManualChanges().get(0).getManualRedactionType(), ManualRedactionType.RESIZE); + assertEquals(resizeEntryLogEntry.getChanges().get(0).getType(), ChangeType.CHANGED); + + var optionalLegalBasisEntryLogEntry = response.getEntityLogEntry().stream().filter(entityLogEntry1 -> entityLogEntry1.getId().equals(entryLegalBasisId)).findFirst(); + assertTrue(optionalLegalBasisEntryLogEntry.isPresent()); + var legalBasisEntryLogEntry = optionalLegalBasisEntryLogEntry.get(); + assertEquals(legalBasisEntryLogEntry.getLegalBasis(), "New legal basis"); + assertEquals(legalBasisEntryLogEntry.getEntryType(), EntryType.ENTITY); + assertEquals(legalBasisEntryLogEntry.getState(), EntryState.APPLIED); + assertEquals(legalBasisEntryLogEntry.getManualChanges().get(0).getManualRedactionType(), ManualRedactionType.LEGAL_BASIS_CHANGE); + assertEquals(legalBasisEntryLogEntry.getChanges().get(0).getType(), ChangeType.CHANGED); + + var optionalForceRedactionEntryLogEntry = response.getEntityLogEntry().stream().filter(entityLogEntry1 -> entityLogEntry1.getId().equals(forceRedactionId)).findFirst(); + assertTrue(optionalForceRedactionEntryLogEntry.isPresent()); + var forceRedactionEntryLogEntry = optionalForceRedactionEntryLogEntry.get(); + assertEquals(forceRedactionEntryLogEntry.getLegalBasis(), "Force"); + assertEquals(forceRedactionEntryLogEntry.getEntryType(), EntryType.ENTITY); + assertEquals(forceRedactionEntryLogEntry.getState(), EntryState.APPLIED); + assertEquals(forceRedactionEntryLogEntry.getManualChanges().get(0).getManualRedactionType(), ManualRedactionType.FORCE_REDACT); + assertEquals(forceRedactionEntryLogEntry.getChanges().get(0).getType(), ChangeType.CHANGED); + + } + + private EntityLog provideEntityLog(String entryToRemoveId, String entryToResizeId, String entryLegalBasisId, String forceRedactionId) { + + List positions = new ArrayList<>(); + positions.add(new Position(1, 1, 1, 1, 1)); + return new EntityLog(1, + 1, + List.of(EntityLogEntry.builder() + .id(entryToRemoveId) + .type("manual") + .value("Luke Skywalker") + .entryType(EntryType.ENTITY) + .state(EntryState.APPLIED) + .dictionaryEntry(true) + .build(), + EntityLogEntry.builder() + .id(entryToResizeId) + .type("manual") + .value("Darth Vader") + .entryType(EntryType.ENTITY) + .state(EntryState.APPLIED) + .dictionaryEntry(true) + .positions(positions) + .build(), + EntityLogEntry.builder() + .id(entryLegalBasisId) + .type("manual") + .value("Darth Luke") + .entryType(EntryType.ENTITY) + .state(EntryState.APPLIED) + .dictionaryEntry(true) + .positions(positions) + .build(), + EntityLogEntry.builder() + .id(forceRedactionId) + .type("manual") + .value("Darth Luke") + .entryType(EntryType.ENTITY) + .state(EntryState.APPLIED) + .dictionaryEntry(true) + .positions(positions) + .build()), + null, + 0, + 0, + 0, + 0); + } + + private ManualRedactions provideManualRedactions(String entryToAddId, String entryToRemoveId, String entryToResizeId, String entryLegalBasisId, String forceRedactionId, String fileId) { + + List positions = new ArrayList<>(); + positions.add(new Rectangle(2, 2, 2, 2, 1)); + return ManualRedactions.builder() + .entriesToAdd(Set.of( + ManualRedactionEntry.builder() + .positions(List.of(new Rectangle(1f, 2f, 3f, 4f, 1))) + .annotationId(entryToAddId) + .value("Test") + .reason("Reason") + .addToDictionary(false) + .addToDossierDictionary(false) + .fileId(fileId) + .requestDate(OffsetDateTime.now()) + .type("manual") + .build())) + .idsToRemove(Set.of( + IdRemoval.builder() + .annotationId(entryToRemoveId) + .build() + )) + .resizeRedactions(Set.of( + ManualResizeRedaction.builder() + .fileId(fileId) + .value("Random") + .annotationId(entryToResizeId) + .positions(positions) + .build() + )) + .legalBasisChanges(Set.of( + ManualLegalBasisChange.builder() + .annotationId(entryLegalBasisId) + .value("Random") + .legalBasis("New legal basis") + .build() + )) + .forceRedactions(Set.of( + ManualForceRedaction.builder() + .annotationId(forceRedactionId) + .fileId(fileId) + .legalBasis("Force") + .build() + )) + .build(); + } +} 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 d57ee8b8f..aa9c4baea 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 @@ -10,10 +10,13 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; +import org.assertj.core.util.Lists; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient; @@ -91,7 +94,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Autowired private InternalDictionaryClient internalDictionaryClient; - @Autowired + @MockBean private EntityLogService entityLogService; @Autowired @@ -103,6 +106,11 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Autowired private FileProcessingClient fileProcessingClient; + @BeforeEach + public void setup() { + + when(entityLogService.getEntityLog(Mockito.any(), Mockito.any())).thenReturn(new EntityLog(1, 1, Lists.newArrayList(), null, 0, 0, 0, 0)); + } @Test public void testRemoveToDossierTemplateWithDossierDictionaryOnlyTrue() { 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 aca12bcb0..f7e52814c 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 @@ -1,40 +1,13 @@ package com.iqser.red.service.peristence.v1.server.integration.utils; -import com.iqser.red.commons.jackson.ObjectMapperFactory; -import com.iqser.red.service.peristence.v1.server.Application; -import com.iqser.red.service.peristence.v1.server.integration.client.ApplicationConfigClient; -import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; -import com.iqser.red.service.peristence.v1.server.utils.MetricsPrinterService; -import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; -import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RedactionClient; -import com.iqser.red.service.persistence.management.v1.processor.client.searchservice.SearchClient; -import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ApplicationConfigurationEntity; -import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles; -import com.iqser.red.service.persistence.management.v1.processor.service.ApplicationConfigService; -import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.*; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.*; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.EntryRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.FalsePositiveEntryRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.FalseRecommendationEntryRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; -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.dossiertemplate.configuration.ApplicationConfig; -import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; -import com.iqser.red.storage.commons.service.StorageService; -import com.iqser.red.storage.commons.utils.FileSystemBackedStorageService; -import com.knecon.fforesight.databasetenantcommons.providers.TenantCreatedListener; -import com.knecon.fforesight.databasetenantcommons.providers.events.TenantCreatedEvent; -import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; -import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; -import com.knecon.fforesight.tenantcommons.TenantContext; -import com.knecon.fforesight.tenantcommons.TenantsClient; -import com.knecon.fforesight.tenantcommons.model.*; -import io.micrometer.prometheus.PrometheusMeterRegistry; -import lombok.extern.slf4j.Slf4j; -import org.assertj.core.util.Lists; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; @@ -51,7 +24,11 @@ import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.annotation.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Primary; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.StatementCallback; import org.springframework.jdbc.datasource.SingleConnectionDataSource; @@ -67,13 +44,69 @@ import org.springframework.security.web.SecurityFilterChain; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; +import com.iqser.red.commons.jackson.ObjectMapperFactory; +import com.iqser.red.service.peristence.v1.server.Application; +import com.iqser.red.service.peristence.v1.server.integration.client.ApplicationConfigClient; +import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; +import com.iqser.red.service.peristence.v1.server.utils.MetricsPrinterService; +import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RedactionClient; +import com.iqser.red.service.persistence.management.v1.processor.client.searchservice.SearchClient; +import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ApplicationConfigurationEntity; +import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles; +import com.iqser.red.service.persistence.management.v1.processor.service.ApplicationConfigService; +import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ApplicationConfigRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DigitalSignatureRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierAttributeConfigRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierAttributeRepository; +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.DossierStatusRepository; +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.DownloadStatusRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributeConfigRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributesGeneralConfigurationRepository; +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.management.v1.processor.service.persistence.repository.IndexInformationRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.LegalBasisMappingRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.NotificationPreferencesRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.NotificationRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.RuleSetRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ViewedPagesRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.WatermarkRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.ForceRedactionRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.LegalBasisChangeRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.ManualRedactionRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.RecategorizationRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.RemoveRedactionRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.EntryRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.FalsePositiveEntryRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.FalseRecommendationEntryRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.ApplicationConfig; +import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; +import com.iqser.red.storage.commons.service.StorageService; +import com.iqser.red.storage.commons.utils.FileSystemBackedStorageService; +import com.knecon.fforesight.databasetenantcommons.providers.TenantCreatedListener; +import com.knecon.fforesight.databasetenantcommons.providers.events.TenantCreatedEvent; +import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; +import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; +import com.knecon.fforesight.tenantcommons.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantsClient; +import com.knecon.fforesight.tenantcommons.model.AuthDetails; +import com.knecon.fforesight.tenantcommons.model.DatabaseConnection; +import com.knecon.fforesight.tenantcommons.model.S3StorageConnection; +import com.knecon.fforesight.tenantcommons.model.SearchConnection; +import com.knecon.fforesight.tenantcommons.model.TenantResponse; -import static org.mockito.Mockito.when; +import io.micrometer.prometheus.PrometheusMeterRegistry; +import lombok.extern.slf4j.Slf4j; @Slf4j @ExtendWith(SpringExtension.class) @@ -92,10 +125,10 @@ public abstract class AbstractPersistenceServerServiceTest { @MockBean protected SearchClient searchClient; @MockBean - protected EntityLogService entityLogService; - @MockBean protected PDFTronClient pdfTronRedactionClient; @Autowired + protected EntityLogService entityLogService; + @Autowired protected ApplicationConfigClient appConfigClient; @Autowired protected StorageService storageService; @@ -190,8 +223,7 @@ public abstract class AbstractPersistenceServerServiceTest { var allRoles = ApplicationRoles.ROLE_DATA.entrySet().stream().flatMap(entry -> entry.getValue().stream()).collect(Collectors.toSet()); allRoles.addAll(ApplicationRoles.UNMAPPED_ACTION_ROLES); allRoles.addAll(ApplicationRoles.ROLE_DATA.keySet()); - var rolesArray = allRoles.toArray(new String[0]); - return rolesArray; + return allRoles.toArray(new String[0]); } @@ -245,7 +277,6 @@ public abstract class AbstractPersistenceServerServiceTest { // doNothing().when(pdfTronRedactionClient).testDigitalCurrentSignature(Mockito.any()); when(amqpAdmin.getQueueInfo(Mockito.any())).thenReturn(null); - when(entityLogService.getEntityLog(Mockito.any(), Mockito.any())).thenReturn(new EntityLog(1, 1, Lists.newArrayList(), null, 0, 0, 0, 0)); when(redactionClient.testRules(Mockito.any())).thenReturn(DroolsSyntaxValidation.builder().droolsSyntaxErrorMessages(Collections.emptyList()).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/MessageType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/MessageType.java index 9e75196e7..09dc18164 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/MessageType.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/MessageType.java @@ -3,6 +3,5 @@ package com.iqser.red.service.persistence.service.v1.api.shared.model; public enum MessageType { ANALYSE, - REANALYSE, - SURROUNDING_TEXT + REANALYSE } diff --git a/persistence-service-v1/pom.xml b/persistence-service-v1/pom.xml index e0282b76c..51a38b5ce 100755 --- a/persistence-service-v1/pom.xml +++ b/persistence-service-v1/pom.xml @@ -31,7 +31,7 @@ - 4.126.0 + 4.157.0 2.71.0 4.29.0 4.13.0 -- 2.47.2 From 729881fcd45ff7e7130a088f14041e0463536bcb Mon Sep 17 00:00:00 2001 From: Andrei Isvoran Date: Thu, 26 Oct 2023 17:07:42 +0300 Subject: [PATCH 2/5] RED-7782 - Fix tests --- .../processor/service/EntityLogService.java | 2 +- .../integration/tests/EntityLogTest.java | 68 ++++++---- .../tests/ManualRedactionTest.java | 10 +- .../AbstractPersistenceServerServiceTest.java | 125 +++++++----------- 4 files changed, 89 insertions(+), 116 deletions(-) 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 b46109a65..226cb32c8 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 @@ -49,7 +49,7 @@ public class EntityLogService { FileStatusService fileStatusService; ManualRedactionProviderService manualRedactionProviderService; UnprocessedManualEntityClient unprocessedManualEntityClient; - private final DossierService dossierService; + DossierService dossierService; CommentService commentService; 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 6934c76d5..a3d80147e 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 @@ -10,20 +10,21 @@ import static org.mockito.Mockito.when; import java.time.OffsetDateTime; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Set; import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.testcontainers.shaded.com.google.common.collect.Lists; -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.management.v1.processor.client.redactionservice.UnprocessedManualEntityClient; +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; import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogService; import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; @@ -42,42 +43,45 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualLegalBasisChange; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; import com.iqser.red.service.redaction.v1.model.UnprocessedManualEntity; -public class EntityLogTest extends AbstractPersistenceServerServiceTest { +@ExtendWith(SpringExtension.class) +public class EntityLogTest { - @Autowired - private FileTesterAndProvider fileTesterAndProvider; - - @Autowired - private DossierTesterAndProvider dossierTesterAndProvider; - - @Autowired - private DossierTemplateTesterAndProvider dossierTemplateTesterAndProvider; - - @Autowired + @MockBean private FileStatusService fileStatusService; - @Autowired + @MockBean private FileManagementStorageService fileManagementStorageService; + @MockBean + private DossierService dossierService; + + @MockBean + private CommentService commentService; + @MockBean private ManualRedactionProviderService manualRedactionProviderService; @MockBean private UnprocessedManualEntityClient unprocessedManualEntityClient; - @Autowired private EntityLogService entityLogService; + @BeforeEach + public void setUp() { + + entityLogService = new EntityLogService(fileManagementStorageService, fileStatusService, manualRedactionProviderService, unprocessedManualEntityClient, dossierService, commentService); + } + @Test public void testGetEntityLogWithUnprocessedRedactions() { - var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); - var file = fileTesterAndProvider.testAndProvideFile(dossier); + String fileId = "fileId"; + String dossierId = "dossierId"; + String dossierTemplateId = "dossierTemplateId"; String entryToAddId = UUID.randomUUID().toString(); String entryToRemoveId = UUID.randomUUID().toString(); @@ -85,7 +89,7 @@ public class EntityLogTest extends AbstractPersistenceServerServiceTest { String entryLegalBasisId = UUID.randomUUID().toString(); String forceRedactionId = UUID.randomUUID().toString(); - ManualRedactions manualRedactions = provideManualRedactions(entryToAddId, entryToRemoveId, entryToResizeId, entryLegalBasisId, forceRedactionId, file.getId()); + ManualRedactions manualRedactions = provideManualRedactions(entryToAddId, entryToRemoveId, entryToResizeId, entryLegalBasisId, forceRedactionId, fileId); UnprocessedManualEntity unprocessedManualEntity = UnprocessedManualEntity.builder() .textBefore("textBefore") .textAfter("textAfter") @@ -98,12 +102,20 @@ public class EntityLogTest extends AbstractPersistenceServerServiceTest { .build(); var entityLog = provideEntityLog(entryToRemoveId, entryToResizeId, entryLegalBasisId, forceRedactionId); - fileManagementStorageService.storeJSONObject(dossier.getId(), file.getId(), FileType.ENTITY_LOG, entityLog); - when(manualRedactionProviderService.getManualRedactions(file.getId(), true)).thenReturn(manualRedactions); + when(manualRedactionProviderService.getManualRedactions(fileId, true)).thenReturn(manualRedactions); when(unprocessedManualEntityClient.mergeUnprocessedManualEntities(any(), any(), any(), any())).thenReturn(List.of(unprocessedManualEntity)); + when(fileStatusService.getStatus(fileId)).thenReturn(FileModel.builder() + .excluded(false) + .dossierStatusId(dossierTemplateId) + .id(fileId) + .build()); + when(fileManagementStorageService.getEntityLog(dossierId, fileId)).thenReturn(entityLog); + when(dossierService.getDossierById(dossierId)).thenReturn(DossierEntity.builder() + .dossierTemplateId(dossierTemplateId) + .build()); - EntityLog response = entityLogService.getEntityLog(dossier.getId(), file.getId(), Collections.emptyList(), true); + EntityLog response = entityLogService.getEntityLog(dossierId, fileId, null, true); assertNotNull(response); assertFalse(response.getEntityLogEntry().isEmpty()); @@ -169,7 +181,7 @@ public class EntityLogTest extends AbstractPersistenceServerServiceTest { positions.add(new Position(1, 1, 1, 1, 1)); return new EntityLog(1, 1, - List.of(EntityLogEntry.builder() + Lists.newArrayList(EntityLogEntry.builder() .id(entryToRemoveId) .type("manual") .value("Luke Skywalker") 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 aa9c4baea..d57ee8b8f 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 @@ -10,13 +10,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; -import org.assertj.core.util.Lists; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient; @@ -94,7 +91,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Autowired private InternalDictionaryClient internalDictionaryClient; - @MockBean + @Autowired private EntityLogService entityLogService; @Autowired @@ -106,11 +103,6 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Autowired private FileProcessingClient fileProcessingClient; - @BeforeEach - public void setup() { - - when(entityLogService.getEntityLog(Mockito.any(), Mockito.any())).thenReturn(new EntityLog(1, 1, Lists.newArrayList(), null, 0, 0, 0, 0)); - } @Test public void testRemoveToDossierTemplateWithDossierDictionaryOnlyTrue() { 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 f7e52814c..aca12bcb0 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 @@ -1,13 +1,40 @@ package com.iqser.red.service.peristence.v1.server.integration.utils; -import static org.mockito.Mockito.when; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - +import com.iqser.red.commons.jackson.ObjectMapperFactory; +import com.iqser.red.service.peristence.v1.server.Application; +import com.iqser.red.service.peristence.v1.server.integration.client.ApplicationConfigClient; +import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; +import com.iqser.red.service.peristence.v1.server.utils.MetricsPrinterService; +import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RedactionClient; +import com.iqser.red.service.persistence.management.v1.processor.client.searchservice.SearchClient; +import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ApplicationConfigurationEntity; +import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles; +import com.iqser.red.service.persistence.management.v1.processor.service.ApplicationConfigService; +import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.*; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.*; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.EntryRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.FalsePositiveEntryRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.FalseRecommendationEntryRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; +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.dossiertemplate.configuration.ApplicationConfig; +import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; +import com.iqser.red.storage.commons.service.StorageService; +import com.iqser.red.storage.commons.utils.FileSystemBackedStorageService; +import com.knecon.fforesight.databasetenantcommons.providers.TenantCreatedListener; +import com.knecon.fforesight.databasetenantcommons.providers.events.TenantCreatedEvent; +import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; +import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; +import com.knecon.fforesight.tenantcommons.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantsClient; +import com.knecon.fforesight.tenantcommons.model.*; +import io.micrometer.prometheus.PrometheusMeterRegistry; +import lombok.extern.slf4j.Slf4j; +import org.assertj.core.util.Lists; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; @@ -24,11 +51,7 @@ import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.*; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.StatementCallback; import org.springframework.jdbc.datasource.SingleConnectionDataSource; @@ -44,69 +67,13 @@ import org.springframework.security.web.SecurityFilterChain; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; -import com.iqser.red.commons.jackson.ObjectMapperFactory; -import com.iqser.red.service.peristence.v1.server.Application; -import com.iqser.red.service.peristence.v1.server.integration.client.ApplicationConfigClient; -import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; -import com.iqser.red.service.peristence.v1.server.utils.MetricsPrinterService; -import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; -import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RedactionClient; -import com.iqser.red.service.persistence.management.v1.processor.client.searchservice.SearchClient; -import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ApplicationConfigurationEntity; -import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles; -import com.iqser.red.service.persistence.management.v1.processor.service.ApplicationConfigService; -import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ApplicationConfigRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DigitalSignatureRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierAttributeConfigRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierAttributeRepository; -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.DossierStatusRepository; -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.DownloadStatusRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributeConfigRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributesGeneralConfigurationRepository; -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.management.v1.processor.service.persistence.repository.IndexInformationRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.LegalBasisMappingRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.NotificationPreferencesRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.NotificationRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.RuleSetRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ViewedPagesRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.WatermarkRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.ForceRedactionRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.LegalBasisChangeRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.ManualRedactionRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.RecategorizationRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.RemoveRedactionRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.EntryRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.FalsePositiveEntryRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.FalseRecommendationEntryRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.ApplicationConfig; -import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; -import com.iqser.red.storage.commons.service.StorageService; -import com.iqser.red.storage.commons.utils.FileSystemBackedStorageService; -import com.knecon.fforesight.databasetenantcommons.providers.TenantCreatedListener; -import com.knecon.fforesight.databasetenantcommons.providers.events.TenantCreatedEvent; -import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; -import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; -import com.knecon.fforesight.tenantcommons.TenantContext; -import com.knecon.fforesight.tenantcommons.TenantsClient; -import com.knecon.fforesight.tenantcommons.model.AuthDetails; -import com.knecon.fforesight.tenantcommons.model.DatabaseConnection; -import com.knecon.fforesight.tenantcommons.model.S3StorageConnection; -import com.knecon.fforesight.tenantcommons.model.SearchConnection; -import com.knecon.fforesight.tenantcommons.model.TenantResponse; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; -import io.micrometer.prometheus.PrometheusMeterRegistry; -import lombok.extern.slf4j.Slf4j; +import static org.mockito.Mockito.when; @Slf4j @ExtendWith(SpringExtension.class) @@ -125,9 +92,9 @@ public abstract class AbstractPersistenceServerServiceTest { @MockBean protected SearchClient searchClient; @MockBean - protected PDFTronClient pdfTronRedactionClient; - @Autowired protected EntityLogService entityLogService; + @MockBean + protected PDFTronClient pdfTronRedactionClient; @Autowired protected ApplicationConfigClient appConfigClient; @Autowired @@ -223,7 +190,8 @@ public abstract class AbstractPersistenceServerServiceTest { var allRoles = ApplicationRoles.ROLE_DATA.entrySet().stream().flatMap(entry -> entry.getValue().stream()).collect(Collectors.toSet()); allRoles.addAll(ApplicationRoles.UNMAPPED_ACTION_ROLES); allRoles.addAll(ApplicationRoles.ROLE_DATA.keySet()); - return allRoles.toArray(new String[0]); + var rolesArray = allRoles.toArray(new String[0]); + return rolesArray; } @@ -277,6 +245,7 @@ public abstract class AbstractPersistenceServerServiceTest { // doNothing().when(pdfTronRedactionClient).testDigitalCurrentSignature(Mockito.any()); when(amqpAdmin.getQueueInfo(Mockito.any())).thenReturn(null); + when(entityLogService.getEntityLog(Mockito.any(), Mockito.any())).thenReturn(new EntityLog(1, 1, Lists.newArrayList(), null, 0, 0, 0, 0)); when(redactionClient.testRules(Mockito.any())).thenReturn(DroolsSyntaxValidation.builder().droolsSyntaxErrorMessages(Collections.emptyList()).build()); } -- 2.47.2 From da43634b1923ae702d4c484ede15d0ae88c4778c Mon Sep 17 00:00:00 2001 From: Andrei Isvoran Date: Fri, 27 Oct 2023 12:09:20 +0300 Subject: [PATCH 3/5] RED-7782 - Address PR comments --- .../impl/controller/EntityLogController.java | 4 +- .../external/resource/EntityLogResource.java | 2 +- .../EntityLogInternalController.java | 2 +- .../internal/resources/EntityLogResource.java | 2 +- .../processor/service/EntityLogService.java | 63 +++++++++++-------- .../integration/tests/EntityLogTest.java | 12 +++- 6 files changed, 53 insertions(+), 32 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/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( -- 2.47.2 From 7a0de45add27aa94a08862334114bebdb644c37e Mon Sep 17 00:00:00 2001 From: Andrei Isvoran Date: Fri, 27 Oct 2023 12:14:22 +0300 Subject: [PATCH 4/5] RED-7782 - Address PR comments --- .../management/v1/processor/service/EntityLogService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 84e980d94..62bc91837 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 @@ -157,7 +157,7 @@ public class EntityLogService { .findFirst().orElseThrow(() -> new NotFoundException("Entry with annotationId " + manualRedactionEntry.getAnnotationId() + " not found")); List changes = new ArrayList<>(); changes.add(Change.builder() - .analysisNumber(1) + .analysisNumber(entityLog.getAnalysisNumber()) .dateTime(OffsetDateTime.now()) .type(ChangeType.ADDED) .build()); @@ -187,7 +187,7 @@ public class EntityLogService { .manualChanges(List.of(ManualChange.builder() .manualRedactionType(ManualRedactionType.ADD_LOCALLY) .requestedDate(manualRedactionEntry.getRequestDate()) - .processedDate(manualRedactionEntry.getProcessedDate()) + .processedDate(null) .userId(manualRedactionEntry.getUser()) .propertyChanges(Map.of("value", manualRedactionEntry.getValue())) .build())) @@ -232,6 +232,7 @@ public class EntityLogService { .manualRedactionType(ManualRedactionType.RESIZE) .requestedDate(manualResizeRedaction.getRequestDate()) .processedDate(null) + .propertyChanges(Map.of("value", manualResizeRedaction.getValue())) .userId(manualResizeRedaction.getUser()).build()); } }); -- 2.47.2 From 3bdfd4c96b1a68e76c4e0f68a1713f0a2893a0fe Mon Sep 17 00:00:00 2001 From: Andrei Isvoran Date: Fri, 27 Oct 2023 12:16:04 +0300 Subject: [PATCH 5/5] RED-7782 - Add property changes --- .../management/v1/processor/service/EntityLogService.java | 2 ++ 1 file changed, 2 insertions(+) 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 62bc91837..06b909f56 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 @@ -272,6 +272,7 @@ public class EntityLogService { .requestedDate(recategorization.getRequestDate()) .processedDate(recategorization.getProcessedDate()) .userId(recategorization.getUser()) + .propertyChanges(Map.of("type", recategorization.getType())) .build()); } }); @@ -290,6 +291,7 @@ public class EntityLogService { .requestedDate(forceRedaction.getRequestDate()) .processedDate(forceRedaction.getProcessedDate()) .userId(forceRedaction.getUser()) + .propertyChanges(Map.of("legalBasis", forceRedaction.getLegalBasis())) .build()); } }); -- 2.47.2