diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/ReanalyzeNonApprovedFilesService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/ReanalyzeNonApprovedFilesService.java new file mode 100644 index 000000000..f47ebb44e --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/ReanalyzeNonApprovedFilesService.java @@ -0,0 +1,38 @@ +package com.iqser.red.service.persistence.management.v1.processor.migration; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class ReanalyzeNonApprovedFilesService { + + private final DossierRepository dossierRepository; + private final FileRepository fileRepository; + private final ReanalysisService reanalysisService; + + + public void reanalyzeNonApprovedFiles() { + + List dossierEntities = dossierRepository.findAll(); + dossierEntities.forEach(dossierEntity -> { + Set unapprovedFilesByDossierIds = fileRepository.findByDossierIdAndWorkflowStatusNotApproved(dossierEntity.getId()).stream() + .map(FileEntity::getId) + .collect(Collectors.toSet()); + reanalysisService.reanalyzeFiles(dossierEntity.getId(), unapprovedFilesByDossierIds, true); + }); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ReanalyzeNonApprovedFilesMigration18.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ReanalyzeNonApprovedFilesMigration18.java new file mode 100644 index 000000000..ead549cf3 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ReanalyzeNonApprovedFilesMigration18.java @@ -0,0 +1,37 @@ +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.migration.ReanalyzeNonApprovedFilesService; + +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Setter +@Service +public class ReanalyzeNonApprovedFilesMigration18 extends Migration { + + @Autowired + private ReanalyzeNonApprovedFilesService reanalyzeNonApprovedFilesService; + + private static final String NAME = "Reanalyze all non-approved files"; + private static final long VERSION = 18; + + + public ReanalyzeNonApprovedFilesMigration18() { + + super(NAME, VERSION); + } + + + @Override + protected void migrate() { + + log.info("Reanalyzing all non-approved files."); + reanalyzeNonApprovedFilesService.reanalyzeNonApprovedFiles(); + } + +} 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 775564d99..8b12e1333 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 @@ -30,6 +30,10 @@ public interface FileRepository extends JpaRepository { List findByAddedBefore(OffsetDateTime end); + @Query("SELECT f FROM FileEntity f WHERE f.dossierId = :dossierId AND f.workflowStatus <> 'APPROVED'") + List findByDossierIdAndWorkflowStatusNotApproved(@Param("dossierId") String dossierId); + + @Modifying @Query("update FileEntity e set e.hasRedactions = :hasRedactions ," + " e.hasHints = :hasHints, e.hasSuggestions = :hasSuggestions," @@ -168,12 +172,13 @@ public interface FileRepository extends JpaRepository { @Param("lastUpdated") OffsetDateTime lastUpdated, @Param("softDeletedTime") OffsetDateTime softDeletedTime); + @Modifying @Query("update FileEntity f set f.processingStatus = :processingStatus, f.lastUpdated = :lastUpdated, " + "f.deleted = :softDeletedTime where f.id in (:fileIds)") int softDeleteFiles(@Param("fileIds") List fileIds, - @Param("processingStatus") ProcessingStatus processingStatus, - @Param("lastUpdated") OffsetDateTime lastUpdated, - @Param("softDeletedTime") OffsetDateTime softDeletedTime); + @Param("processingStatus") ProcessingStatus processingStatus, + @Param("lastUpdated") OffsetDateTime lastUpdated, + @Param("softDeletedTime") OffsetDateTime softDeletedTime); @Modifying @@ -380,10 +385,7 @@ public interface FileRepository extends JpaRepository { + " when f.deleted is not null then f.deleted " + "end " + "where f.id in (:fileIds)") - int hardDeleteFiles(@Param("fileIds") List fileIds, - @Param("processingStatus") ProcessingStatus processingStatus, - @Param("deletionTime") OffsetDateTime deletionTime); - + int hardDeleteFiles(@Param("fileIds") List fileIds, @Param("processingStatus") ProcessingStatus processingStatus, @Param("deletionTime") OffsetDateTime deletionTime); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalyzeNonApprovedFilesTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalyzeNonApprovedFilesTest.java new file mode 100644 index 000000000..0c39a9567 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalyzeNonApprovedFilesTest.java @@ -0,0 +1,82 @@ +package com.iqser.red.service.peristence.v1.server.integration.tests; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; +import com.iqser.red.service.persistence.management.v1.processor.migration.MigrationController; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; + +public class ReanalyzeNonApprovedFilesTest extends AbstractPersistenceServerServiceTest { + + @Autowired + private DossierTemplateTesterAndProvider dossierTemplateTesterAndProvider; + + @Autowired + private FileTesterAndProvider fileTesterAndProvider; + + @Autowired + private DossierTesterAndProvider dossierTesterAndProvider; + + @Autowired + private ReanalysisService reanalysisService; + + @Autowired + private MigrationController migrationController; + + @Autowired + private FileStatusManagementService fileStatusManagementService; + + + @Test + public void testReanalyzeNonApprovedFiles() { + + var filename1 = "test-dossier1-approved"; + var filename2 = "test-dossier1-not-approved"; + var filename3 = "test-dossier2-approved"; + var filename4 = "test-dossier2-not-approved"; + + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + var dossier1 = dossierTesterAndProvider.provideTestDossier(dossierTemplate, "dossier1"); + var dossier2 = dossierTesterAndProvider.provideTestDossier(dossierTemplate, "dossier2"); + + var file1 = fileTesterAndProvider.testAndProvideFile(dossier1, filename1); + var file2 = fileTesterAndProvider.testAndProvideFile(dossier1, filename2); + var file3 = fileTesterAndProvider.testAndProvideFile(dossier2, filename3); + var file4 = fileTesterAndProvider.testAndProvideFile(dossier2, filename4); + + fileStatusManagementService.setStatusApproved(dossier1.getId(), file1.getFileId(), "user"); + fileStatusManagementService.setStatusApproved(dossier2.getId(), file3.getFileId(), "user"); + + var fileStatus1 = fileStatusManagementService.getFileStatus(file1.getFileId()); + var fileStatus2 = fileStatusManagementService.getFileStatus(file2.getFileId()); + var fileStatus3 = fileStatusManagementService.getFileStatus(file3.getFileId()); + var fileStatus4 = fileStatusManagementService.getFileStatus(file4.getFileId()); + + assertEquals(fileStatus1.getWorkflowStatus(), WorkflowStatus.APPROVED); + assertEquals(fileStatus2.getWorkflowStatus(), WorkflowStatus.NEW); + assertEquals(fileStatus3.getWorkflowStatus(), WorkflowStatus.APPROVED); + assertEquals(fileStatus4.getWorkflowStatus(), WorkflowStatus.NEW); + + migrationController.run("Reanalyze all non-approved files", true); + + fileStatus1 = fileStatusManagementService.getFileStatus(file1.getFileId()); + fileStatus2 = fileStatusManagementService.getFileStatus(file2.getFileId()); + fileStatus3 = fileStatusManagementService.getFileStatus(file3.getFileId()); + fileStatus4 = fileStatusManagementService.getFileStatus(file4.getFileId()); + + assertEquals(fileStatus1.getProcessingStatus(), ProcessingStatus.PRE_PROCESSING_QUEUED); + assertEquals(fileStatus2.getProcessingStatus(), ProcessingStatus.FULL_PROCESSING); + assertEquals(fileStatus3.getProcessingStatus(), ProcessingStatus.PRE_PROCESSING_QUEUED); + assertEquals(fileStatus4.getProcessingStatus(), ProcessingStatus.FULL_PROCESSING); + } + +}