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, public EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId, @PathVariable(FILE_ID) String fileId,
@RequestParam(value = "excludedType", required = false) List<String> excludedTypes, @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, EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId, @PathVariable(FILE_ID) String fileId,
@RequestParam(value = "excludedType", required = false) List<String> excludedTypes, @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) @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, public EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId, @PathVariable(FILE_ID) String fileId,
@RequestParam(value = "excludedType", required = false) List<String> excludedTypes, @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); return entityLogService.getEntityLog(dossierId, fileId, excludedTypes, includeUnprocessed);
} }

View File

@ -35,5 +35,5 @@ public interface EntityLogResource {
EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId, EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId, @PathVariable(FILE_ID) String fileId,
@RequestParam(value = "excludedType", required = false) List<String> excludedTypes, @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; 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.time.OffsetDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -12,9 +14,11 @@ import java.util.Set;
import org.springframework.stereotype.Service; 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.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.entity.dossier.DossierEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; 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.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.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.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.EntityLog;
@ -51,6 +55,7 @@ public class EntityLogService {
UnprocessedManualEntityClient unprocessedManualEntityClient; UnprocessedManualEntityClient unprocessedManualEntityClient;
DossierService dossierService; DossierService dossierService;
CommentService commentService; CommentService commentService;
DictionaryPersistenceService dictionaryPersistenceService;
public EntityLog getEntityLog(String dossierId, String fileId) { public EntityLog getEntityLog(String dossierId, String fileId) {
@ -76,9 +81,10 @@ public class EntityLogService {
} }
if (includeUnprocessed) { if (includeUnprocessed) {
DossierEntity dossier = dossierService.getDossierById(dossierId);
ManualRedactions manualRedactions = manualRedactionProviderService.getManualRedactions(fileId, true); ManualRedactions manualRedactions = manualRedactionProviderService.getManualRedactions(fileId, true);
List<UnprocessedManualEntity> unprocessedManualEntities = getUnprocessedManualEntities(dossierId, fileId, manualRedactions); List<UnprocessedManualEntity> unprocessedManualEntities = getUnprocessedManualEntities(dossierId, fileId, dossier.getDossierTemplateId(), manualRedactions);
mergeEntityLog(manualRedactions, unprocessedManualEntities, entityLog); mergeEntityLog(manualRedactions, unprocessedManualEntities, entityLog, dossier.getDossierTemplateId());
} }
Map<String, Integer> commentCountPerAnnotationId = commentService.getCommentCounts(fileId); Map<String, Integer> commentCountPerAnnotationId = commentService.getCommentCounts(fileId);
@ -124,17 +130,16 @@ public class EntityLogService {
return entityLog; 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, dossierTemplateId, manualRedactions);
return unprocessedManualEntityClient.mergeUnprocessedManualEntities(fileId, dossierId, dossier.getDossierTemplateId(), 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"); log.info("Merging EntityLog");
mergeManualRedactionEntries(manualRedactions.getEntriesToAdd(), unprocessedManualEntities, entityLog); mergeManualRedactionEntries(manualRedactions.getEntriesToAdd(), unprocessedManualEntities, entityLog, dossierTemplateId);
mergeIdsToRemove(manualRedactions.getIdsToRemove(), entityLog); mergeIdsToRemove(manualRedactions.getIdsToRemove(), entityLog);
mergeResizeRedactions(manualRedactions.getResizeRedactions(), entityLog); mergeResizeRedactions(manualRedactions.getResizeRedactions(), entityLog);
mergeLegalBasisChanges(manualRedactions.getLegalBasisChanges(), 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 -> { manualRedactionEntries.forEach(manualRedactionEntry -> {
UnprocessedManualEntity unprocessedManualEntity = unprocessedManualEntities.stream() UnprocessedManualEntity unprocessedManualEntity = unprocessedManualEntities.stream()
@ -162,7 +167,7 @@ public class EntityLogService {
.value(manualRedactionEntry.getValue()) .value(manualRedactionEntry.getValue())
.legalBasis(manualRedactionEntry.getLegalBasis()) .legalBasis(manualRedactionEntry.getLegalBasis())
.reason(manualRedactionEntry.getReason()) .reason(manualRedactionEntry.getReason())
.entryType(isHint(manualRedactionEntry.getType()) ? EntryType.HINT : EntryType.ENTITY) .entryType(isHint(manualRedactionEntry.getType(), dossierTemplateId) ? EntryType.HINT : EntryType.ENTITY)
.imported(false) .imported(false)
.matchedRule("") .matchedRule("")
.section(manualRedactionEntry.getSection()) .section(manualRedactionEntry.getSection())
@ -199,12 +204,12 @@ public class EntityLogService {
idRemovals.forEach(idRemoval -> { idRemovals.forEach(idRemoval -> {
var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(idRemoval.getAnnotationId())).findAny(); var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(idRemoval.getAnnotationId())).findAny();
if (entity.isPresent()) { if (entity.isPresent()) {
entity.get().setState(EntryState.REMOVED); entity.get().setState(EntryState.IGNORED);
addChanges(entity.get().getChanges(), ChangeType.REMOVED); addChanges(entity.get().getChanges(), ChangeType.REMOVED, entityLog.getAnalysisNumber());
entity.get().getManualChanges().add(ManualChange.builder() entity.get().getManualChanges().add(ManualChange.builder()
.manualRedactionType(ManualRedactionType.REMOVE_LOCALLY) .manualRedactionType(ManualRedactionType.REMOVE_LOCALLY)
.requestedDate(idRemoval.getRequestDate()) .requestedDate(idRemoval.getRequestDate())
.processedDate(idRemoval.getProcessedDate()) .processedDate(null)
.userId(idRemoval.getUser()).build()); .userId(idRemoval.getUser()).build());
} }
}); });
@ -222,11 +227,11 @@ public class EntityLogService {
newPosition.getWidth(), newPosition.getWidth(),
newPosition.getHeight(), newPosition.getHeight(),
newPosition.getPage()))); newPosition.getPage())));
addChanges(entity.get().getChanges(), ChangeType.CHANGED); addChanges(entity.get().getChanges(), ChangeType.CHANGED, entityLog.getAnalysisNumber());
entity.get().getManualChanges().add(ManualChange.builder() entity.get().getManualChanges().add(ManualChange.builder()
.manualRedactionType(ManualRedactionType.RESIZE) .manualRedactionType(ManualRedactionType.RESIZE)
.requestedDate(manualResizeRedaction.getRequestDate()) .requestedDate(manualResizeRedaction.getRequestDate())
.processedDate(manualResizeRedaction.getProcessedDate()) .processedDate(null)
.userId(manualResizeRedaction.getUser()).build()); .userId(manualResizeRedaction.getUser()).build());
} }
}); });
@ -238,12 +243,16 @@ public class EntityLogService {
var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(manualLegalBasisChange.getAnnotationId())).findAny(); var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(manualLegalBasisChange.getAnnotationId())).findAny();
if (entity.isPresent()) { if (entity.isPresent()) {
entity.get().setLegalBasis(manualLegalBasisChange.getLegalBasis()); 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() entity.get().getManualChanges().add(ManualChange.builder()
.manualRedactionType(ManualRedactionType.LEGAL_BASIS_CHANGE) .manualRedactionType(ManualRedactionType.LEGAL_BASIS_CHANGE)
.requestedDate(manualLegalBasisChange.getRequestDate()) .requestedDate(manualLegalBasisChange.getRequestDate())
.processedDate(manualLegalBasisChange.getProcessedDate()) .processedDate(null)
.propertyChanges(Map.of("value", manualLegalBasisChange.getValue())) .propertyChanges(Map.of("value", manualLegalBasisChange.getValue(),
"section", manualLegalBasisChange.getSection(),
"legalBasis", manualLegalBasisChange.getLegalBasis()))
.userId(manualLegalBasisChange.getUser()) .userId(manualLegalBasisChange.getUser())
.build()); .build());
} }
@ -256,7 +265,7 @@ public class EntityLogService {
var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(recategorization.getAnnotationId())).findAny(); var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(recategorization.getAnnotationId())).findAny();
if (entity.isPresent()) { if (entity.isPresent()) {
entity.get().setType(recategorization.getType()); 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() entity.get().getManualChanges().add(ManualChange.builder()
.manualRedactionType(ManualRedactionType.RECATEGORIZE) .manualRedactionType(ManualRedactionType.RECATEGORIZE)
.requestedDate(recategorization.getRequestDate()) .requestedDate(recategorization.getRequestDate())
@ -274,7 +283,7 @@ public class EntityLogService {
if (entity.isPresent()) { if (entity.isPresent()) {
entity.get().setLegalBasis(forceRedaction.getLegalBasis()); entity.get().setLegalBasis(forceRedaction.getLegalBasis());
entity.get().setState(EntryState.APPLIED); 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() entity.get().getManualChanges().add(ManualChange.builder()
.manualRedactionType(ManualRedactionType.FORCE_REDACT) .manualRedactionType(ManualRedactionType.FORCE_REDACT)
.requestedDate(forceRedaction.getRequestDate()) .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()) { if (!changes.isEmpty()) {
var lastChange = changes.get(changes.size() -1);
changes.add(Change.builder() changes.add(Change.builder()
.analysisNumber(lastChange.getAnalysisNumber() + 1) .analysisNumber(analysisNumber + 1)
.dateTime(OffsetDateTime.now()) .dateTime(OffsetDateTime.now())
.type(changeType) .type(changeType)
.build()); .build());
} else { } 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.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import java.time.OffsetDateTime; 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 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.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.entity.dossier.DossierEntity;
import com.iqser.red.service.persistence.management.v1.processor.service.CommentService; import com.iqser.red.service.persistence.management.v1.processor.service.CommentService;
import com.iqser.red.service.persistence.management.v1.processor.service.DossierService; 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.FileManagementStorageService;
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; 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.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.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.EntityLog;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry;
@ -67,12 +70,15 @@ public class EntityLogTest {
@MockBean @MockBean
private UnprocessedManualEntityClient unprocessedManualEntityClient; private UnprocessedManualEntityClient unprocessedManualEntityClient;
@MockBean
private DictionaryPersistenceService dictionaryPersistenceService;
private EntityLogService entityLogService; private EntityLogService entityLogService;
@BeforeEach @BeforeEach
public void setUp() { 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() when(dossierService.getDossierById(dossierId)).thenReturn(DossierEntity.builder()
.dossierTemplateId(dossierTemplateId) .dossierTemplateId(dossierTemplateId)
.build()); .build());
when(dictionaryPersistenceService.getType(anyString())).thenReturn(TypeEntity.builder().isHint(false).build());
EntityLog response = entityLogService.getEntityLog(dossierId, fileId, null, true); EntityLog response = entityLogService.getEntityLog(dossierId, fileId, null, true);
@ -138,7 +145,7 @@ public class EntityLogTest {
assertTrue(optionalRemoveEntryLogEntry.isPresent()); assertTrue(optionalRemoveEntryLogEntry.isPresent());
var removeEntryLogEntry = optionalRemoveEntryLogEntry.get(); var removeEntryLogEntry = optionalRemoveEntryLogEntry.get();
assertEquals(removeEntryLogEntry.getEntryType(), EntryType.ENTITY); 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.getManualChanges().get(0).getManualRedactionType(), ManualRedactionType.REMOVE_LOCALLY);
assertEquals(removeEntryLogEntry.getChanges().get(0).getType(), ChangeType.REMOVED); assertEquals(removeEntryLogEntry.getChanges().get(0).getType(), ChangeType.REMOVED);
@ -258,6 +265,7 @@ public class EntityLogTest {
.annotationId(entryLegalBasisId) .annotationId(entryLegalBasisId)
.value("Random") .value("Random")
.legalBasis("New legal basis") .legalBasis("New legal basis")
.section("Section")
.build() .build()
)) ))
.forceRedactions(Set.of( .forceRedactions(Set.of(