RED-7782 - Address PR comments

This commit is contained in:
Andrei Isvoran 2023-10-27 12:09:20 +03:00
parent 729881fcd4
commit da43634b19
6 changed files with 53 additions and 32 deletions

View File

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

View File

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

View File

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

View File

@ -35,5 +35,5 @@ public interface EntityLogResource {
EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId,
@RequestParam(value = "excludedType", required = false) List<String> excludedTypes,
@RequestParam(value = "unprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed);
@RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed);
}

View File

@ -1,5 +1,7 @@
package com.iqser.red.service.persistence.management.v1.processor.service;
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;
@ -12,9 +14,11 @@ import java.util.Set;
import org.springframework.stereotype.Service;
import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.UnprocessedManualEntityClient;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionProviderService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Change;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ChangeType;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog;
@ -51,6 +55,7 @@ public class EntityLogService {
UnprocessedManualEntityClient unprocessedManualEntityClient;
DossierService dossierService;
CommentService commentService;
DictionaryPersistenceService dictionaryPersistenceService;
public EntityLog getEntityLog(String dossierId, String fileId) {
@ -76,9 +81,10 @@ public class EntityLogService {
}
if (includeUnprocessed) {
DossierEntity dossier = dossierService.getDossierById(dossierId);
ManualRedactions manualRedactions = manualRedactionProviderService.getManualRedactions(fileId, true);
List<UnprocessedManualEntity> unprocessedManualEntities = getUnprocessedManualEntities(dossierId, fileId, manualRedactions);
mergeEntityLog(manualRedactions, unprocessedManualEntities, entityLog);
List<UnprocessedManualEntity> unprocessedManualEntities = getUnprocessedManualEntities(dossierId, fileId, dossier.getDossierTemplateId(), manualRedactions);
mergeEntityLog(manualRedactions, unprocessedManualEntities, entityLog, dossier.getDossierTemplateId());
}
Map<String, Integer> commentCountPerAnnotationId = commentService.getCommentCounts(fileId);
@ -124,17 +130,16 @@ public class EntityLogService {
return entityLog;
}
private List<UnprocessedManualEntity> getUnprocessedManualEntities(String dossierId, String fileId, ManualRedactions manualRedactions) {
private List<UnprocessedManualEntity> getUnprocessedManualEntities(String dossierId, String fileId, String dossierTemplateId, ManualRedactions manualRedactions) {
DossierEntity dossier = dossierService.getDossierById(dossierId);
return unprocessedManualEntityClient.mergeUnprocessedManualEntities(fileId, dossierId, dossier.getDossierTemplateId(), manualRedactions);
return unprocessedManualEntityClient.mergeUnprocessedManualEntities(fileId, dossierId, dossierTemplateId, manualRedactions);
}
public void mergeEntityLog(ManualRedactions manualRedactions, List<UnprocessedManualEntity> unprocessedManualEntities, EntityLog entityLog) {
public void mergeEntityLog(ManualRedactions manualRedactions, List<UnprocessedManualEntity> unprocessedManualEntities, EntityLog entityLog, String dossierTemplateId) {
log.info("Merging EntityLog");
mergeManualRedactionEntries(manualRedactions.getEntriesToAdd(), unprocessedManualEntities, entityLog);
mergeManualRedactionEntries(manualRedactions.getEntriesToAdd(), unprocessedManualEntities, entityLog, dossierTemplateId);
mergeIdsToRemove(manualRedactions.getIdsToRemove(), entityLog);
mergeResizeRedactions(manualRedactions.getResizeRedactions(), entityLog);
mergeLegalBasisChanges(manualRedactions.getLegalBasisChanges(), entityLog);
@ -144,7 +149,7 @@ public class EntityLogService {
}
private void mergeManualRedactionEntries(Set<ManualRedactionEntry> manualRedactionEntries, List<UnprocessedManualEntity> unprocessedManualEntities, EntityLog entityLog) {
private void mergeManualRedactionEntries(Set<ManualRedactionEntry> manualRedactionEntries, List<UnprocessedManualEntity> unprocessedManualEntities, EntityLog entityLog, String dossierTemplateId) {
manualRedactionEntries.forEach(manualRedactionEntry -> {
UnprocessedManualEntity unprocessedManualEntity = unprocessedManualEntities.stream()
@ -162,7 +167,7 @@ public class EntityLogService {
.value(manualRedactionEntry.getValue())
.legalBasis(manualRedactionEntry.getLegalBasis())
.reason(manualRedactionEntry.getReason())
.entryType(isHint(manualRedactionEntry.getType()) ? EntryType.HINT : EntryType.ENTITY)
.entryType(isHint(manualRedactionEntry.getType(), dossierTemplateId) ? EntryType.HINT : EntryType.ENTITY)
.imported(false)
.matchedRule("")
.section(manualRedactionEntry.getSection())
@ -199,12 +204,12 @@ public class EntityLogService {
idRemovals.forEach(idRemoval -> {
var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(idRemoval.getAnnotationId())).findAny();
if (entity.isPresent()) {
entity.get().setState(EntryState.REMOVED);
addChanges(entity.get().getChanges(), ChangeType.REMOVED);
entity.get().setState(EntryState.IGNORED);
addChanges(entity.get().getChanges(), ChangeType.REMOVED, entityLog.getAnalysisNumber());
entity.get().getManualChanges().add(ManualChange.builder()
.manualRedactionType(ManualRedactionType.REMOVE_LOCALLY)
.requestedDate(idRemoval.getRequestDate())
.processedDate(idRemoval.getProcessedDate())
.processedDate(null)
.userId(idRemoval.getUser()).build());
}
});
@ -222,11 +227,11 @@ public class EntityLogService {
newPosition.getWidth(),
newPosition.getHeight(),
newPosition.getPage())));
addChanges(entity.get().getChanges(), ChangeType.CHANGED);
addChanges(entity.get().getChanges(), ChangeType.CHANGED, entityLog.getAnalysisNumber());
entity.get().getManualChanges().add(ManualChange.builder()
.manualRedactionType(ManualRedactionType.RESIZE)
.requestedDate(manualResizeRedaction.getRequestDate())
.processedDate(manualResizeRedaction.getProcessedDate())
.processedDate(null)
.userId(manualResizeRedaction.getUser()).build());
}
});
@ -238,12 +243,16 @@ public class EntityLogService {
var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(manualLegalBasisChange.getAnnotationId())).findAny();
if (entity.isPresent()) {
entity.get().setLegalBasis(manualLegalBasisChange.getLegalBasis());
addChanges(entity.get().getChanges(), ChangeType.CHANGED);
entity.get().setSection(manualLegalBasisChange.getSection());
entity.get().setValue(manualLegalBasisChange.getValue());
addChanges(entity.get().getChanges(), ChangeType.CHANGED, entityLog.getAnalysisNumber());
entity.get().getManualChanges().add(ManualChange.builder()
.manualRedactionType(ManualRedactionType.LEGAL_BASIS_CHANGE)
.requestedDate(manualLegalBasisChange.getRequestDate())
.processedDate(manualLegalBasisChange.getProcessedDate())
.propertyChanges(Map.of("value", manualLegalBasisChange.getValue()))
.processedDate(null)
.propertyChanges(Map.of("value", manualLegalBasisChange.getValue(),
"section", manualLegalBasisChange.getSection(),
"legalBasis", manualLegalBasisChange.getLegalBasis()))
.userId(manualLegalBasisChange.getUser())
.build());
}
@ -256,7 +265,7 @@ public class EntityLogService {
var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(recategorization.getAnnotationId())).findAny();
if (entity.isPresent()) {
entity.get().setType(recategorization.getType());
addChanges(entity.get().getChanges(), ChangeType.CHANGED);
addChanges(entity.get().getChanges(), ChangeType.CHANGED, entityLog.getAnalysisNumber());
entity.get().getManualChanges().add(ManualChange.builder()
.manualRedactionType(ManualRedactionType.RECATEGORIZE)
.requestedDate(recategorization.getRequestDate())
@ -274,7 +283,7 @@ public class EntityLogService {
if (entity.isPresent()) {
entity.get().setLegalBasis(forceRedaction.getLegalBasis());
entity.get().setState(EntryState.APPLIED);
addChanges(entity.get().getChanges(), ChangeType.CHANGED);
addChanges(entity.get().getChanges(), ChangeType.CHANGED, entityLog.getAnalysisNumber());
entity.get().getManualChanges().add(ManualChange.builder()
.manualRedactionType(ManualRedactionType.FORCE_REDACT)
.requestedDate(forceRedaction.getRequestDate())
@ -285,23 +294,27 @@ public class EntityLogService {
});
}
private void addChanges(List<Change> changes, ChangeType changeType) {
private void addChanges(List<Change> changes, ChangeType changeType, int analysisNumber) {
if (!changes.isEmpty()) {
var lastChange = changes.get(changes.size() -1);
changes.add(Change.builder()
.analysisNumber(lastChange.getAnalysisNumber() + 1)
.analysisNumber(analysisNumber + 1)
.dateTime(OffsetDateTime.now())
.type(changeType)
.build());
} else {
changes.add(Change.builder().analysisNumber(1).dateTime(OffsetDateTime.now()).type(changeType).build());
changes.add(Change.builder().analysisNumber(analysisNumber).dateTime(OffsetDateTime.now()).type(changeType).build());
}
}
private boolean isHint(String manualRedactionEntryType) {
private boolean isHint(String type, String dossierTemplateId) {
return !(manualRedactionEntryType.equals("manual"));
String typeId = toTypeId(type, dossierTemplateId);
TypeEntity typeEntity = dictionaryPersistenceService.getType(typeId);
if (typeEntity == null) {
throw new NotFoundException("TypeEntity could not be found for typeId: " + typeId);
}
return typeEntity.isHint();
}
}

View File

@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
import java.time.OffsetDateTime;
@ -22,6 +23,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.testcontainers.shaded.com.google.common.collect.Lists;
import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.UnprocessedManualEntityClient;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
import com.iqser.red.service.persistence.management.v1.processor.service.CommentService;
import com.iqser.red.service.persistence.management.v1.processor.service.DossierService;
@ -29,6 +31,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.EntityL
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.persistence.DictionaryPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ChangeType;
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;
@ -67,12 +70,15 @@ public class EntityLogTest {
@MockBean
private UnprocessedManualEntityClient unprocessedManualEntityClient;
@MockBean
private DictionaryPersistenceService dictionaryPersistenceService;
private EntityLogService entityLogService;
@BeforeEach
public void setUp() {
entityLogService = new EntityLogService(fileManagementStorageService, fileStatusService, manualRedactionProviderService, unprocessedManualEntityClient, dossierService, commentService);
entityLogService = new EntityLogService(fileManagementStorageService, fileStatusService, manualRedactionProviderService, unprocessedManualEntityClient, dossierService, commentService, dictionaryPersistenceService);
}
@ -114,6 +120,7 @@ public class EntityLogTest {
when(dossierService.getDossierById(dossierId)).thenReturn(DossierEntity.builder()
.dossierTemplateId(dossierTemplateId)
.build());
when(dictionaryPersistenceService.getType(anyString())).thenReturn(TypeEntity.builder().isHint(false).build());
EntityLog response = entityLogService.getEntityLog(dossierId, fileId, null, true);
@ -138,7 +145,7 @@ public class EntityLogTest {
assertTrue(optionalRemoveEntryLogEntry.isPresent());
var removeEntryLogEntry = optionalRemoveEntryLogEntry.get();
assertEquals(removeEntryLogEntry.getEntryType(), EntryType.ENTITY);
assertEquals(removeEntryLogEntry.getState(), EntryState.REMOVED);
assertEquals(removeEntryLogEntry.getState(), EntryState.IGNORED);
assertEquals(removeEntryLogEntry.getManualChanges().get(0).getManualRedactionType(), ManualRedactionType.REMOVE_LOCALLY);
assertEquals(removeEntryLogEntry.getChanges().get(0).getType(), ChangeType.REMOVED);
@ -258,6 +265,7 @@ public class EntityLogTest {
.annotationId(entryLegalBasisId)
.value("Random")
.legalBasis("New legal basis")
.section("Section")
.build()
))
.forceRedactions(Set.of(