Merge branch 'RED-7384' into 'release/4.244.x'

RED-7384: handle pending dict application in redaction-service instead of persistence

See merge request redactmanager/redaction-service!356
This commit is contained in:
Kilian Schüttler 2024-04-03 15:17:03 +02:00
commit 72f324bb11
4 changed files with 51 additions and 15 deletions

View File

@ -23,6 +23,8 @@ public class MigrationRequest {
String dossierId; String dossierId;
@NonNull @NonNull
String fileId; String fileId;
boolean fileIsApproved;
@NonNull @NonNull
ManualRedactions manualRedactions; ManualRedactions manualRedactions;
@NonNull @NonNull

View File

@ -68,7 +68,8 @@ public class MigrationMessageReceiver {
migrationRequest.getDossierTemplateId(), migrationRequest.getDossierTemplateId(),
migrationRequest.getManualRedactions(), migrationRequest.getManualRedactions(),
migrationRequest.getFileId(), migrationRequest.getFileId(),
migrationRequest.getEntitiesWithComments()); migrationRequest.getEntitiesWithComments(),
migrationRequest.isFileIsApproved());
log.info("Storing migrated entityLog and ids to migrate in DB for file {}", migrationRequest.getFileId()); log.info("Storing migrated entityLog and ids to migrate in DB for file {}", migrationRequest.getFileId());
redactionStorageService.storeObject(migrationRequest.getDossierId(), migrationRequest.getFileId(), FileType.ENTITY_LOG, migratedEntityLog.getEntityLog()); redactionStorageService.storeObject(migrationRequest.getDossierId(), migrationRequest.getFileId(), FileType.ENTITY_LOG, migratedEntityLog.getEntityLog());

View File

@ -20,7 +20,9 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.migration.MigratedIds; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.migration.MigratedIds;
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions;
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.BaseAnnotation; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.BaseAnnotation;
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval;
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry;
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction;
import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle;
import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog;
import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry;
@ -63,7 +65,8 @@ public class RedactionLogToEntityLogMigrationService {
String dossierTemplateId, String dossierTemplateId,
ManualRedactions manualRedactions, ManualRedactions manualRedactions,
String fileId, String fileId,
Set<String> entitiesWithComments) { Set<String> entitiesWithComments,
boolean fileIsApproved) {
log.info("Migrating entities for file {}", fileId); log.info("Migrating entities for file {}", fileId);
List<MigrationEntity> entitiesToMigrate = calculateMigrationEntitiesFromRedactionLog(redactionLog, document, dossierTemplateId, fileId); List<MigrationEntity> entitiesToMigrate = calculateMigrationEntitiesFromRedactionLog(redactionLog, document, dossierTemplateId, fileId);
@ -72,7 +75,7 @@ public class RedactionLogToEntityLogMigrationService {
.collect(new MigratedIdsCollector()); .collect(new MigratedIdsCollector());
log.info("applying manual changes to migrated entities for file {}", fileId); log.info("applying manual changes to migrated entities for file {}", fileId);
applyLocalProcessedManualChanges(entitiesToMigrate, manualRedactions); applyLocalProcessedManualChanges(entitiesToMigrate, manualRedactions, fileIsApproved);
EntityLog entityLog = new EntityLog(); EntityLog entityLog = new EntityLog();
entityLog.setAnalysisNumber(redactionLog.getAnalysisNumber()); entityLog.setAnalysisNumber(redactionLog.getAnalysisNumber());
@ -123,22 +126,29 @@ public class RedactionLogToEntityLogMigrationService {
} }
private void applyLocalProcessedManualChanges(List<MigrationEntity> entitiesToMigrate, ManualRedactions manualRedactions) { private void applyLocalProcessedManualChanges(List<MigrationEntity> entitiesToMigrate, ManualRedactions manualRedactions, boolean fileIsApproved) {
if (manualRedactions == null) { if (manualRedactions == null) {
return; return;
} }
Map<String, List<BaseAnnotation>> manualChangesPerAnnotationId;
Map<String, List<BaseAnnotation>> manualChangesPerAnnotationId = Stream.of(manualRedactions.getIdsToRemove(), if (fileIsApproved) {
manualRedactions.getEntriesToAdd(), manualChangesPerAnnotationId = manualRedactions.buildAll()
manualRedactions.getForceRedactions(), .stream()
manualRedactions.getResizeRedactions(), .filter(manualChange -> (manualChange.getProcessedDate() != null && manualChange.isLocal()) //
manualRedactions.getLegalBasisChanges(), // unprocessed dict change of type IdRemoval or ManualResize must be applied for approved documents
manualRedactions.getRecategorizations()) || (manualChange.getProcessedDate() == null && !manualChange.isLocal() //
.flatMap(Collection::stream) && (manualChange instanceof IdRemoval || manualChange instanceof ManualResizeRedaction)))
.filter(manualChange -> manualChange.getProcessedDate() != null) .map(this::convertPendingDictChangesToLocal)
.filter(BaseAnnotation::isLocal) .collect(Collectors.groupingBy(BaseAnnotation::getAnnotationId));
.collect(Collectors.groupingBy(BaseAnnotation::getAnnotationId)); } else {
manualChangesPerAnnotationId = manualRedactions.buildAll()
.stream()
.filter(manualChange -> manualChange.getProcessedDate() != null)
.filter(BaseAnnotation::isLocal)
.collect(Collectors.groupingBy(BaseAnnotation::getAnnotationId));
}
entitiesToMigrate.forEach(migrationEntity -> migrationEntity.applyManualChanges(manualChangesPerAnnotationId.getOrDefault(migrationEntity.getOldId(), entitiesToMigrate.forEach(migrationEntity -> migrationEntity.applyManualChanges(manualChangesPerAnnotationId.getOrDefault(migrationEntity.getOldId(),
Collections.emptyList()), Collections.emptyList()),
@ -147,6 +157,28 @@ public class RedactionLogToEntityLogMigrationService {
} }
private BaseAnnotation convertPendingDictChangesToLocal(BaseAnnotation baseAnnotation) {
if (baseAnnotation.getProcessedDate() != null) {
return baseAnnotation;
}
if (baseAnnotation.isLocal()) {
return baseAnnotation;
}
if (baseAnnotation instanceof ManualResizeRedaction manualResizeRedaction) {
manualResizeRedaction.setAddToAllDossiers(false);
manualResizeRedaction.setUpdateDictionary(false);
} else if (baseAnnotation instanceof IdRemoval idRemoval) {
idRemoval.setRemoveFromAllDossiers(false);
idRemoval.setRemoveFromDictionary(false);
}
return baseAnnotation;
}
private long getNumberOfApprovedEntries(RedactionLog redactionLog, int numberOfPages) { private long getNumberOfApprovedEntries(RedactionLog redactionLog, int numberOfPages) {
return redactionLog.getRedactionLogEntry() return redactionLog.getRedactionLogEntry()

View File

@ -178,7 +178,8 @@ public class MigrationIntegrationTest extends BuildDocumentIntegrationTest {
TEST_DOSSIER_TEMPLATE_ID, TEST_DOSSIER_TEMPLATE_ID,
manualRedactions, manualRedactions,
TEST_FILE_ID, TEST_FILE_ID,
Collections.emptySet()); Collections.emptySet(),
false);
redactionStorageService.storeObject(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.ENTITY_LOG, migratedEntityLog.getEntityLog()); redactionStorageService.storeObject(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.ENTITY_LOG, migratedEntityLog.getEntityLog());
assertEquals(mergedRedactionLog.getRedactionLogEntry().size(), migratedEntityLog.getEntityLog().getEntityLogEntry().size()); assertEquals(mergedRedactionLog.getRedactionLogEntry().size(), migratedEntityLog.getEntityLog().getEntityLogEntry().size());