Merge branch 'RED-10259-bp' into 'release/2.589.x'

RED-10259: Failed recategorize on annotation after re-upload file without keeping changes

See merge request redactmanager/persistence-service!799
This commit is contained in:
Maverick Studer 2024-10-24 14:21:09 +02:00
commit 2f42e96b25
3 changed files with 98 additions and 28 deletions

View File

@ -56,6 +56,7 @@ public class RecategorizationPersistenceService {
entity.setValue(request.getValue());
}
entity.setProcessedDate(null);
entity.setSoftDeletedTime(null);
return entity;
}

View File

@ -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() {

View File

@ -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<String> 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<RecategorizationRequestModel> 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<ManualRecategorizationEntity> 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);
}
}