diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java index e7ba9359d..729a9d5be 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java @@ -21,7 +21,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.AccessC import com.iqser.red.service.persistence.management.v1.processor.service.CommentService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionMapper; import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionService; import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionUndoService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; @@ -68,7 +67,6 @@ public class ManualRedactionController implements ManualRedactionResource { DossierManagementService dossierManagementService; AuditPersistenceService auditPersistenceService; AccessControlService accessControlService; - ManualRedactionMapper manualRedactionMapper; CommentService commentService; FileStatusManagementService fileStatusManagementService; @@ -120,7 +118,8 @@ public class ManualRedactionController implements ManualRedactionResource { accessControlService.checkDossierExistenceAndViewPermissionsToDossier(dossierId); accessControlService.validateFileResourceExistence(fileId); - return manualRedactionService.getManualRedactions(fileId, ManualChangesQueryOptions.builder().includeOnlyUnprocessed(unprocessed).includeDictChanges(includeDictChanges).build()); + return manualRedactionService.getManualRedactions(fileId, + ManualChangesQueryOptions.builder().includeOnlyUnprocessed(unprocessed).includeDictChanges(includeDictChanges).build()); } @@ -178,9 +177,7 @@ public class ManualRedactionController implements ManualRedactionResource { accessControlService.verifyUserIsMemberOrApprover(dossierId); } - List requests = manualRedactionMapper.toAddRedactionRequestList(dossierId, addRedactionRequests, dossier); - - List responseList = manualRedactionService.addAddRedaction(dossierId, fileId, requests); + List responseList = manualRedactionService.addAddRedaction(dossierId, fileId, addRedactionRequests, dossier); responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() .userId(KeycloakSecurity.getUserId()) .objectId(fileId) @@ -209,12 +206,11 @@ public class ManualRedactionController implements ManualRedactionResource { accessControlService.verifyUserIsMemberOrApprover(dossierId); } - List requests = manualRedactionMapper.toRemoveRedactionRequestList(dossierId, - fileId, - dossier.getDossierTemplateId(), - removeRedactionRequests, - includeUnprocessed); - List responseList = manualRedactionService.addRemoveRedaction(dossierId, fileId, requests); + List responseList = manualRedactionService.addRemoveRedaction(dossierId, + fileId, + removeRedactionRequests, + dossier.getDossierTemplateId(), + includeUnprocessed); responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() .userId(KeycloakSecurity.getUserId()) @@ -237,8 +233,7 @@ public class ManualRedactionController implements ManualRedactionResource { accessControlService.verifyFileIsNotApproved(dossierId, fileId); accessControlService.verifyUserIsMemberOrApprover(dossierId); - List requests = manualRedactionMapper.toForceRedactionRequestList(dossierId, fileId, forceRedactionRequests); - List responseList = manualRedactionService.addForceRedaction(dossierId, fileId, requests); + List responseList = manualRedactionService.addForceRedaction(dossierId, fileId, forceRedactionRequests); responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() .userId(KeycloakSecurity.getUserId()) @@ -262,9 +257,7 @@ public class ManualRedactionController implements ManualRedactionResource { accessControlService.verifyFileIsNotApproved(dossierId, fileId); accessControlService.verifyUserIsMemberOrApprover(dossierId); - List requests = manualRedactionMapper.toLegalBasisChangeRequestList(dossierId, fileId, legalBasisChangeRequests); - - List responseList = manualRedactionService.addLegalBasisChange(dossierId, fileId, requests); + List responseList = manualRedactionService.addLegalBasisChange(dossierId, fileId, legalBasisChangeRequests); responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() .userId(KeycloakSecurity.getUserId()) @@ -289,13 +282,11 @@ public class ManualRedactionController implements ManualRedactionResource { accessControlService.verifyFileIsNotApproved(dossierId, fileId); accessControlService.verifyUserIsMemberOrApprover(dossierId); - List requests = manualRedactionMapper.toRecategorizationRequestList(dossierId, - fileId, - dossier.getDossierTemplateId(), - recategorizationRequests, - includeUnprocessed); - - List responseList = manualRedactionService.addRecategorization(dossierId, fileId, requests); + List responseList = manualRedactionService.addRecategorization(dossierId, + fileId, + recategorizationRequests, + dossier.getDossierTemplateId(), + includeUnprocessed); responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() .userId(KeycloakSecurity.getUserId()) @@ -319,8 +310,7 @@ public class ManualRedactionController implements ManualRedactionResource { accessControlService.verifyFileIsNotApproved(dossierId, fileId); accessControlService.verifyUserIsMemberOrApprover(dossierId); - List requests = manualRedactionMapper.toResizeRedactionRequestList(dossierId, fileId, resizeRedactionRequests, includeUnprocessed); - List responseList = manualRedactionService.addResizeRedaction(dossierId, fileId, requests, includeUnprocessed); + List responseList = manualRedactionService.addResizeRedaction(dossierId, fileId, resizeRedactionRequests, includeUnprocessed); responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() .userId(KeycloakSecurity.getUserId()) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionMapper.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionMapper.java index d9f5cf69b..f92f4ef71 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionMapper.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionMapper.java @@ -2,12 +2,12 @@ package com.iqser.red.service.persistence.management.v1.processor.service.manual 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; import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.Consumer; import org.springframework.stereotype.Service; @@ -17,15 +17,12 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.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.EntryType; -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.AddRedactionRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ForceRedactionRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.LegalBasisChangeRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.RecategorizationRequest; -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.RemoveRedactionRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ResizeRedactionRequest; -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.dossiertemplate.dossier.Dossier; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequestModel; @@ -47,7 +44,6 @@ import lombok.experimental.FieldDefaults; public class ManualRedactionMapper { EntityLogService entityLogService; - ManualRedactionService manualRedactionService; @Observed(name = "ManualRedactionMapper", contextualName = "to-add-redaction-request-list") @@ -112,7 +108,10 @@ public class ManualRedactionMapper { } - public List toForceRedactionRequestList(String dossierId, String fileId, Set forceRedactionRequests) { + public List toForceRedactionRequestList(String dossierId, + String fileId, + Set forceRedactionRequests, + Consumer entityLogEntryConsumer) { EntityLog entityLog = entityLogService.getEntityLog(dossierId, fileId, Collections.emptyList(), true); List requests = new ArrayList<>(); @@ -128,7 +127,7 @@ public class ManualRedactionMapper { .build(); if (!entityLogEntry.getEngines().contains(Engine.MANUAL) && entryIsEntityType(entityLogEntry)) { - addManualRedactionEntry(fileId, entityLogEntry); + entityLogEntryConsumer.accept(entityLogEntry); } requests.add(forceRedactionRequest); @@ -139,7 +138,10 @@ public class ManualRedactionMapper { @Deprecated(forRemoval = true) - public List toLegalBasisChangeRequestList(String dossierId, String fileId, Set legalBasisChangeRequests) { + public List toLegalBasisChangeRequestList(String dossierId, + String fileId, + Set legalBasisChangeRequests, + Consumer entityLogEntryConsumer) { EntityLog entityLog = entityLogService.getEntityLog(dossierId, fileId, Collections.emptyList(), true); List requests = new ArrayList<>(); @@ -157,7 +159,7 @@ public class ManualRedactionMapper { .build(); if (!entityLogEntry.getEngines().contains(Engine.MANUAL) && entryIsEntityType(entityLogEntry)) { - addManualRedactionEntry(fileId, entityLogEntry); + entityLogEntryConsumer.accept(entityLogEntry); } requests.add(request); @@ -171,7 +173,8 @@ public class ManualRedactionMapper { String fileId, String dossierTemplateId, Set recategorizationRequests, - boolean includeUnprocessed) { + boolean includeUnprocessed, + Consumer entityLogEntryConsumer) { EntityLog entityLog = entityLogService.getEntityLog(dossierId, fileId, Collections.emptyList(), includeUnprocessed); List requests = new ArrayList<>(); @@ -200,7 +203,7 @@ public class ManualRedactionMapper { && !recategorizationRequest.isAddToAllDossiers() && !recategorizationRequest.isAddToDictionary() && entryIsEntityType(entityLogEntry)) { - addManualRedactionEntry(fileId, entityLogEntry); + entityLogEntryConsumer.accept(entityLogEntry); } requests.add(request); @@ -210,12 +213,10 @@ public class ManualRedactionMapper { } - public List toResizeRedactionRequestList(String dossierId, - String fileId, - Set resizeRedactionRequests, - boolean includeUnprocessed) { + public List toResizeRedactionRequestList(Set resizeRedactionRequests, + EntityLog entityLog, + Consumer entityLogEntryConsumer) { - EntityLog entityLog = entityLogService.getEntityLog(dossierId, fileId, Collections.emptyList(), includeUnprocessed); List requests = new ArrayList<>(); for (ResizeRedactionRequestModel resizeRedactionRequest : resizeRedactionRequests) { @@ -232,7 +233,7 @@ public class ManualRedactionMapper { .build(); if (!entityLogEntry.getEngines().contains(Engine.MANUAL) && entryIsEntityType(entityLogEntry) && !request.isAddToAllDossiers() && !request.getUpdateDictionary()) { - addManualRedactionEntry(fileId, entityLogEntry); + entityLogEntryConsumer.accept(entityLogEntry); } requests.add(request); @@ -242,31 +243,6 @@ public class ManualRedactionMapper { } - private void addManualRedactionEntry(String fileId, EntityLogEntry entityLogEntry) { - - ManualRedactionEntry manualRedactionEntry = ManualRedactionEntry.builder() - .value(entityLogEntry.getValue()) - .reason(entityLogEntry.getReason()) - .section(entityLogEntry.getSection()) - .annotationId(entityLogEntry.getId()) - .type(entityLogEntry.getType()) - .addToDossierDictionary(false) - .addToDictionary(false) - .positions(convertPositions(entityLogEntry.getPositions())) - .rectangle(entityLogEntry.getEntryType() == EntryType.AREA) - .user(KeycloakSecurity.getUserId()) - .legalBasis(entityLogEntry.getLegalBasis()) - .textAfter(entityLogEntry.getTextAfter()) - .textBefore(entityLogEntry.getTextBefore()) - .dictionaryEntryType(getDictionaryEntryType(entityLogEntry)) - .fileId(fileId) - .requestDate(OffsetDateTime.now()) - .build(); - - manualRedactionService.addManualRedactionEntries(List.of(manualRedactionEntry), false); - } - - private static boolean entryIsEntityType(EntityLogEntry entityLogEntry) { return entityLogEntry.getEntryType().equals(EntryType.ENTITY) // @@ -287,7 +263,7 @@ public class ManualRedactionMapper { } - private static DictionaryEntryType getDictionaryEntryType(EntityLogEntry entityLogEntry) { + public static DictionaryEntryType getDictionaryEntryType(EntityLogEntry entityLogEntry) { if (entityLogEntry.getEntryType().equals(EntryType.FALSE_RECOMMENDATION)) { return DictionaryEntryType.FALSE_RECOMMENDATION; @@ -298,12 +274,4 @@ public class ManualRedactionMapper { } } - - private static List convertPositions(List positions) { - - return positions.stream() - .map(rectangle -> new Rectangle(rectangle.x(), rectangle.y(), rectangle.w(), rectangle.h(), rectangle.getPageNumber())) - .toList(); - } - } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionProviderService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionProviderService.java index a8b8343a5..a8160cba6 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionProviderService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionProviderService.java @@ -20,7 +20,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.RemoveRedactionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.ResizeRedactionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.ManualRecategorizationMapper; -import com.iqser.red.service.persistence.management.v1.processor.utils.ManualRedactionMapper; +import com.iqser.red.service.persistence.management.v1.processor.utils.ManualRedactionEntryMapper; import com.iqser.red.service.persistence.management.v1.processor.utils.ManualResizeRedactionMapper; 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; @@ -60,7 +60,7 @@ public class ManualRedactionProviderService { if (!options.getExcludedClasses().contains(ManualRedactionEntry.class)) { entriesToAdd = new HashSet<>(convert(addRedactionPersistenceService.findEntriesByFileIdAndOptions(fileId, options), ManualRedactionEntry.class, - new ManualRedactionMapper())); + new ManualRedactionEntryMapper())); } else { entriesToAdd = Collections.emptySet(); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionService.java index b382b5428..66f277089 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionService.java @@ -1,5 +1,6 @@ package com.iqser.red.service.persistence.management.v1.processor.service.manualredactions; +import static com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionMapper.getDictionaryEntryType; import static com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter.convert; import java.nio.charset.StandardCharsets; @@ -8,6 +9,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.function.Consumer; import java.util.stream.Collectors; import org.springframework.stereotype.Service; @@ -34,23 +36,34 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.RecategorizationPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.RemoveRedactionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.ResizeRedactionPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.utils.ManualRedactionMapper; +import com.iqser.red.service.persistence.management.v1.processor.utils.ManualRedactionEntryMapper; import com.iqser.red.service.persistence.management.v1.processor.utils.ManualResizeRedactionMapper; import com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils; 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.EntryType; +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.AddRedactionRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ForceRedactionRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.LegalBasisChangeRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualAddResponse; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.RecategorizationRequest; +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.RemoveRedactionRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ResizeRedactionRequest; 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.Dossier; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ForceRedactionRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.LegalBasisChangeRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RecategorizationRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ResizeRedactionRequestModel; import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import io.micrometer.observation.annotation.Observed; import lombok.AccessLevel; @@ -79,20 +92,21 @@ public class ManualRedactionService { ManualRedactionDictionaryUpdateHandler manualRedactionDictionaryUpdateHandler; EntityLogMergeService entityLogMergeService; FileStatusPersistenceService fileStatusPersistenceService; + ManualRedactionMapper manualRedactionMapper; private static final int MAX_LEGAL_BASIS_LENGTH = 4000; @Transactional @Observed(name = "ManualRedactionService", contextualName = "add-manual-redaction") - public List addAddRedaction(String dossierId, String fileId, List addRedactionRequests) { + public List addAddRedaction(String dossierId, String fileId, Set addRedactionRequests, Dossier dossier) { var response = new ArrayList(); List manualRedactionEntryEntities = new ArrayList<>(); - + List requests = manualRedactionMapper.toAddRedactionRequestList(dossierId, addRedactionRequests, dossier); var dossierEntity = dossierPersistenceService.getAndValidateDossier(dossierId); - for (AddRedactionRequest addRedactionRequest : addRedactionRequests) { + for (AddRedactionRequest addRedactionRequest : requests) { manualRedactionDictionaryUpdateHandler.validateDictionariesForAdd(addRedactionRequest, addRedactionRequest.getValue()); validatePositions(fileId, addRedactionRequest); @@ -108,8 +122,7 @@ public class ManualRedactionService { Long commentId = commentService.addCommentAndGetId(fileId, annotationId, addRedactionRequest.getComment(), addRedactionRequest.getUser()); - response.add(ManualAddResponse.builder().annotationId(annotationId).commentId(commentId) - .build()); + response.add(ManualAddResponse.builder().annotationId(annotationId).commentId(commentId).build()); } var localManualRedactionEntryEntities = manualRedactionEntryEntities.stream() @@ -118,8 +131,7 @@ public class ManualRedactionService { FileModel fileStatus = fileStatusService.getStatus(fileId); if (!localManualRedactionEntryEntities.isEmpty() && fileStatus.isExcludedFromAutomaticAnalysis()) { - ManualRedactions manualRedactions = ManualRedactions.builder().entriesToAdd(convertEntriesToAdd(localManualRedactionEntryEntities)) - .build(); + ManualRedactions manualRedactions = ManualRedactions.builder().entriesToAdd(convertEntriesToAdd(localManualRedactionEntryEntities)).build(); entityLogMergeService.sendToAnalyseQueue(fileId, dossierEntity, fileStatusService.getStatus(fileId), manualRedactions); } else { reprocess(dossierId, fileId); @@ -133,18 +145,27 @@ public class ManualRedactionService { private Set convertEntriesToAdd(List source) { return source.stream() - .map(entry -> convert(entry, ManualRedactionEntry.class, new ManualRedactionMapper())) + .map(entry -> convert(entry, ManualRedactionEntry.class, new ManualRedactionEntryMapper())) .collect(Collectors.toSet()); } @Transactional - public List addRemoveRedaction(String dossierId, String fileId, List removeRedactionRequests) { + public List addRemoveRedaction(String dossierId, + String fileId, + Set removeRedactionRequests, + String dossierTemplateId, + boolean includeUnprocessed) { var response = new ArrayList(); + List requests = manualRedactionMapper.toRemoveRedactionRequestList(dossierId, + fileId, + dossierTemplateId, + removeRedactionRequests, + includeUnprocessed); //validate removing from dossier template dictionary - for (RemoveRedactionRequest removeRedactionRequest : removeRedactionRequests) { + for (RemoveRedactionRequest removeRedactionRequest : requests) { manualRedactionDictionaryUpdateHandler.validateDictionariesForDelete(removeRedactionRequest, removeRedactionRequest.getTypeToRemove(), removeRedactionRequest.getDossierTemplateId()); @@ -163,8 +184,7 @@ public class ManualRedactionService { removeRedactionPersistenceService.updateModifiedDictionaries(fileId, removeRedactionRequest.getAnnotationId(), removedFromDictionary, typeIdsOfModifiedDictionaries); - response.add(ManualAddResponse.builder().annotationId(removeRedactionRequest.getAnnotationId()).commentId(commentId) - .build()); + response.add(ManualAddResponse.builder().annotationId(removeRedactionRequest.getAnnotationId()).commentId(commentId).build()); } reprocess(dossierId, fileId); @@ -176,12 +196,13 @@ public class ManualRedactionService { @Transactional - public List addForceRedaction(String dossierId, String fileId, List forceRedactionRequests) { + public List addForceRedaction(String dossierId, String fileId, Set forceRedactionRequests) { var response = new ArrayList(); dossierPersistenceService.getAndValidateDossier(dossierId); + List requests = manualRedactionMapper.toForceRedactionRequestList(dossierId, fileId, forceRedactionRequests, getEntityLogEntryConsumer(fileId)); - for (var forceRedactionRequest : forceRedactionRequests) { + for (var forceRedactionRequest : requests) { forceRedactionPersistenceService.insert(fileId, forceRedactionRequest); Long commentId = commentService.addCommentAndGetId(fileId, @@ -189,8 +210,7 @@ public class ManualRedactionService { forceRedactionRequest.getComment(), forceRedactionRequest.getUser()); - response.add(ManualAddResponse.builder().annotationId(forceRedactionRequest.getAnnotationId()).commentId(commentId) - .build()); + response.add(ManualAddResponse.builder().annotationId(forceRedactionRequest.getAnnotationId()).commentId(commentId).build()); } reprocess(dossierId, fileId); @@ -203,12 +223,16 @@ public class ManualRedactionService { @Deprecated(forRemoval = true) @Transactional - public List addLegalBasisChange(String dossierId, String fileId, List legalBasisChangeRequests) { + public List addLegalBasisChange(String dossierId, String fileId, Set legalBasisChangeRequests) { var response = new ArrayList(); dossierPersistenceService.getAndValidateDossier(dossierId); + List requests = manualRedactionMapper.toLegalBasisChangeRequestList(dossierId, + fileId, + legalBasisChangeRequests, + getEntityLogEntryConsumer(fileId)); - for (var legalBasisChangeRequest : legalBasisChangeRequests) { + for (var legalBasisChangeRequest : requests) { legalBasisChangePersistenceService.insert(fileId, legalBasisChangeRequest); Long commentId = commentService.addCommentAndGetId(fileId, @@ -216,8 +240,7 @@ public class ManualRedactionService { legalBasisChangeRequest.getComment(), legalBasisChangeRequest.getUser()); - response.add(ManualAddResponse.builder().annotationId(legalBasisChangeRequest.getAnnotationId()).commentId(commentId) - .build()); + response.add(ManualAddResponse.builder().annotationId(legalBasisChangeRequest.getAnnotationId()).commentId(commentId).build()); } reprocess(dossierId, fileId); fileStatusPersistenceService.setLastManualChangeDate(fileId, OffsetDateTime.now()); @@ -227,12 +250,22 @@ public class ManualRedactionService { @Transactional - public List addRecategorization(String dossierId, String fileId, List recategorizationRequests) { + public List addRecategorization(String dossierId, + String fileId, + Set recategorizationRequests, + String dossierTemplateId, + boolean includeUnprocessed) { var response = new ArrayList(); dossierPersistenceService.getAndValidateDossier(dossierId); + List requests = manualRedactionMapper.toRecategorizationRequestList(dossierId, + fileId, + dossierTemplateId, + recategorizationRequests, + includeUnprocessed, + getEntityLogEntryConsumer(fileId)); - for (var recategorizationRequest : recategorizationRequests) { + for (var recategorizationRequest : requests) { manualRedactionDictionaryUpdateHandler.validateDictionariesForAdd(recategorizationRequest, recategorizationRequest.getValue()); manualRedactionDictionaryUpdateHandler.validateDictionariesForDelete(recategorizationRequest, recategorizationRequest.getTypeToRemove(), @@ -259,8 +292,7 @@ public class ManualRedactionService { recategorizationRequest.getComment(), recategorizationRequest.getUser()); - response.add(ManualAddResponse.builder().annotationId(recategorizationRequest.getAnnotationId()).commentId(commentId) - .build()); + response.add(ManualAddResponse.builder().annotationId(recategorizationRequest.getAnnotationId()).commentId(commentId).build()); } reprocess(dossierId, fileId); @@ -281,13 +313,15 @@ public class ManualRedactionService { @Transactional @Observed(name = "ManualRedactionService", contextualName = "add-manual-redaction") - public List addResizeRedaction(String dossierId, String fileId, List resizeRedactionRequests, boolean includeUnprocessed) { + public List addResizeRedaction(String dossierId, String fileId, Set resizeRedactionRequests, boolean includeUnprocessed) { List response = new ArrayList<>(); List manualResizeRedactionEntities = new ArrayList<>(); EntityLog entityLog = entityLogService.getEntityLog(dossierId, fileId, Collections.emptyList(), includeUnprocessed); + List requests = manualRedactionMapper.toResizeRedactionRequestList(resizeRedactionRequests, entityLog, + getEntityLogEntryConsumer(fileId)); - for (ResizeRedactionRequest resizeRedactionRequest : resizeRedactionRequests) { + for (ResizeRedactionRequest resizeRedactionRequest : requests) { var resizeRedaction = resizeRedactionPersistenceService.insert(fileId, resizeRedactionRequest); manualResizeRedactionEntities.add(resizeRedaction); @@ -297,8 +331,7 @@ public class ManualRedactionService { resizeRedactionRequest.getAnnotationId(), resizeRedactionRequest.getComment(), resizeRedactionRequest.getUser()); - response.add(ManualAddResponse.builder().annotationId(resizeRedactionRequest.getAnnotationId()).commentId(commentId) - .build()); + response.add(ManualAddResponse.builder().annotationId(resizeRedactionRequest.getAnnotationId()).commentId(commentId).build()); } Set typeIdsOfModifiedDictionaries = manualRedactionDictionaryUpdateHandler.updateDictionaryForResizeRedactions(dossierId, @@ -319,8 +352,7 @@ public class ManualRedactionService { FileModel fileStatus = fileStatusService.getStatus(fileId); if (!manualResizeRedactionEntities.isEmpty() && fileStatus.isExcludedFromAutomaticAnalysis()) { - ManualRedactions manualRedactions = ManualRedactions.builder().resizeRedactions(convertResizeRedactions(manualResizeRedactionEntities)) - .build(); + ManualRedactions manualRedactions = ManualRedactions.builder().resizeRedactions(convertResizeRedactions(manualResizeRedactionEntities)).build(); entityLogMergeService.sendToAnalyseQueue(fileId, dossierPersistenceService.getAndValidateDossier(dossierId), fileStatusService.getStatus(fileId), manualRedactions); } else { reprocess(dossierId, fileId); @@ -378,48 +410,47 @@ public class ManualRedactionService { if (manualRedactions != null) { + manualRedactions.getEntriesToAdd() + .forEach(e -> { + if (e.getProcessedDate() == null) { + addRedactionPersistenceService.markAsProcessed(e); + } + }); - manualRedactions.getEntriesToAdd() - .forEach(e -> { - if (e.getProcessedDate() == null) { - addRedactionPersistenceService.markAsProcessed(e); - } - }); + manualRedactions.getIdsToRemove() + .forEach(e -> { + if (e.getProcessedDate() == null) { + removeRedactionPersistenceService.markAsProcessed(e); + } + }); - manualRedactions.getIdsToRemove() - .forEach(e -> { - if (e.getProcessedDate() == null) { - removeRedactionPersistenceService.markAsProcessed(e); - } - }); + manualRedactions.getForceRedactions() + .forEach(e -> { + if (e.getProcessedDate() == null) { + forceRedactionPersistenceService.markAsProcessed(e.getAnnotationId(), e.getFileId()); + } + }); - manualRedactions.getForceRedactions() - .forEach(e -> { - if (e.getProcessedDate() == null) { - forceRedactionPersistenceService.markAsProcessed(e.getAnnotationId(), e.getFileId()); - } - }); + manualRedactions.getRecategorizations() + .forEach(e -> { + if (e.getProcessedDate() == null) { + recategorizationPersistenceService.markAsProcessed(e.getAnnotationId(), e.getFileId()); + } + }); - manualRedactions.getRecategorizations() - .forEach(e -> { - if (e.getProcessedDate() == null) { - recategorizationPersistenceService.markAsProcessed(e.getAnnotationId(), e.getFileId()); - } - }); + manualRedactions.getResizeRedactions() + .forEach(e -> { + if (e.getProcessedDate() == null) { + resizeRedactionPersistenceService.markAsProcessed(e.getAnnotationId(), e.getFileId()); + } + }); - manualRedactions.getResizeRedactions() - .forEach(e -> { - if (e.getProcessedDate() == null) { - resizeRedactionPersistenceService.markAsProcessed(e.getAnnotationId(), e.getFileId()); - } - }); - - manualRedactions.getLegalBasisChanges() - .forEach(e -> { - if (e.getProcessedDate() == null) { - legalBasisChangePersistenceService.markAsProcessed(e.getAnnotationId(), e.getFileId()); - } - }); + manualRedactions.getLegalBasisChanges() + .forEach(e -> { + if (e.getProcessedDate() == null) { + legalBasisChangePersistenceService.markAsProcessed(e.getAnnotationId(), e.getFileId()); + } + }); } } @@ -470,4 +501,43 @@ public class ManualRedactionService { list.forEach(manualRedactionEntry -> addRedactionPersistenceService.hardDelete(manualRedactionEntry.getFileId(), manualRedactionEntry.getAnnotationId())); } + + private void addManualRedactionEntry(String fileId, EntityLogEntry entityLogEntry) { + + ManualRedactionEntry manualRedactionEntry = ManualRedactionEntry.builder() + .value(entityLogEntry.getValue()) + .reason(entityLogEntry.getReason()) + .section(entityLogEntry.getSection()) + .annotationId(entityLogEntry.getId()) + .type(entityLogEntry.getType()) + .addToDossierDictionary(false) + .addToDictionary(false) + .positions(convertPositions(entityLogEntry.getPositions())) + .rectangle(entityLogEntry.getEntryType() == EntryType.AREA) + .user(KeycloakSecurity.getUserId()) + .legalBasis(entityLogEntry.getLegalBasis()) + .textAfter(entityLogEntry.getTextAfter()) + .textBefore(entityLogEntry.getTextBefore()) + .dictionaryEntryType(getDictionaryEntryType(entityLogEntry)) + .fileId(fileId) + .requestDate(OffsetDateTime.now()) + .build(); + + addManualRedactionEntries(List.of(manualRedactionEntry), false); + } + + + private List convertPositions(List positions) { + + return positions.stream() + .map(rectangle -> new Rectangle(rectangle.x(), rectangle.y(), rectangle.w(), rectangle.h(), rectangle.getPageNumber())) + .toList(); + } + + + private Consumer getEntityLogEntryConsumer(String fileId) { + + return entry -> addManualRedactionEntry(fileId, entry); + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ManualRedactionMapper.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ManualRedactionEntryMapper.java similarity index 89% rename from persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ManualRedactionMapper.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ManualRedactionEntryMapper.java index 87a22ad80..5c5b341b7 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ManualRedactionMapper.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ManualRedactionEntryMapper.java @@ -7,7 +7,7 @@ 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.ManualRedactionEntry; import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; -public class ManualRedactionMapper implements BiConsumer { +public class ManualRedactionEntryMapper implements BiConsumer { @Override public void accept(ManualRedactionEntryEntity manualRedactionEntryEntity, ManualRedactionEntry manualRedactionEntry) {