diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStats.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStats.java index e00220ec9..f9fd4efa4 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStats.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStats.java @@ -17,6 +17,7 @@ import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.do public class DossierStats { private String dossierId; private int numberOfFiles; + private int numberOfSoftDeletedFiles; private int numberOfPages; // sum of pages private int numberOfExcludedPages; // sum of excludedPages private boolean hasRedactionsFilePresent; // true if at least one file in the dossier has redactions diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java index 4507935c9..9df3ae39a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java @@ -3,7 +3,6 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.dossier import com.fasterxml.jackson.annotation.JsonIgnore; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -138,5 +137,12 @@ public class FileEntity { @Column(updatable = false, insertable = false, name = "dossier_id") private String dossierId; + public boolean isSoftDeleted() { + return deleted != null; + } + + public boolean isDeleted() { + return deleted != null || hardDeletedTime != null || ProcessingStatus.DELETED.equals(processingStatus); + } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java index 5e4281b14..2cc39a622 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java @@ -20,7 +20,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @Service @@ -106,8 +105,8 @@ public class FileStatusPersistenceService { return; } fileRepository.setUpdateStatusIndexingSuccessful(fileId, ProcessingStatus.PROCESSED, - OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), - OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); + OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), + OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); } @@ -159,9 +158,10 @@ public class FileStatusPersistenceService { fileAttributesRepository.deleteByFileId(fileId); fileRepository.findById(fileId).ifPresentOrElse((file) -> { - if (isFileDeleted(file)) { + if (file.isDeleted()) { return; } + var fileAttributeEntities = convertFileAttributes(dossierId, file, fileAttributes); file.setLastFileAttributeChange(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); @@ -176,9 +176,10 @@ public class FileStatusPersistenceService { @Transactional public void setExcludedPages(String fileId, Set excludedPages) { fileRepository.findById(fileId).ifPresentOrElse((file) -> { - if (isFileDeleted(file)) { + if (file.isDeleted()) { return; } + file.setLastManualRedaction(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); file.setExcludedPages(excludedPages); @@ -197,7 +198,7 @@ public class FileStatusPersistenceService { public List getActiveFiles(String dossierId) { - return fileRepository.findByDossierId(dossierId).stream().filter(f -> !isFileDeleted(f)).collect(Collectors.toList()); + return fileRepository.findByDossierId(dossierId).stream().filter(f -> !f.isDeleted()).collect(Collectors.toList()); } @@ -217,7 +218,7 @@ public class FileStatusPersistenceService { public void softDelete(String fileId, OffsetDateTime softDeletedTime) { int countUpdate = fileRepository.setSoftDelete(fileId, ProcessingStatus.DELETED, - OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), softDeletedTime); + OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), softDeletedTime); if (countUpdate == 0) { throw new NotFoundException("Unknown file=" + fileId); } @@ -260,8 +261,8 @@ public class FileStatusPersistenceService { return; } int updateCount = fileRepository.setCurrentReviewer(fileId, currentReviewer, lastReviewer, - OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), - currentReviewer == null ? WorkflowStatus.UNASSIGNED : WorkflowStatus.UNDER_REVIEW); + OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), + currentReviewer == null ? WorkflowStatus.UNASSIGNED : WorkflowStatus.UNDER_REVIEW); if (updateCount == 0) { throw new NotFoundException("Unknown file=" + fileId); } @@ -288,9 +289,9 @@ public class FileStatusPersistenceService { }); int countUpdate = fileRepository.overwriteFile(fileId, filename, uploader, ProcessingStatus.FULLREPROCESS, - WorkflowStatus.UNASSIGNED, - OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), - OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); + WorkflowStatus.UNASSIGNED, + OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), + OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); if (countUpdate == 0) { throw new NotFoundException("Unknown file=" + fileId); } @@ -317,28 +318,15 @@ public class FileStatusPersistenceService { } - private boolean isFileDeleted(FileEntity file) { - - if (file == null || file.getDeleted() != null || file.getHardDeletedTime() != null || ProcessingStatus.DELETED.equals(file.getProcessingStatus())) { - return true; - } - return false; - } - - private boolean isFileDeleted(String fileId) { - - AtomicBoolean isFileDeleted = new AtomicBoolean(false); - fileRepository.findById(fileId).ifPresentOrElse((file) -> { - isFileDeleted.set(isFileDeleted(file)); - }, () -> { - throw new NotFoundException("Unknown file=" + fileId); - }); - - return isFileDeleted.get(); + return fileRepository.findById(fileId).map(FileEntity::isDeleted).orElse(false); } public boolean hasChangesSince(String dossierId, OffsetDateTime since) { return fileRepository.existsByDossierIdAndLastUpdatedIsAfter(dossierId, since); } + + public int countSoftDeletedFiles(String dossierId) { + return fileRepository.countSoftDeletedFiles(dossierId); + } } 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 2d2a68941..107e73640 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 @@ -117,6 +117,10 @@ public interface FileRepository extends JpaRepository { "where f.id = :fileId") int overwriteFile(String fileId, String filename, String uploader, ProcessingStatus processingStatus, WorkflowStatus workflowStatus, OffsetDateTime lastUploaded, OffsetDateTime lastUpdated); + + @Query("select count(f) from FileEntity f where f.dossierId = :dossierId and f.deleted is not null and f.hardDeletedTime is null") + int countSoftDeletedFiles(String dossierId); + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierStatsService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierStatsService.java index 1383ac8f8..626c89f30 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierStatsService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierStatsService.java @@ -35,6 +35,7 @@ public class DossierStatsService { // get the associated files List files = fileStatusService.getActiveFiles(dossierId); dossierStats.setNumberOfFiles(files.size()); + dossierStats.setNumberOfSoftDeletedFiles(fileStatusService.countSoftDeletedFiles(dossierId)); dossierStats.setNumberOfPages(files.stream().mapToInt(FileEntity::getNumberOfPages).sum()); dossierStats.setNumberOfExcludedPages(files.stream().mapToInt(f -> f.getExcludedPages().size()).sum()); files.stream().filter(FileEntity::isHasRedactions).findAny().ifPresent( diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java index ae9e764b4..196f4670b 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java @@ -10,7 +10,6 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier. import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.UserNotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; @@ -227,7 +226,7 @@ public class FileStatusService { } var fileAttributes = fileStatus.getFileAttributes(); - + var analyseRequest = AnalyzeRequest.builder() .dossierId(dossierId) .sectionsToReanalyse(sectionsToReanalyse) @@ -280,7 +279,7 @@ public class FileStatusService { public void overwriteFile(String dossierId, String fileId, String uploader, String filename, int length) { fileStatusPersistenceService.overwriteFile(fileId, uploader, filename); - wipeFileData(dossierId,fileId); + wipeFileData(dossierId, fileId); setStatusFullReprocess(dossierId, fileId, length); } @@ -291,8 +290,7 @@ public class FileStatusService { } - - public void wipeFileData(String dossierId, String fileId){ + public void wipeFileData(String dossierId, String fileId) { OffsetDateTime now = OffsetDateTime.now(); // remove everything related to redaction fileManagementStorageService.deleteObject(dossierId, fileId, FileType.REDACTION_LOG); @@ -350,6 +348,10 @@ public class FileStatusService { } public boolean hasChangesSince(String dossierId, OffsetDateTime since) { - return fileStatusPersistenceService.hasChangesSince(dossierId,since); + return fileStatusPersistenceService.hasChangesSince(dossierId, since); + } + + public int countSoftDeletedFiles(String dossierId) { + return fileStatusPersistenceService.countSoftDeletedFiles(dossierId); } }