From d9497ef45d2f311e520d7c29db376b3b7c844bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kilian=20Sch=C3=BCttler?= Date: Thu, 25 Jan 2024 09:29:58 +0100 Subject: [PATCH] RED-8371: after initial file upload flag calculation does not work --- .../controller/MigrationStatusController.java | 16 ++++++++++ .../resource/MigrationStatusResource.java | 7 +++++ .../migration/SaasMigrationService.java | 30 ++++++++++++++----- .../FileStatusProcessingUpdateService.java | 1 - .../repository/FileRepository.java | 7 ++++- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/MigrationStatusController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/MigrationStatusController.java index c9b64969b..206385c4f 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/MigrationStatusController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/MigrationStatusController.java @@ -68,6 +68,22 @@ public class MigrationStatusController implements MigrationStatusResource { return ResponseEntity.ok().build(); } + @Override + public ResponseEntity revertMigrationForFile(String dossierId, String fileId) { + + if (!fileStatusService.fileExists(fileId)) { + throw new NotFoundException(String.format("File with id %s does not exist", fileId)); + } + + if (!saasMigrationStatusPersistenceService.findById(fileId).getStatus().equals(FINISHED)) { + throw new BadRequestException(String.format("File with id %s is not migrated yet, can't revert.", fileId)); + } + + saasMigrationService.revertMigrationForFile(dossierId, fileId); + + return ResponseEntity.ok().build(); + } + @Override public ResponseEntity requeueErrorFiles() { diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/MigrationStatusResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/MigrationStatusResource.java index 728a4d532..691f04140 100644 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/MigrationStatusResource.java +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/MigrationStatusResource.java @@ -14,6 +14,7 @@ public interface MigrationStatusResource { String MIGRATION_STATUS_REST_PATH = ExternalApi.BASE_PATH + "/migration-status"; String START_MIGRATION_REST_PATH = ExternalApi.BASE_PATH + "/start_migration"; + String REVERT_MIGRATION_REST_PATH = ExternalApi.BASE_PATH + "/revert_migration"; String RETRY_MIGRATION_REST_PATH = ExternalApi.BASE_PATH + "/retry_migration"; String FILE_ID = "fileId"; @@ -34,6 +35,12 @@ public interface MigrationStatusResource { @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Success.")}) ResponseEntity startMigrationForFile(@RequestParam(value = DOSSIER_ID) String dossierId, @RequestParam(value = FILE_ID) String fileId); + @ResponseBody + @PostMapping(value = REVERT_MIGRATION_REST_PATH + FILE_ID_PATH_VARIABLE + DOSSIER_ID_PATH_VARIABLE) + @Operation(summary = "Start SAAS migration for specific file", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Success.")}) + ResponseEntity revertMigrationForFile(@RequestParam(value = DOSSIER_ID) String dossierId, @RequestParam(value = FILE_ID) String fileId); + @ResponseBody @PostMapping(value = RETRY_MIGRATION_REST_PATH) @Operation(summary = "Restart SAAS migration for all files in error state", description = "None") 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 ef88d107b..0d24b2078 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 @@ -208,8 +208,28 @@ public class SaasMigrationService implements TenantSyncService { MigratedIds migratedIds = getMigratedIds(dossierId, fileId); Map oldToNewMapping = migratedIds.buildOldToNewMapping(); + updateAnnotationIds(dossierId, fileId, oldToNewMapping); + saasMigrationStatusPersistenceService.updateStatus(fileId, SaasMigrationStatus.FINISHED); + + log.info("AnnotationIds migration finished for saas migration for tenant {} dossier {} and file {}", TenantContext.getTenantId(), dossierId, fileId); + finalizeMigration(); + } + + + public void revertMigrationForFile(String dossierId, String fileId) { + + log.info("Reverting Migration for dossierId {} and fileId {}", dossierId, fileId); + MigratedIds migratedIds = getMigratedIds(dossierId, fileId); + Map newToOldMapping = migratedIds.buildNewToOldMapping(); + updateAnnotationIds(dossierId, fileId, newToOldMapping); + saasMigrationStatusPersistenceService.createMigrationRequiredStatus(dossierId, fileId); + } + + + private void updateAnnotationIds(String dossierId, String fileId, Map idMapping) { + try { - updateAnnotationIds(fileId, oldToNewMapping); + updateAnnotationIds(fileId, idMapping); } catch (Exception e) { String message = String.format("Error during annotation id migration for tenant %s dossier %s and file %s, cause %s", TenantContext.getTenantId(), @@ -220,10 +240,6 @@ public class SaasMigrationService implements TenantSyncService { log.error(message); throw e; } - saasMigrationStatusPersistenceService.updateStatus(fileId, SaasMigrationStatus.FINISHED); - - log.info("AnnotationIds migration finished for saas migration for tenant {} dossier {} and file {}", TenantContext.getTenantId(), dossierId, fileId); - finalizeMigration(); } @@ -236,11 +252,11 @@ public class SaasMigrationService implements TenantSyncService { } - public void updateAnnotationIds(String fileId, Map oldToNewMapping) { + public void updateAnnotationIds(String fileId, Map idMapping) { AtomicInteger numUpdates = new AtomicInteger(0); AtomicInteger numCommentUpdates = new AtomicInteger(0); - oldToNewMapping.forEach((key, value) -> { + idMapping.forEach((key, value) -> { AnnotationEntityId oldAnnotationEntityId = buildAnnotationId(fileId, key); AnnotationEntityId newAnnotationEntityId = buildAnnotationId(fileId, value); numUpdates.getAndAdd(saasAnnotationIdMigrationService.updateManualAddRedaction(oldAnnotationEntityId, newAnnotationEntityId)); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusProcessingUpdateService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusProcessingUpdateService.java index 802a2cec7..7496bf35e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusProcessingUpdateService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusProcessingUpdateService.java @@ -28,7 +28,6 @@ public class FileStatusProcessingUpdateService { private final FileStatusService fileStatusService; private final IndexingService indexingService; private final DossierPersistenceService dossierPersistenceService; - private final AnalysisFlagsCalculationService analysisFlagsCalculationService; private final ManualRedactionService manualRedactionService; private final FileManagementServiceSettings settings; private final FileStatusPersistenceService fileStatusPersistenceService; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java index aad250fa6..4bd687674 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java @@ -299,7 +299,12 @@ public interface FileRepository extends JpaRepository { * * @return a List of Tuples of fileIds and dossierIds, where a flag calculation is necessary */ - @Query("select distinct f.id, f.dossierId from FileEntity f, ViewedPageEntity v where (f.lastFlagCalculation is NULL and f.lastProcessed is not NULL) or f.lastManualChangeDate > f.lastFlagCalculation or f.lastProcessed > f.lastFlagCalculation or (v.file.id = f.id and v.id.userId = f.assignee and f.lastFlagCalculation < v.viewedTime)") + @Query(""" + select distinct f.id, f.dossierId + from FileEntity f + left join ViewedPageEntity v on f.id = v.file.id and v.id.userId = f.assignee + where (f.lastFlagCalculation is NULL and f.lastProcessed is not NULL) or f.lastManualChangeDate > f.lastFlagCalculation or f.lastProcessed > f.lastFlagCalculation or f.lastFlagCalculation < v.viewedTime + """) List getFileIdentifiersWhereAnalysisFlagCalculationIsRequired(); }