diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java index 2f1c73e5c..3cad898b2 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java @@ -15,6 +15,7 @@ import java.util.stream.Collectors; import javax.transaction.Transactional; +import com.iqser.red.service.persistence.service.v1.api.model.annotations.*; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; @@ -49,16 +50,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.LegalBasisChangePersistenceService; 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.service.v1.api.model.annotations.AddRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.CommentRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ForceRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ImageRecategorizationRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.LegalBasisChangeRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualAddResponse; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualRedactions; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.RemoveRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ResizeRedactionRequest; import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualRedactionEntry; import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualResizeRedaction; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; @@ -111,6 +102,7 @@ public class ManualRedactionService { validateDictionary(addRedactionRequest); } + validatePositions(fileId, addRedactionRequest); String annotationId = hashFunction.hashString(fileId + addRedactionRequest, StandardCharsets.UTF_8).toString(); addRedactionPersistenceService.insert(fileId, annotationId, addRedactionRequest); @@ -155,6 +147,11 @@ public class ManualRedactionService { } } + private void validatePositions(String fileId, AddRedactionRequest addRedactionRequest) { + var numberOfPages = fileStatusService.getStatus(fileId).getNumberOfPages(); + addRedactionRequest.getPositions().stream().filter(p -> p.getPage() > numberOfPages).findAny() + .ifPresent((p) -> new BadRequestException("Invalid page found in the request")); + } public List addRemoveRedaction(String dossierId, String fileId, List removeRedactionRequests) { 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 636a51bc0..5c32f5f11 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 @@ -1,15 +1,24 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import com.fasterxml.jackson.databind.ObjectMapper; +import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; import com.iqser.red.service.persistence.service.v1.api.model.annotations.*; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.redaction.v1.model.ManualChange; +import com.iqser.red.service.redaction.v1.model.ManualRedactionType; +import feign.FeignException; +import org.assertj.core.util.Lists; import org.junit.Test; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient; @@ -51,6 +60,87 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Autowired private ObjectMapper objectMapper; + @Autowired + private FileClient fileClient; + + @Test + @SneakyThrows + public void testManualRedaction3641() { + + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); + + var file = fileTesterAndProvider.testAndProvideFile(dossier); + + var type = typeProvider.testAndProvideType(dossierTemplate, null, "manual"); + + var addRedaction = manualRedactionClient.addAddRedaction(dossier.getId(), file.getId(), Collections.singletonList(AddRedactionRequest.builder() + .positions(List.of(Rectangle.builder().topLeftY(1).topLeftX(1).height(1).width(1).build())) + .section("section test") + .addToDictionary(false) + .addToDossierDictionary(false) + .status(AnnotationStatus.REQUESTED) + .typeId(type.getId()) + .user("user") + .reason("1") + .value("test") + .legalBasis("1") + .rectangle(true) + .textAfter("Text After") + .textBefore("Text Before") + .sourceId("SourceId") + .build())).iterator().next(); + var loadedAddRedaction = manualRedactionClient.getAddRedaction(file.getId(), addRedaction.getAnnotationId()); + assertThat(loadedAddRedaction.isRectangle()).isEqualTo(true); + + var change = ManualChange.from(loadedAddRedaction) + .withManualRedactionType(ManualRedactionType.ADD_LOCALLY); + List changeList = new ArrayList<>(); + changeList.add(change); + + RedactionLogEntry entry = RedactionLogEntry.builder() + .id(loadedAddRedaction.getAnnotationId()) + .reason(loadedAddRedaction.getReason()) + .isDictionaryEntry(loadedAddRedaction.isAddToDictionary()) + .isDossierDictionaryEntry(loadedAddRedaction.isAddToDossierDictionary()) + .legalBasis(loadedAddRedaction.getLegalBasis()) + .value(loadedAddRedaction.getValue()) + .section(loadedAddRedaction.getSection()) + .type(loadedAddRedaction.getType()) + .redacted(true) + .isHint(false) + .sectionNumber(-1) + .rectangle(loadedAddRedaction.isRectangle()) + .manualChanges(changeList) + .build(); + when(redactionClient.getRedactionLog(Mockito.any())).thenReturn(new RedactionLog(1, 1, + List.of(entry), null, 0, 0, 0, 0)); + + fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "1"); + var fileStatus = fileClient.getFileStatus(dossier.getId(), file.getId()); + assertThat(fileStatus.isHasSuggestions()).isTrue(); + assertThat(fileStatus.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL); + + changeList.get(0).setAnnotationStatus(AnnotationStatus.DECLINED); + entry.setManualChanges(changeList); + when(redactionClient.getRedactionLog(Mockito.any())).thenReturn(new RedactionLog(1, 1, + List.of(entry), null, 0, 0, 0, 0)); + + manualRedactionClient.updateAddRedactionStatus(dossier.getId(), file.getId(), + UpdateRedactionRequest.builder() + .annotationIds(List.of(addRedaction.getAnnotationId())) + .annotationStatus(AnnotationStatus.DECLINED).build()); + loadedAddRedaction = manualRedactionClient.getAddRedaction(file.getId(), addRedaction.getAnnotationId()); + assertThat(loadedAddRedaction.getStatus()).isEqualTo(AnnotationStatus.DECLINED); + + fileStatus = fileClient.getFileStatus(dossier.getId(), file.getId()); + assertThat(fileStatus.isHasSuggestions()).isFalse(); + + ManualRedactions manualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId()); + assertThat(manualRedactions.getEntriesToAdd()).isNotEmpty(); + + } @Test @SneakyThrows @@ -71,6 +161,27 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { var loadedComment = manualRedactionClient.getComment(comment.getId()); assertThat(loadedComment.getText()).isEqualTo("test"); + try { + manualRedactionClient.addAddRedaction(dossier.getId(), file.getId(), Collections.singletonList(AddRedactionRequest.builder() + .positions(List.of(Rectangle.builder().page(100).topLeftY(1).topLeftX(1).height(1).width(1).build())) + .section("section test") + .addToDictionary(true) + .addToDossierDictionary(false) + .status(AnnotationStatus.REQUESTED) + .typeId(type.getId()) + .user("user") + .reason("1") + .value("test") + .legalBasis("1") + .rectangle(true) + .textAfter("Text After") + .textBefore("Text Before") + .sourceId("SourceId") + .build())); + } catch (FeignException e) { + assertThat(e.status()).isEqualTo(400); + } + var addRedaction = manualRedactionClient.addAddRedaction(dossier.getId(), file.getId(), Collections.singletonList(AddRedactionRequest.builder() .positions(List.of(Rectangle.builder().topLeftY(1).topLeftX(1).height(1).width(1).build())) .section("section test")