diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/SaasMigrationManualChangesUpdateService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/SaasMigrationManualChangesUpdateService.java new file mode 100644 index 000000000..cfdcfbd6f --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/SaasMigrationManualChangesUpdateService.java @@ -0,0 +1,83 @@ +package com.iqser.red.service.persistence.management.v1.processor.migration; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; + +import org.springframework.stereotype.Service; + +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.model.ManualChangesQueryOptions; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.AddRedactionPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.RemoveRedactionPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.ResizeRedactionPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class SaasMigrationManualChangesUpdateService { + + private final AddRedactionPersistenceService addRedactionPersistenceService; + + private final HashFunction hashFunction = Hashing.murmur3_128(); + + + public void convertUnprocessedAddToDictionariesToLocalChanges(String fileId) { + + var unprocessedManualAdds = addRedactionPersistenceService.findEntriesByFileIdAndOptions(fileId, ManualChangesQueryOptions.unprocessedOnly()); + for (var unprocessedManualAdd : unprocessedManualAdds) { + + if (!unprocessedManualAdd.getDictionaryEntryType().equals(DictionaryEntryType.ENTRY)) { + continue; + } + + if (unprocessedManualAdd.isAddToDictionary() || unprocessedManualAdd.isAddToAllDossiers()) { + // copy pending dict change to a new one with a different id. Can't reuse the same one, as it's the primary key of the table. + // It has no functionality, its only there, such that the UI can show a pending change. + ManualRedactionEntryEntity pendingDictAdd = ManualRedactionEntryEntity.builder() + .id(buildSecondaryId(unprocessedManualAdd.getId(), fileId)) + .user(unprocessedManualAdd.getUser()) + .typeId(unprocessedManualAdd.getTypeId()) + .value(unprocessedManualAdd.getValue()) + .reason(unprocessedManualAdd.getReason()) + .legalBasis(unprocessedManualAdd.getLegalBasis()) + .section(unprocessedManualAdd.getSection()) + .rectangle(unprocessedManualAdd.isRectangle()) + .addToDictionary(unprocessedManualAdd.isAddToDictionary()) + .addToAllDossiers(unprocessedManualAdd.isAddToAllDossiers()) + .dictionaryEntryType(DictionaryEntryType.ENTRY) + .requestDate(unprocessedManualAdd.getRequestDate()) + .positions(new ArrayList<>(unprocessedManualAdd.getPositions())) // copy to new List + .fileStatus(unprocessedManualAdd.getFileStatus()) + .textBefore(unprocessedManualAdd.getTextBefore()) + .textAfter(unprocessedManualAdd.getTextAfter()) + .sourceId(unprocessedManualAdd.getSourceId()) + .typeIdsOfModifiedDictionaries(unprocessedManualAdd.getTypeIdsOfModifiedDictionaries()) + .build(); + + addRedactionPersistenceService.update(pendingDictAdd); + + // change existing dict add to unprocessed manual add. ID must match with prior entry, such that other unprocessed manual changes may be applied to it. + unprocessedManualAdd.setAddToDictionary(false); + unprocessedManualAdd.setAddToAllDossiers(false); + unprocessedManualAdd.setLegalBasis(""); + unprocessedManualAdd.setTypeIdsOfModifiedDictionaries(Collections.emptySet()); + unprocessedManualAdd.setDictionaryEntryType(null); + + addRedactionPersistenceService.update(unprocessedManualAdd); + } + } + } + + + private AnnotationEntityId buildSecondaryId(AnnotationEntityId annotationEntityId, String fileId) { + + return new AnnotationEntityId(hashFunction.hashString(annotationEntityId.getAnnotationId(), StandardCharsets.UTF_8).toString(), fileId); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/SaasMigrationService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/SaasMigrationService.java index cc0339fdd..30f299e4c 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/SaasMigrationService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/SaasMigrationService.java @@ -227,8 +227,7 @@ public class SaasMigrationService implements TenantSyncService { saasMigrationStatusPersistenceService.updateStatus(fileId, SaasMigrationStatus.FINISHED); log.info("AnnotationIds migration finished for saas migration for tenant {} dossier {} and file {}", TenantContext.getTenantId(), dossierId, fileId); -// finalizeMigration(); // AutomaticAnalysisJob should be re-enabled by re-starting the persistence service pod after a rule change -// This ensures no analysis will happen with outdated rules + finalizeMigration(); // AutomaticAnalysisJob should be re-enabled by re-starting the persistence service pod after a rule change } @@ -297,7 +296,7 @@ public class SaasMigrationService implements TenantSyncService { private void finalizeMigration() { if (saasMigrationStatusPersistenceService.countByStatus(SaasMigrationStatus.FINISHED) == saasMigrationStatusPersistenceService.countAll()) { - automaticAnalysisJob.startForTenant(TenantContext.getTenantId()); +// automaticAnalysisJob.startForTenant(TenantContext.getTenantId()); tenantProvider.updateDetails(TenantContext.getTenantId(), UpdateDetailsRequest.builder().key("persistence-service-ready").value(true).build()); log.info("Saas migration finished for tenantId {}, re-enabled scheduler", TenantContext.getTenantId()); }