Merge branch 'RED-8702-fix' into 'master'

RED-8702: Explore document databases to store entityLog

Closes RED-8702

See merge request redactmanager/persistence-service!445
This commit is contained in:
Maverick Studer 2024-04-12 12:40:22 +02:00
commit b002f7d544
7 changed files with 61 additions and 15 deletions

View File

@ -32,7 +32,7 @@ public class EntityLogController implements EntityLogResource {
@PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')")
public EntityLogResponse getEntityLog(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId,
@RequestParam(value = "excludedTypes", required = false) List<String> excludedTypes,
@RequestParam(value = "excludedTypes", required = false, defaultValue = "") List<String> excludedTypes,
@RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) {
accessControlService.checkViewPermissionsToDossier(dossierId);

View File

@ -40,7 +40,7 @@ public interface EntityLogResource {
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The dossier / file / entity log is not found.")})
EntityLogResponse getEntityLog(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId,
@RequestParam(value = "excludedTypes", required = false) List<String> excludedTypes,
@RequestParam(value = "excludedTypes", required = false, defaultValue = "") List<String> excludedTypes,
@RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed);

View File

@ -22,7 +22,7 @@ public class EntityLogInternalController implements EntityLogResource {
@Override
public EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId,
@RequestParam(value = "excludedType", required = false) List<String> excludedTypes,
@RequestParam(value = "excludedType", required = false, defaultValue = "") List<String> excludedTypes,
@RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) {
return entityLogService.getEntityLog(dossierId, fileId, excludedTypes, includeUnprocessed);

View File

@ -30,7 +30,7 @@ public interface EntityLogResource {
@GetMapping(value = InternalApi.BASE_PATH + ENTITY_LOG_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId,
@RequestParam(value = "excludedType", required = false) List<String> excludedTypes,
@RequestParam(value = "excludedType", required = false, defaultValue = "") List<String> excludedTypes,
@RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed);
}

View File

@ -140,7 +140,7 @@ public class FileManagementStorageService {
@SneakyThrows
public void saveEntityLog(String dossierId, String fileId, EntityLog entityLog) {
entityLogMongoService.upsertEntityLog(dossierId, fileId, entityLog);
entityLogMongoService.saveEntityLog(dossierId, fileId, entityLog);
}

View File

@ -46,7 +46,7 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT
EntityLog entityLogToStore = objectMapper.readValue(file.getInputStream(), EntityLog.class);
entityLogMongoService.insertEntityLog(TEST_DOSSIER_ID, TEST_FILE1_ID, entityLogToStore);
entityLogMongoService.saveEntityLog(TEST_DOSSIER_ID, TEST_FILE1_ID, entityLogToStore);
var optionalEntityLog = entityLogMongoService.findEntityLogByDossierIdAndFileId(TEST_DOSSIER_ID, TEST_FILE1_ID);
assertTrue(optionalEntityLog.isPresent());
@ -63,7 +63,7 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT
file = new ClassPathResource(String.format(ENTITY_LOG2));
entityLogToStore = objectMapper.readValue(file.getInputStream(), EntityLog.class);
entityLogMongoService.insertEntityLog(TEST_DOSSIER_ID, TEST_FILE2_ID, entityLogToStore);
entityLogMongoService.saveEntityLog(TEST_DOSSIER_ID, TEST_FILE2_ID, entityLogToStore);
optionalEntityLog = entityLogMongoService.findEntityLogByDossierIdAndFileId(TEST_DOSSIER_ID, TEST_FILE2_ID);
assertTrue(optionalEntityLog.isPresent());
@ -89,7 +89,7 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT
EntityLog entityLogToStore = objectMapper.readValue(file.getInputStream(), EntityLog.class);
entityLogMongoService.insertEntityLog(TEST_DOSSIER_ID, TEST_FILE1_ID, entityLogToStore);
entityLogMongoService.saveEntityLog(TEST_DOSSIER_ID, TEST_FILE1_ID, entityLogToStore);
var optionalEntityLog = entityLogMongoService.findEntityLogByDossierIdAndFileId(TEST_DOSSIER_ID, TEST_FILE1_ID);
assertTrue(optionalEntityLog.isPresent());
@ -115,7 +115,7 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT
EntityLog entityLog = objectMapper.readValue(file.getInputStream(), EntityLog.class);
entityLogMongoService.insertEntityLog(TEST_DOSSIER_ID, TEST_FILE3_ID, entityLog);
entityLogMongoService.saveEntityLog(TEST_DOSSIER_ID, TEST_FILE3_ID, entityLog);
Optional<EntityLog> found = entityLogMongoService.findEntityLogByDossierIdAndFileId(TEST_DOSSIER_ID, TEST_FILE3_ID);
assertTrue(found.isPresent());
@ -217,7 +217,7 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT
EntityLogEntry entityLogEntry = objectMapper.readValue(NEW_ENTITY_LOG_ENTRY, EntityLogEntry.class);
entityLogMongoService.insertEntityLogEntries(TEST_DOSSIER_ID, TEST_FILE3_ID, List.of(entityLogEntry));
entityLogMongoService.saveEntityLogEntries(TEST_DOSSIER_ID, TEST_FILE3_ID, List.of(entityLogEntry));
found = entityLogMongoService.findEntityLogByDossierIdAndFileId(TEST_DOSSIER_ID, TEST_FILE3_ID);
assertTrue(found.isPresent());
@ -236,7 +236,7 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT
EntityLog entityLog = objectMapper.readValue(file.getInputStream(), EntityLog.class);
entityLogMongoService.insertEntityLog(TEST_DOSSIER_ID, TEST_FILE3_ID, entityLog);
entityLogMongoService.saveEntityLog(TEST_DOSSIER_ID, TEST_FILE3_ID, entityLog);
Optional<EntityLog> found = entityLogMongoService.findEntityLogByDossierIdAndFileId(TEST_DOSSIER_ID, TEST_FILE3_ID);
assertTrue(found.isPresent());
@ -247,7 +247,7 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT
entityLog = objectMapper.readValue(file.getInputStream(), EntityLog.class);
entityLog.setAnalysisNumber(entityLog.getAnalysisNumber() + 1);
entityLogMongoService.upsertEntityLog(TEST_DOSSIER_ID, TEST_FILE3_ID, entityLog);
entityLogMongoService.saveEntityLog(TEST_DOSSIER_ID, TEST_FILE3_ID, entityLog);
found = entityLogMongoService.findEntityLogByDossierIdAndFileId(TEST_DOSSIER_ID, TEST_FILE3_ID);
assertTrue(found.isPresent());
@ -257,7 +257,6 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT
}
@Test
@SneakyThrows
public void testUpdateEntityLogWithoutEntries() {
@ -268,7 +267,7 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT
EntityLog entityLog = objectMapper.readValue(file.getInputStream(), EntityLog.class);
entityLogMongoService.insertEntityLog(TEST_DOSSIER_ID, TEST_FILE3_ID, entityLog);
entityLogMongoService.saveEntityLog(TEST_DOSSIER_ID, TEST_FILE3_ID, entityLog);
Optional<EntityLog> found = entityLogMongoService.findEntityLogByDossierIdAndFileId(TEST_DOSSIER_ID, TEST_FILE3_ID);
assertTrue(found.isPresent());
@ -288,4 +287,22 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT
}
@Test
@SneakyThrows
public void testGetWithNullExcludedTypes() {
var file = new ClassPathResource(String.format(ENTITY_LOG1));
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
EntityLog entityLogToStore = objectMapper.readValue(file.getInputStream(), EntityLog.class);
entityLogMongoService.saveEntityLog(TEST_DOSSIER_ID, TEST_FILE1_ID, entityLogToStore);
var optionalEntityLog = entityLogMongoService.findEntityLogWithoutExcludedEntryTypes(TEST_DOSSIER_ID, TEST_FILE1_ID, null);
assertTrue(optionalEntityLog.isPresent());
}
}

View File

@ -48,6 +48,17 @@ public class EntityLogMongoService {
}
public void saveEntityLog(String dossierId, String fileId, EntityLog entityLog) {
EntityLogDocument entityLogDocument = entityLogDocumentRepository.save(mapper.toLogDocument(dossierId, fileId, entityLog));
entityLogEntryDocumentRepository.saveAll(entityLog.getEntityLogEntry()
.stream()
.map(entityLogEntry -> mapper.toLogEntryDocument(entityLogDocument.getId(), entityLogEntry))
.toList());
}
// this does everything : insert when not found and update if found
public void upsertEntityLog(String dossierId, String fileId, EntityLog entityLog) {
@ -106,6 +117,23 @@ public class EntityLogMongoService {
entityLogDocumentRepository.save(entityLogDocument);
}
public void saveEntityLogEntries(String dossierId, String fileId, List<EntityLogEntry> entityLogEntries) {
String entityLogId = mapper.getLogId(dossierId, fileId);
EntityLogDocument entityLogDocument = getEntityLogDocument(entityLogId);
List<EntityLogEntryDocument> entityLogEntryDocuments = entityLogEntries.stream()
.map(entityLogEntry -> mapper.toLogEntryDocument(entityLogId, entityLogEntry))
.toList();
entityLogDocument.getEntityLogEntryDocuments().addAll(entityLogEntryDocuments);
entityLogEntryDocumentRepository.saveAll(entityLogEntryDocuments);
entityLogDocumentRepository.save(entityLogDocument);
}
public void updateEntityLogEntries(String dossierId, String fileId, List<EntityLogEntry> entityLogEntries) {
@ -236,11 +264,12 @@ public class EntityLogMongoService {
public Optional<EntityLog> findEntityLogWithoutExcludedEntryTypes(String dossierId, String fileId, List<String> excludedTypes) {
var excludedTypesNonNull = excludedTypes == null ? new ArrayList<String>() : excludedTypes;
String entityLogId = mapper.getLogId(dossierId, fileId);
Optional<EntityLog> optionalEntityLog = entityLogDocumentRepository.findEntityLogDocumentWithoutEntriesById(entityLogId)
.map(mapper::fromLogDocument);
optionalEntityLog.ifPresent(entityLog -> entityLog.getEntityLogEntry()
.addAll(entityLogEntryDocumentRepository.findEntityLogDocumentByIdAndExcludedTypes(entityLogId, excludedTypes)
.addAll(entityLogEntryDocumentRepository.findEntityLogDocumentByIdAndExcludedTypes(entityLogId, excludedTypesNonNull)
.stream()
.map(mapper::fromLogEntryDocument)
.toList()));