Merge branch 'RED-7384-bp' into 'release/2.349.x'

RED-7384: fixes for migration backport

See merge request redactmanager/persistence-service!365
This commit is contained in:
Kilian Schüttler 2024-02-26 17:55:51 +01:00
commit 0bd3da352e
7 changed files with 118 additions and 19 deletions

View File

@ -10,11 +10,13 @@ import com.iqser.red.service.persistence.management.v1.processor.service.Indexin
import com.iqser.red.service.persistence.management.v1.processor.service.job.AutomaticAnalysisJob;
import com.iqser.red.service.persistence.management.v1.processor.service.layoutparsing.LayoutParsingRequestFactory;
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.FileStatusPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.SaasMigrationStatusPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings;
import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils;
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.entitymapped.ManualRedactionEntry;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.SaasMigrationStatus;
import com.iqser.red.service.redaction.v1.model.MigrationRequest;
@ -35,6 +37,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
@ -62,6 +65,7 @@ public class SaasMigrationService implements TenantSyncService {
StorageService storageService;
SaasAnnotationIdMigrationService saasAnnotationIdMigrationService;
UncompressedFilesMigrationService uncompressedFilesMigrationService;
ManualRedactionService manualRedactionService;
@Override
@ -188,7 +192,7 @@ public class SaasMigrationService implements TenantSyncService {
saasMigrationStatusPersistenceService.updateStatus(fileId, SaasMigrationStatus.REDACTION_LOGS_MIGRATED);
log.info("EntityLog migration finished for saas migration for tenant {} dossier {} and file {}", TenantContext.getTenantId(), dossierId, fileId);
migrateAnnotationIds(dossierId, fileId);
migrateAnnotationIdsAndAddManualAddRedactions(dossierId, fileId);
}
@ -215,11 +219,14 @@ public class SaasMigrationService implements TenantSyncService {
}
private void migrateAnnotationIds(String dossierId, String fileId) {
private void migrateAnnotationIdsAndAddManualAddRedactions(String dossierId, String fileId) {
MigratedIds migratedIds = getMigratedIds(dossierId, fileId);
Map<String, String> oldToNewMapping = migratedIds.buildOldToNewMapping();
updateAnnotationIds(dossierId, fileId, oldToNewMapping);
List<ManualRedactionEntry> manualRedactionEntriesToAdd = migratedIds.getManualRedactionEntriesToAdd();
int count = addManualRedactionEntries(manualRedactionEntriesToAdd);
log.info("Added {} additional manual entries.", count);
saasMigrationStatusPersistenceService.updateStatus(fileId, SaasMigrationStatus.FINISHED);
log.info("AnnotationIds migration finished for saas migration for tenant {} dossier {} and file {}", TenantContext.getTenantId(), dossierId, fileId);
@ -227,16 +234,29 @@ public class SaasMigrationService implements TenantSyncService {
}
private int addManualRedactionEntries(List<ManualRedactionEntry> manualRedactionEntriesToAdd) {
return manualRedactionService.addManualRedactionEntries(manualRedactionEntriesToAdd, true);
}
public void revertMigrationForFile(String dossierId, String fileId) {
log.info("Reverting Migration for dossierId {} and fileId {}", dossierId, fileId);
MigratedIds migratedIds = getMigratedIds(dossierId, fileId);
Map<String, String> newToOldMapping = migratedIds.buildNewToOldMapping();
updateAnnotationIds(dossierId, fileId, newToOldMapping);
deleteManualRedactionEntries(migratedIds.getManualRedactionEntriesToAdd());
saasMigrationStatusPersistenceService.createMigrationRequiredStatus(dossierId, fileId);
}
private void deleteManualRedactionEntries(List<ManualRedactionEntry> manualRedactionEntriesToAdd) {
manualRedactionService.deleteManualRedactionEntries(manualRedactionEntriesToAdd);
}
private void updateAnnotationIds(String dossierId, String fileId, Map<String, String> idMapping) {
try {

View File

@ -15,8 +15,10 @@ import org.springframework.transaction.annotation.Transactional;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualResizeRedactionEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.RectangleEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.CommentService;
@ -33,6 +35,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.ResizeRedactionPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.utils.ManualRedactionMapper;
import com.iqser.red.service.persistence.management.v1.processor.utils.ManualResizeRedactionMapper;
import com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils;
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.annotations.AddRedactionRequest;
@ -46,6 +49,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations
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.dossiertemplate.dossier.file.FileModel;
import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter;
import io.micrometer.observation.annotation.Observed;
import lombok.AccessLevel;
@ -384,4 +388,50 @@ public class ManualRedactionService {
}
}
public int addManualRedactionEntries(List<ManualRedactionEntry> manualRedactionEntriesToAdd, boolean addAsProcessed) {
List<ManualRedactionEntryEntity> manualRedactionEntryEntities = manualRedactionEntriesToAdd.stream()
.map(this::toManualRedactionEntryEntity)
.toList();
if (addAsProcessed) {
manualRedactionEntryEntities.forEach(e -> e.setProcessedDate(OffsetDateTime.now()));
}
return addRedactionPersistenceService.insert(manualRedactionEntryEntities).size();
}
private ManualRedactionEntryEntity toManualRedactionEntryEntity(ManualRedactionEntry manualRedactionEntry) {
var file = fileStatusPersistenceService.getStatus(manualRedactionEntry.getFileId());
String dossierId = file.getDossierId();
String dossierTemplateId = dossierPersistenceService.getDossierTemplateId(dossierId);
String type = manualRedactionEntry.getType();
ManualRedactionEntryEntity manualRedactionEntryEntity = MagicConverter.convert(manualRedactionEntry, ManualRedactionEntryEntity.class);
String typeId;
if (manualRedactionEntry.isAddToDossierDictionary()) {
typeId = TypeIdUtils.toTypeId(type, dossierTemplateId, dossierId);
} else {
typeId = TypeIdUtils.toTypeId(type, dossierTemplateId);
}
manualRedactionEntryEntity.setTypeId(typeId);
manualRedactionEntryEntity.setTypeIdsOfModifiedDictionaries(Set.of(typeId));
manualRedactionEntryEntity.setId(new AnnotationEntityId(manualRedactionEntry.getAnnotationId(), manualRedactionEntry.getFileId()));
manualRedactionEntryEntity.setPositions(manualRedactionEntry.getPositions()
.stream()
.map(p -> MagicConverter.convert(p, RectangleEntity.class))
.toList());
manualRedactionEntryEntity.setRequestDate(file.getAdded());
manualRedactionEntryEntity.setFileStatus(file);
return manualRedactionEntryEntity;
}
public void deleteManualRedactionEntries(List<ManualRedactionEntry> list) {
list.forEach(manualRedactionEntry -> addRedactionPersistenceService.hardDelete(manualRedactionEntry.getFileId(), manualRedactionEntry.getAnnotationId()));
}
}

View File

@ -116,23 +116,28 @@ public class DossierPersistenceService {
@Transactional
public void update(String dossierId, CreateOrUpdateDossierRequest createOrUpdateDossierRequest) {
dossierRepository.findById(dossierId).ifPresent(dossier -> {
BeanUtils.copyProperties(createOrUpdateDossierRequest, dossier, "watermarkId", "previewWatermarkId");
dossier.setDossierTemplate(dossierTemplateRepository.getOne(createOrUpdateDossierRequest.getDossierTemplateId()));
dossier.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossierRepository.findById(dossierId)
.ifPresent(dossier -> {
BeanUtils.copyProperties(createOrUpdateDossierRequest, dossier, "watermarkId", "previewWatermarkId");
dossier.setDossierTemplate(dossierTemplateRepository.getOne(createOrUpdateDossierRequest.getDossierTemplateId()));
dossier.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossier.getReportTemplates()
.forEach(t -> t.getDossiers().removeIf(d -> d.getId().equals(dossierId) && !createOrUpdateDossierRequest.getReportTemplateIds().contains(t.getTemplateId())));
var reportTemplates = reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds());
reportTemplates.forEach(r -> {
if (!r.getDossiers().stream().map(DossierEntity::getId).collect(Collectors.toSet()).contains(dossierId)) {
r.getDossiers().add(dossier);
}
});
dossier.setReportTemplates(reportTemplates);
this.handleDossierStatus(createOrUpdateDossierRequest, dossier);
this.handleWatermark(createOrUpdateDossierRequest, dossier);
});
dossier.getReportTemplates()
.forEach(t -> t.getDossiers()
.removeIf(d -> d.getId().equals(dossierId) && !createOrUpdateDossierRequest.getReportTemplateIds().contains(t.getTemplateId())));
var reportTemplates = reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds());
reportTemplates.forEach(r -> {
if (!r.getDossiers()
.stream()
.map(DossierEntity::getId)
.collect(Collectors.toSet()).contains(dossierId)) {
r.getDossiers().add(dossier);
}
});
dossier.setReportTemplates(reportTemplates);
this.handleDossierStatus(createOrUpdateDossierRequest, dossier);
this.handleWatermark(createOrUpdateDossierRequest, dossier);
});
}
@ -151,7 +156,8 @@ public class DossierPersistenceService {
public DossierEntity findByDossierId(String dossierId) {
return dossierRepository.findById(dossierId).orElseThrow(() -> new DossierNotFoundException(DOSSIER_NOT_FOUND_MESSAGE));
return dossierRepository.findById(dossierId)
.orElseThrow(() -> new DossierNotFoundException(DOSSIER_NOT_FOUND_MESSAGE));
}
@ -250,4 +256,10 @@ public class DossierPersistenceService {
}
}
public String getDossierTemplateId(String dossierId) {
return dossierRepository.findDossierTemplateId(dossierId);
}
}

View File

@ -1,5 +1,6 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
import com.iqser.red.service.persistence.management.v1.processor.entity.migration.SaasMigrationStatusEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.SaasMigrationStatusRepository;

View File

@ -47,6 +47,13 @@ public class AddRedactionPersistenceService {
}
@Transactional
public List<ManualRedactionEntryEntity> insert(List<ManualRedactionEntryEntity> manualRedactionEntryEntities) {
return manualRedactionRepository.saveAllAndFlush(manualRedactionEntryEntities);
}
public Optional<ManualRedactionEntryEntity> findById(String annotationId, String fileId) {
return manualRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId));
@ -110,6 +117,7 @@ public class AddRedactionPersistenceService {
manualRedactionRepository.updateSoftDelete(new AnnotationEntityId(annotationId, fileId), null);
}
@Transactional
public void update(ManualRedactionEntryEntity manualRedactionEntry) {

View File

@ -94,4 +94,8 @@ public interface DossierRepository extends JpaRepository<DossierEntity, String>
@Query("select count(d) from DossierEntity d where d.watermarkId = :watermarkId or d.previewWatermarkId = :watermarkId")
int countDossiersWithWatermarkInUse(@Param("watermarkId") long watermarkId);
@Query("select d.dossierTemplateId from DossierEntity d where d.id = :dossierId")
String findDossierTemplateId(@Param("dossierId") String dossierId);
}

View File

@ -4,6 +4,8 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -17,6 +19,8 @@ public class MigratedIds {
List<Mapping> mappings;
List<ManualRedactionEntry> manualRedactionEntriesToAdd;
public Map<String, String> buildOldToNewMapping() {