From 30db55df1579ed8b6e7c097e89c92b08b9f15f9f Mon Sep 17 00:00:00 2001 From: maverickstuder Date: Thu, 24 Oct 2024 13:52:54 +0200 Subject: [PATCH] RED-10259: Failed recategorize on annotation after re-upload file without keeping changes --- .../RecategorizationPersistenceService.java | 1 + .../peristence/v1/server/Application.java | 17 --- .../tests/ManualRedactionTest.java | 108 ++++++++++++++++-- 3 files changed, 98 insertions(+), 28 deletions(-) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/RecategorizationPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/RecategorizationPersistenceService.java index 7da941ec7..1ac5ed1ae 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/RecategorizationPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/RecategorizationPersistenceService.java @@ -56,6 +56,7 @@ public class RecategorizationPersistenceService { entity.setValue(request.getValue()); } entity.setProcessedDate(null); + entity.setSoftDeletedTime(null); return entity; } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java index 179595ccc..5252ec9c3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java @@ -99,23 +99,6 @@ public class Application implements ApplicationContextAware { } - @Bean - @ConditionalOnProperty(value = "cors.enabled", havingValue = "true") - public WebMvcConfigurer corsConfigurer() { - - return new WebMvcConfigurer() { - - @Override - public void addCorsMappings(CorsRegistry registry) { - - log.info("Cross Origin Requests are enabled !!!"); - registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "DELETE", "PUT", "HEAD"); - - } - }; - } - - @Bean public DictionaryMergeService dictionaryMergeService() { 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 f312a7bf9..e7af44201 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 @@ -18,12 +18,12 @@ import static org.mockito.Mockito.when; import java.time.OffsetDateTime; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; -import java.util.stream.Stream; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; @@ -31,7 +31,6 @@ import org.junit.jupiter.api.Test; import org.mockito.stubbing.Answer; import org.springframework.beans.factory.annotation.Autowired; -import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileProcessingClient; @@ -44,6 +43,8 @@ import com.iqser.red.service.peristence.v1.server.integration.service.TypeProvid import com.iqser.red.service.peristence.v1.server.integration.service.UserProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.CommentEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRecategorizationEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.model.ManualChangesQueryOptions; import com.iqser.red.service.persistence.management.v1.processor.service.DictionaryManagementService; @@ -51,10 +52,10 @@ import com.iqser.red.service.persistence.management.v1.processor.service.Dossier import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogMergeService; 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.management.v1.processor.service.manualredactions.ManualRedactionService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.EntryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.RecategorizationPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.queue.SearchTermOccurrencesResponseReceiver; import com.iqser.red.service.persistence.management.v1.processor.service.redactionlog.RedactionRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; @@ -121,7 +122,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { private FileStatusPersistenceService fileStatusPersistenceService; @Autowired - private ObjectMapper objectMapper; + private FileStatusService fileStatusService; @Autowired private FileClient fileClient; @@ -138,15 +139,9 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Autowired private DictionaryManagementService dictionaryManagementService; - @Autowired - private EntryPersistenceService entryPersistenceService; - @Autowired private FileProcessingClient fileProcessingClient; - @Autowired - private ManualRedactionService manualRedactionService; - @Autowired private ManualRedactionProviderService manualRedactionProviderService; @@ -159,6 +154,9 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Autowired private SearchTermOccurrencesResponseReceiver searchTermOccurrencesResponseReceiver; + @Autowired + private RecategorizationPersistenceService recategorizationPersistenceService; + @Test public void testRemoveToDossierTemplateWithDossierDictionaryOnlyTrue() { @@ -4030,4 +4028,92 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { when(entityLogService.getEntityLog(any(), any())).thenAnswer(answer); } + + @Test + public void testReaddSameImageRecatsAfterFullFileOverwrite() { + + // Step 1: Prepare file + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); + var file = fileTesterAndProvider.testAndProvideFile(dossier); + + // Step 2: Do recategorizations + var type1 = typeProvider.testAndProvideType(dossierTemplate, dossier, "Type1", false, 66); + var type2 = typeProvider.testAndProvideType(dossierTemplate, dossier, "Type2", false, 100); + + List entries = List.of("Luke Skywalker"); + dictionaryClient.addEntry(type1.getType(), type1.getDossierTemplateId(), entries, false, null, DictionaryEntryType.ENTRY); + + // Create an annotation + var annotationId = "AnnotationId"; + var entityLog = new EntityLog(1, + 1, + List.of(EntityLogEntry.builder() + .id(annotationId) + .type(type1.getType()) + .value("Luke Skywalker") + .dictionaryEntry(true) + .entryType(EntryType.IMAGE) + .state(EntryState.APPLIED) + .build()), + null, + 0, + 0, + 0, + 0); + fileManagementStorageService.saveEntityLog(dossier.getId(), file.getId(), entityLog); + + when(entityLogService.getEntityLog(any(), any(), anyBoolean())).thenReturn(entityLog); + + Set recategorizationRequests = Set.of(RecategorizationRequestModel.builder() + .type(type2.getType()) + .annotationId(annotationId) + .addToDictionary(false) + .addToAllDossiers(false) + .legalBasis("") + .section("section") + .value("Luke Skywalker") + .build()); + manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), recategorizationRequests, true); + + var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); + assertEquals(allManualRedactions.getRecategorizations().size(), 1); + + List recats = recategorizationPersistenceService.findEntriesByFileIdAndOptions(file.getId(), + ManualChangesQueryOptions.builder() + .includeDeletions(true) + .build()); + assertEquals(recats.size(), 1); + assertEquals(annotationId, recats.get(0).getId().getAnnotationId()); + assertNull(recats.get(0).getSoftDeletedTime()); + + // Step 3: file overwrite + fileStatusService.overwriteFile(file.getDossierId(), file.getId(), "testUploader", file.getFilename(), false, false); + + fileManagementStorageService.saveEntityLog(dossier.getId(), file.getId(), entityLog); + + allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); + assertEquals(allManualRedactions.getRecategorizations().size(), 0); + recats = recategorizationPersistenceService.findEntriesByFileIdAndOptions(file.getId(), + ManualChangesQueryOptions.builder() + .includeDeletions(true) + .build()); + assertEquals(recats.size(), 1); + assertEquals(annotationId, recats.get(0).getId().getAnnotationId()); + assertNotNull(recats.get(0).getSoftDeletedTime()); + + // Step 4: Do the same recategorizations again + manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), recategorizationRequests, true); + + allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); + recats = recategorizationPersistenceService.findEntriesByFileIdAndOptions(file.getId(), + ManualChangesQueryOptions.builder() + .includeDeletions(true) + .build()); + assertEquals(recats.size(), 1); + assertEquals(annotationId, recats.get(0).getId().getAnnotationId()); + assertNull(recats.get(0).getSoftDeletedTime()); + assertEquals(allManualRedactions.getRecategorizations().size(), 1); + } + }