From e792848efe4f860b095ee08330fd9e83b5734d7b Mon Sep 17 00:00:00 2001 From: deiflaender Date: Fri, 24 Jun 2022 12:22:56 +0200 Subject: [PATCH 1/8] RED-4343: Reworked logic for scheduling with maxRetries --- .../dossier/file/ProcessingStatus.java | 2 +- .../v1/api/resources/UploadResource.java | 2 - .../FileStatusPersistenceService.java | 16 +----- .../repository/FileRepository.java | 4 +- .../FileStatusProcessingUpdateService.java | 4 +- .../v1/server/service/FileStatusService.java | 56 +++++-------------- .../FileManagementServiceSettings.java | 2 +- 7 files changed, 21 insertions(+), 65 deletions(-) diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/ProcessingStatus.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/ProcessingStatus.java index ca0da62ba..0cae6cd17 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/ProcessingStatus.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/ProcessingStatus.java @@ -1,6 +1,6 @@ package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file; public enum ProcessingStatus { - ANALYSE, ERROR, FULLREPROCESS, IMAGE_ANALYZING, INDEXING, NER_ANALYZING, OCR_PROCESSING, PROCESSED, PROCESSING, REPROCESS, SURROUNDING_TEXT_PROCESSING, UNPROCESSED, FULL_PROCESSING, PRE_PROCESSING, PRE_PROCESSED, PRE_PROCESSING_FAILED + ANALYSE, ERROR, FULLREPROCESS, IMAGE_ANALYZING, INDEXING, NER_ANALYZING, OCR_PROCESSING, PROCESSED, PROCESSING, REPROCESS, SURROUNDING_TEXT_PROCESSING, UNPROCESSED, FULL_PROCESSING, PRE_PROCESSING, PRE_PROCESSED } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/UploadResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/UploadResource.java index f94a7b672..756c49cfb 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/UploadResource.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/UploadResource.java @@ -24,8 +24,6 @@ public interface UploadResource { String DOSSIER_ID_PARAM = "dossierId"; String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; - String FLATTEN_PARAM = "flatten"; - @PostMapping(value = UPLOAD_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) 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 341e71699..bddba18b5 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 @@ -68,17 +68,6 @@ public class FileStatusPersistenceService { } - @Transactional - public void updateProcessingStatusPreprocessingFailed(String fileId) { - - if (isFileDeleted(fileId)) { - return; - } - fileRepository.updateProcessingStatus(fileId, ProcessingStatus.PRE_PROCESSING_FAILED, OffsetDateTime.now() - .truncatedTo(ChronoUnit.MILLIS), calculateProcessingErrorCounter(fileId, ProcessingStatus.PRE_PROCESSING_FAILED)); - } - - @Transactional public void updateProcessingStatus(String fileId, int numberOfPages, long dictionaryVersion, long rulesVersion, long legalBasisVersion, long duration, long dossierDictionaryVersion, int analysisVersion, int analysisNumber) { @@ -370,9 +359,9 @@ public class FileStatusPersistenceService { } - public List getAllRelevantStatusesForReanalysisScheduler() { + public List getAllRelevantStatusesForReanalysisScheduler(int maxRetries) { - return fileRepository.getAllRelevantStatusesForReanalysisScheduler(); + return fileRepository.getAllRelevantStatusesForReanalysisScheduler(maxRetries); } @@ -394,7 +383,6 @@ public class FileStatusPersistenceService { switch (processingStatus) { case ERROR: - case PRE_PROCESSING_FAILED: return fileRepository.findById(fileId).map(FileEntity::getProcessingErrorCounter).orElse(0) + 1; case PROCESSED: 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 fdac4e25e..63612b524 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 @@ -149,8 +149,8 @@ public interface FileRepository extends JpaRepository { void setLastManualChangeDate(String fileId, OffsetDateTime lastManualChangeDate, OffsetDateTime lastUpdated); - @Query("select f from FileEntity f join DossierEntity d on d.id = f.dossierId where f.workflowStatus <> 'APPROVED' and f.excludedFromAutomaticAnalysis = false " + "and ( f.processingStatus = 'PROCESSED' or f.processingStatus = 'UNPROCESSED' or f.processingStatus = 'ERROR' )" + "and d.softDeletedTime is null and d.hardDeletedTime is null and d.archivedTime is null " + "and f.deleted is null and f.hardDeletedTime is null") - List getAllRelevantStatusesForReanalysisScheduler(); + @Query("select f from FileEntity f join DossierEntity d on d.id = f.dossierId where f.workflowStatus <> 'APPROVED' and f.excludedFromAutomaticAnalysis = false " + "and ( f.processingStatus = 'PROCESSED' or f.processingStatus = 'UNPROCESSED' or f.processingStatus = 'ERROR' )" + "and d.softDeletedTime is null and d.hardDeletedTime is null and d.archivedTime is null " + "and f.deleted is null and f.hardDeletedTime is null and f.processingErrorCounter <= :maxRetries") + List getAllRelevantStatusesForReanalysisScheduler(int maxRetries); @Modifying(clearAutomatically = true) diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java index c3fc63e4e..8e06f7a1e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java @@ -43,7 +43,7 @@ public class FileStatusProcessingUpdateService { fileStatusService.setStatusAnalyse(dossierId, fileId, false); //TODO This might be also priority depending on what was the pervious call. - fileStatusService.addToAnalysisQueue(dossierId, fileId, false, null, false); + fileStatusService.addToAnalysisQueue(dossierId, fileId, false, null); } break; @@ -80,7 +80,7 @@ public class FileStatusProcessingUpdateService { public void preprocessingFailed(String dossierId, String fileId) { - fileStatusService.updateProcessingStatusPreprocessingFailed(dossierId, fileId); + setStatusError(dossierId, fileId, "preprocessingFailed"); } 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 adc3b71b9..3100fc189 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 @@ -74,14 +74,13 @@ public class FileStatusService { private final FileManagementServiceSettings settings; private final ReanalysisRequiredStatusService reanalysisRequiredStatusService; private final ViewedPagesPersistenceService viewedPagesPersistenceService; - private final ApplicationConfigService applicationConfigService; private final FileManagementServiceSettings fileManagementServiceSettings; @Transactional public List getAllRelevantStatusesForReanalysisScheduler() { - var fileEntities = fileStatusPersistenceService.getAllRelevantStatusesForReanalysisScheduler(); + var fileEntities = fileStatusPersistenceService.getAllRelevantStatusesForReanalysisScheduler(fileManagementServiceSettings.getMaxErrorRetries()); var convertedList = convert(fileEntities, FileModel.class, new FileModelMapper()); return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convertedList).stream().filter(FileModel::isAnalysisRequired).collect(Collectors.toList()); } @@ -125,7 +124,7 @@ public class FileStatusService { public void updateProcessingStatusPreprocessed(String dossierId, String fileId, boolean hasHighlights, long fileSize) { fileStatusPersistenceService.updateProcessingStatusPreprocessed(fileId, hasHighlights, fileSize); - addToAnalysisQueue(dossierId, fileId, false, Set.of(), false); + addToAnalysisQueue(dossierId, fileId, false, Set.of()); if (fileManagementServiceSettings.isPdf2ImageServiceEnabled()) { addToPdf2ImageQueue(dossierId, fileId); @@ -134,16 +133,6 @@ public class FileStatusService { } - public void updateProcessingStatusPreprocessingFailed(String dossierId, String fileId) { - - // TODO add better logic than always reprocess. - - fileStatusPersistenceService.updateProcessingStatusPreprocessingFailed(fileId); - var fileEntity = fileStatusPersistenceService.getStatus(fileId); - addToPreprocessingQueue(dossierId, fileId, fileEntity.getFilename()); - } - - public void setExcludedPages(String fileId, Set excludedPages) { fileStatusPersistenceService.setExcludedPages(fileId, excludedPages); @@ -203,13 +192,8 @@ public class FileStatusService { return; } - if (fileStatus.getProcessingErrorCounter() >= settings.getMaxErrorRetries() && !triggeredManually) { - log.warn("File {} was {} times retried with failure", fileStatus.getId(), fileStatus.getProcessingErrorCounter()); - return; - } - fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.REPROCESS); - addToAnalysisQueue(dossierId, fileId, priority, sectionsToReanalyse, triggeredManually); + addToAnalysisQueue(dossierId, fileId, priority, sectionsToReanalyse); } @@ -235,18 +219,13 @@ public class FileStatusService { return; } - if (fileStatus.getProcessingErrorCounter() >= settings.getMaxErrorRetries()) { - log.warn("File {} was {} times retried with failure", fileStatus.getId(), fileStatus.getProcessingErrorCounter()); - return; - } - if (requiresStructureAnalysis) { log.info("Delete text and NER entities from file {} in dossier {}", fileId, dossierId); fileManagementStorageService.deleteObject(dossierId, fileId, FileType.TEXT); fileManagementStorageService.deleteObject(dossierId, fileId, FileType.NER_ENTITIES); } - addToAnalysisQueue(dossierId, fileId, priority, Sets.newHashSet(), false); + addToAnalysisQueue(dossierId, fileId, priority, Sets.newHashSet()); } @@ -262,18 +241,18 @@ public class FileStatusService { @Transactional - protected void addToAnalysisQueue(String dossierId, String fileId, boolean priority, Set sectionsToReanalyse, boolean triggeredManually) { + protected void addToAnalysisQueue(String dossierId, String fileId, boolean priority, Set sectionsToReanalyse) { var dossier = dossierPersistenceService.getAndValidateDossier(dossierId); var fileEntity = fileStatusPersistenceService.getStatus(fileId); - if (fileEntity.isExcluded()) { - log.debug("File {} is excluded", fileEntity.getId()); + if(!fileManagementStorageService.objectExists(dossierId, fileId, FileType.ORIGIN)){ + addToPreprocessingQueue(dossierId, fileId, fileEntity.getFilename()); return; } - if (fileEntity.getProcessingErrorCounter() >= settings.getMaxErrorRetries() && !triggeredManually) { - log.warn("File {} was {} times retried with failure", fileEntity.getId(), fileEntity.getProcessingErrorCounter()); + if (fileEntity.isExcluded()) { + log.debug("File {} is excluded", fileEntity.getId()); return; } @@ -347,7 +326,7 @@ public class FileStatusService { public void createStatus(String dossierId, String fileId, String uploader, String filename) { fileStatusPersistenceService.createStatus(dossierId, fileId, filename, uploader); - addToPreprocessingQueue(dossierId, fileId, filename); + addToAnalysisQueue(dossierId, fileId,false, Set.of()); } @@ -442,11 +421,6 @@ public class FileStatusService { return; } - if (fileStatus.getProcessingErrorCounter() >= settings.getMaxErrorRetries()) { - log.warn("File {} was {} times retried with failure", fileStatus.getId(), fileStatus.getProcessingErrorCounter()); - return; - } - fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.OCR_PROCESSING); addToOcrQueue(dossierId, fileId, 2); } @@ -497,6 +471,7 @@ public class FileStatusService { public void overwriteFile(String dossierId, String fileId, String uploader, String filename, boolean keepManualRedactions) { + fileManagementStorageService.deleteObject(dossierId, fileId, FileType.ORIGIN); fileManagementStorageService.deleteObject(dossierId, fileId, FileType.REDACTION_LOG); fileManagementStorageService.deleteObject(dossierId, fileId, FileType.SECTION_GRID); fileManagementStorageService.deleteObject(dossierId, fileId, FileType.IMAGE_INFO); @@ -512,7 +487,7 @@ public class FileStatusService { viewedPagesPersistenceService.deleteForFile(fileId); - addToPreprocessingQueue(dossierId, fileId, filename); + addToAnalysisQueue(dossierId, fileId, false, Set.of()); } @@ -567,13 +542,8 @@ public class FileStatusService { return; } - if (fileStatus.getProcessingErrorCounter() >= settings.getMaxErrorRetries()) { - log.warn("File {} was {} times retried with failure", fileStatus.getId(), fileStatus.getProcessingErrorCounter()); - return; - } - fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.ANALYSE); - addToAnalysisQueue(dossierId, fileId, priority, Sets.newHashSet(), false); + addToAnalysisQueue(dossierId, fileId, priority, Sets.newHashSet()); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/settings/FileManagementServiceSettings.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/settings/FileManagementServiceSettings.java index cf117f0a5..db1915e93 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/settings/FileManagementServiceSettings.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/settings/FileManagementServiceSettings.java @@ -30,6 +30,6 @@ public class FileManagementServiceSettings { private boolean pdf2ImageServiceEnabled; - private int maxErrorRetries = 5; + private int maxErrorRetries = 1; } From 9453a8250ae190a650d0f425ac529e42ba4cad8e Mon Sep 17 00:00:00 2001 From: devplant Date: Mon, 27 Jun 2022 10:28:44 +0300 Subject: [PATCH 2/8] RED-3081-As an admin of a dossier template I want to customize the highlighting color of a skipped redaction of an entity - validate skipped hex color when creating and updating a type - retrieve default value if one not provided - update tests --- .../server/controller/DictionaryController.java | 16 +++++++++++++++- .../server/integration/tests/DictionaryTest.java | 15 +++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DictionaryController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DictionaryController.java index 2d9ab83a2..72f168295 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DictionaryController.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DictionaryController.java @@ -19,6 +19,7 @@ import com.iqser.red.service.persistence.service.v1.api.resources.DictionaryReso import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @@ -116,6 +117,13 @@ public class DictionaryController implements DictionaryResource { validateColor(typeValueRequest.getHexColor()); validateBoolean(typeValueRequest.isHint(), "isHint"); validateBoolean(typeValueRequest.isCaseInsensitive(), "isCaseInsensitive"); + String skippedHexColor = typeValueRequest.getSkippedHexColor(); + if (StringUtils.isBlank(skippedHexColor)) { //use the default value + skippedHexColor = colorsService.getColors(typeValueRequest.getDossierTemplateId()).getNotRedacted(); + typeValueRequest.setSkippedHexColor(skippedHexColor); + } else { + validateColor(skippedHexColor); + } // To check whether the type exists Type typeResult = convert(dictionaryPersistenceService.getType(typeId), Type.class); @@ -169,7 +177,13 @@ public class DictionaryController implements DictionaryResource { } String color = typeRequest.getHexColor(); validateColor(color); - return convert(dictionaryPersistenceService.addType(typeRequest.getType(), typeRequest.getDossierTemplateId(), color, typeRequest.getRecommendationHexColor(), typeRequest.getSkippedHexColor(), typeRequest.getRank(), typeRequest.isHint(), typeRequest.isCaseInsensitive(), typeRequest.isRecommendation(), typeRequest.getDescription(), typeRequest.isAddToDictionaryAction(), typeRequest.getLabel(), typeRequest.getDossierId(), typeRequest.isHasDictionary(), typeRequest.isSystemManaged(), typeRequest.isAutoHideSkipped()), Type.class); + String skippedHexColor = typeRequest.getSkippedHexColor(); + if (StringUtils.isBlank(skippedHexColor)) { //use the default value + skippedHexColor = colorsService.getColors(typeRequest.getDossierTemplateId()).getNotRedacted(); + } else { + validateColor(typeRequest.getSkippedHexColor()); + } + return convert(dictionaryPersistenceService.addType(typeRequest.getType(), typeRequest.getDossierTemplateId(), color, typeRequest.getRecommendationHexColor(), skippedHexColor, typeRequest.getRank(), typeRequest.isHint(), typeRequest.isCaseInsensitive(), typeRequest.isRecommendation(), typeRequest.getDescription(), typeRequest.isAddToDictionaryAction(), typeRequest.getLabel(), typeRequest.getDossierId(), typeRequest.isHasDictionary(), typeRequest.isSystemManaged(), typeRequest.isAutoHideSkipped()), Type.class); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java index 775d9af0b..fcb6eaaa9 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java @@ -58,6 +58,21 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { assertThat(loadedType.getFalseRecommendationEntries()).hasSize(2); } + @Test + public void testSkippedColor() { + + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + var type = typeProvider.testAndProvideType(dossierTemplate); + assertThat(type.getRecommendationHexColor()).isEqualTo("#aaaaaa"); + assertThat(type.getSkippedHexColor()).isEqualTo("#aaaaaa"); + + type.setSkippedHexColor(null); + dictionaryClient.updateTypeValue(type.getTypeId(), type); + + var loadedType = dictionaryClient.getDictionaryForType(type.getId(), null); + assertThat(loadedType.getSkippedHexColor()).isNotNull(); + } + @Test public void testAddEntriesWithStopWord() { From dc4a14b97acb8816db37d05424a4829072c0ecda Mon Sep 17 00:00:00 2001 From: devplant Date: Mon, 27 Jun 2022 12:29:26 +0300 Subject: [PATCH 3/8] RED-4249-When I edit or create a dossier as an owner I want to select from multiple watermark configurations - changed the 200 status instead of 201 status for create/update - refactoring the creation/updating of watermark configuration - no disabled watermarks allowed in dossier creation - update tests --- .../v1/api/resources/WatermarkResource.java | 2 +- .../processor/service/WatermarkService.java | 48 ++++++---- .../DossierPersistenceService.java | 10 +- .../repository/DossierRepository.java | 4 +- .../integration/tests/WatermarkTest.java | 95 ++++++++++++++++++- 5 files changed, 133 insertions(+), 26 deletions(-) diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/WatermarkResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/WatermarkResource.java index 1123b95bd..a1984a09b 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/WatermarkResource.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/WatermarkResource.java @@ -16,7 +16,7 @@ public interface WatermarkResource { String DOSSIER_TEMPLATE_ID_PARAMETER_NAME = "dossierTemplateId"; - @ResponseStatus(HttpStatus.CREATED) + @ResponseStatus(HttpStatus.OK) @PostMapping(value = WATERMARK_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) Watermark createOrUpdateWatermark(@RequestBody Watermark watermark); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java index 9241ee552..2ba8e32b5 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java @@ -16,6 +16,7 @@ import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.util.List; +import java.util.Optional; @Slf4j @Service @@ -28,7 +29,7 @@ public class WatermarkService { @Transactional - public void deleteWatermark(Long watermarkId) { + public void deleteWatermark(long watermarkId) { watermarkRepository.findById(watermarkId).ifPresentOrElse(loadedWatermark -> { dossierRepository.countDeleteWatermark(watermarkId); dossierRepository.countDeletePreviewWatermark(watermarkId); @@ -39,7 +40,7 @@ public class WatermarkService { } - public WatermarkEntity getWatermark(Long watermarkId) { + public WatermarkEntity getWatermark(long watermarkId) { return watermarkRepository.findById(watermarkId) .orElseThrow(() -> new NotFoundException("Watermark Configuration not found")); @@ -51,22 +52,25 @@ public class WatermarkService { validateWatermark(watermark); if (watermark.getId() != null) { // update - watermarkRepository.findById(watermark.getId()) - .ifPresentOrElse(loadedWatermark -> { - validateWatermarkNameIsUnique(watermark.getName(), watermark.getDossierTemplateId(), loadedWatermark.getId()); - BeanUtils.copyProperties(watermark, loadedWatermark, "dossierTemplateId"); - var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId()); - loadedWatermark.setDossierTemplate(dossierTemplate); - }, () -> { - validateWatermarkNameIsUnique(watermark.getName(), watermark.getDossierTemplateId(), 0); - WatermarkEntity watermarkEntity = new WatermarkEntity(); - BeanUtils.copyProperties(watermark, watermarkEntity, "id"); - var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId()); - watermarkEntity.setDossierTemplate(dossierTemplate); - watermarkRepository.save(watermarkEntity); - }); - return watermarkRepository.findById(watermark.getId()).orElseThrow(() -> new NotFoundException("Watermark Configuration not found")); + Optional loadedWatermark = watermarkRepository.findById(watermark.getId()); + if (loadedWatermark.isPresent()) { + validateDossierTemplateId(watermark.getDossierTemplateId(), loadedWatermark.get().getDossierTemplateId()); + validateWatermarkNameIsUnique(watermark.getName(), loadedWatermark.get().getDossierTemplateId(), loadedWatermark.get().getId()); + BeanUtils.copyProperties(watermark, loadedWatermark.get(), "dossierTemplateId"); + var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(loadedWatermark.get().getDossierTemplateId()); + loadedWatermark.get().setDossierTemplate(dossierTemplate); + return loadedWatermark.get(); + } else { // if not found by id -> add it as a new watermark + validateDossierTemplateId(watermark.getDossierTemplateId(), null); + validateWatermarkNameIsUnique(watermark.getName(), watermark.getDossierTemplateId(), 0); + WatermarkEntity watermarkEntity = new WatermarkEntity(); + BeanUtils.copyProperties(watermark, watermarkEntity, "id"); + var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId()); + watermarkEntity.setDossierTemplate(dossierTemplate); + return watermarkRepository.save(watermarkEntity); + } } else { + validateDossierTemplateId(watermark.getDossierTemplateId(), null); validateWatermarkNameIsUnique(watermark.getName(), watermark.getDossierTemplateId(), 0); WatermarkEntity watermarkEntity = new WatermarkEntity(); BeanUtils.copyProperties(watermark, watermarkEntity, "id"); @@ -80,7 +84,7 @@ public class WatermarkService { private void validateWatermark(Watermark watermark) { if (StringUtils.isBlank(watermark.getName())) { - throw new BadRequestException("The watermark name must not be null"); + throw new BadRequestException("The watermark name must not be empty"); } if (StringUtils.isNotBlank(watermark.getText()) && !StringUtils.isAsciiPrintable(StringUtils.normalizeSpace(watermark.getText()))) { throw new BadRequestException("The watermark may only contain ASCII characters"); @@ -88,6 +92,14 @@ public class WatermarkService { } + private void validateDossierTemplateId(String newDossierTemplateId, String existingDossierTemplateId) { + if (newDossierTemplateId == null && existingDossierTemplateId == null) { + throw new BadRequestException("The dossier template id is not provided"); + } + if (newDossierTemplateId != null && existingDossierTemplateId != null && !existingDossierTemplateId.equals(newDossierTemplateId)) { + throw new ConflictException("The watermark dossier template id does not match"); + } + } private void validateWatermarkNameIsUnique(String watermarkName, String dossierTemplateId, long watermarkId) { getWatermarksForDossierTemplateId(dossierTemplateId).forEach(existing -> { if (existing.getName().equals(watermarkName) && existing.getId() != watermarkId) { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java index 96fb10815..622c7af00 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java @@ -101,9 +101,12 @@ public class DossierPersistenceService { if (createOrUpdateDossierRequest.getWatermarkId() != null) { var watermarkEntity = watermarkService.getWatermark(createOrUpdateDossierRequest.getWatermarkId()); if (watermarkEntity.getDossierTemplateId().equals(createOrUpdateDossierRequest.getDossierTemplateId())) { + if (!watermarkEntity.isEnabled()) { + throw new BadRequestException("Watermark configuration is disabled"); + } dossier.setWatermark(watermarkEntity); } else { - log.debug("Invalid watermark id"); + throw new BadRequestException("Invalid watermark id - dossierTemplate id does not match"); } } else { dossier.setWatermark(null); @@ -111,9 +114,12 @@ public class DossierPersistenceService { if (createOrUpdateDossierRequest.getPreviewWatermarkId() != null) { var previewWatermarkEntity = watermarkService.getWatermark(createOrUpdateDossierRequest.getPreviewWatermarkId()); if (previewWatermarkEntity.getDossierTemplateId().equals(createOrUpdateDossierRequest.getDossierTemplateId())) { + if (!previewWatermarkEntity.isEnabled()) { + throw new BadRequestException("Preview watermark configuration is disabled"); + } dossier.setPreviewWatermark(previewWatermarkEntity); } else { - log.debug("Invalid preview watermark id"); + throw new BadRequestException("Invalid preview watermark id - dossierTemplate id does not match"); } } else { dossier.setPreviewWatermark(null); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java index ba2d4854d..a523e65eb 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java @@ -61,9 +61,9 @@ public interface DossierRepository extends JpaRepository @Modifying @Query("update DossierEntity d set d.watermarkId = null where d.watermarkId = :watermarkId") - int countDeleteWatermark(Long watermarkId); + int countDeleteWatermark(long watermarkId); @Modifying @Query("update DossierEntity d set d.previewWatermarkId = null where d.previewWatermarkId = :previewWatermarkId") - int countDeletePreviewWatermark(Long previewWatermarkId); + int countDeletePreviewWatermark(long previewWatermarkId); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/WatermarkTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/WatermarkTest.java index 0b3cf6248..d625987d7 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/WatermarkTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/WatermarkTest.java @@ -46,11 +46,33 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { var saved = watermarkClient.createOrUpdateWatermark(watermark); var loadedWatermark = watermarkClient.getWatermark(saved.getId()); assertThat(loadedWatermark).isEqualTo(saved); + // try to save the same watermark without id + try { + watermarkClient.createOrUpdateWatermark(watermark); + } catch (FeignException e) { + assertThat(e.status()).isEqualTo(409); + } + + // try to save the same watermark with id + try { + watermarkClient.createOrUpdateWatermark(saved); + } catch (FeignException e) { + assertThat(e.status()).isEqualTo(409); + } + // update current watermark saved.setFontSize(14); - saved = watermarkClient.createOrUpdateWatermark(saved); - loadedWatermark = watermarkClient.getWatermark(saved.getId()); - assertThat(loadedWatermark).isEqualTo(saved); + saved.setDossierTemplateId(null); + var updated = watermarkClient.createOrUpdateWatermark(saved); + assertThat(updated.getDossierTemplateId()).isEqualTo(dossierTemplate.getId()); + + // update current watermark with new dossier template id + updated.setDossierTemplateId("dossierTemplate2"); + try { + watermarkClient.createOrUpdateWatermark(updated); + } catch (FeignException e) { + assertThat(e.status()).isEqualTo(409); + } var watermarkList = watermarkClient.getWatermarksForDossierTemplateId(dossierTemplate.getId()); assertThat(watermarkList.size()).isEqualTo(1); @@ -66,6 +88,29 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { } catch (FeignException.FeignClientException e) { assertThat(e.status()).isEqualTo(409); } + + + } + + @Test + public void testDeleteWatermark() { + + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + Watermark watermark = new Watermark(); + watermark.setName("watermark name"); + watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje."); + watermark.setFontSize(12); + watermark.setFontType("font"); + watermark.setHexColor("#dddddd"); + watermark.setOpacity(20); + watermark.setOrientation(WatermarkOrientation.DIAGONAL); + watermark.setDossierTemplateId(dossierTemplate.getId()); + + var saved = watermarkClient.createOrUpdateWatermark(watermark); + var loadedWatermark = watermarkClient.getWatermark(saved.getId()); + assertThat(loadedWatermark).isEqualTo(saved); + // Delete first time watermarkClient.deleteWatermark(saved.getId()); @@ -75,8 +120,52 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { assertThat(e.status()).isEqualTo(404); } + // try to delete a not existing watermark + try { + watermarkClient.deleteWatermark(saved.getId()); + } catch (FeignException e) { + assertThat(e.status()).isEqualTo(404); + } + + } + @Test + public void testCreateWatermark() { + + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + Watermark watermark = new Watermark(); + watermark.setName("watermark name"); + watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje."); + watermark.setFontSize(12); + watermark.setFontType("font"); + watermark.setHexColor("#dddddd"); + watermark.setOpacity(20); + watermark.setOrientation(WatermarkOrientation.DIAGONAL); + watermark.setDossierTemplateId(dossierTemplate.getId()); + + var saved = watermarkClient.createOrUpdateWatermark(watermark); + var loadedWatermark = watermarkClient.getWatermark(saved.getId()); + assertThat(loadedWatermark).isEqualTo(saved); + + // try to save the same watermark + try { + watermarkClient.createOrUpdateWatermark(watermark); + } catch (FeignException e) { + assertThat(e.status()).isEqualTo(409); + } + + Watermark watermark2 = new Watermark(); + watermark.setName("watermark name2"); + watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje."); + watermark.setFontSize(12); + watermark.setOrientation(WatermarkOrientation.DIAGONAL); + watermark.setDossierTemplateId(dossierTemplate.getId()); + + var saved2 = watermarkClient.createOrUpdateWatermark(watermark); + var loadedWatermark2 = watermarkClient.getWatermark(saved.getId()); + } @Test public void testWatermarkTextWithWrongText() { From 9c62db8839cfecaa21883ed66c0b849710235095 Mon Sep 17 00:00:00 2001 From: deiflaender Date: Tue, 28 Jun 2022 09:15:59 +0200 Subject: [PATCH 4/8] RED-4264: Fixed declining remove redactions --- .../server/service/ManualRedactionService.java | 4 ++-- .../integration/tests/ManualRedactionTest.java | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java index 8ddf93bcd..120fb2931 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java @@ -402,7 +402,7 @@ public class ManualRedactionService { var dossier = dossierPersistenceService.getAndValidateDossier(dossierId); var actionPerformed = false; - var redactionLog = fileManagementStorageService.getRedactionLog(dossier.getId(), fileId); + RedactionLog redactionLog = redactionLogService.getRedactionLog(dossierId, fileId, true, true); for (var annotationId : annotationIds) { @@ -540,7 +540,7 @@ public class ManualRedactionService { AnnotationStatus annotationStatus) { var dossier = dossierPersistenceService.getAndValidateDossier(dossierId); - RedactionLog redactionLog = fileManagementStorageService.getRedactionLog(dossierId, fileId); + RedactionLog redactionLog = redactionLogService.getRedactionLog(dossierId, fileId, true, true); for (var annotationId : annotationIds) { IdRemovalEntity idRemoval = removeRedactionPersistenceService.findRemoveRedaction(fileId, annotationId); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java index f2fb154a4..ebaf977ed 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java @@ -10,6 +10,7 @@ import com.iqser.red.service.peristence.v1.server.integration.service.FileTester import com.iqser.red.service.peristence.v1.server.integration.service.TypeProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; +import com.iqser.red.service.peristence.v1.server.service.RedactionLogService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.service.v1.api.model.annotations.*; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; @@ -24,6 +25,7 @@ import lombok.SneakyThrows; import org.junit.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; import java.nio.charset.StandardCharsets; import java.time.OffsetDateTime; @@ -68,6 +70,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Autowired private FileClient fileClient; + @Test @SneakyThrows public void testManualRedaction3641() { @@ -300,10 +303,12 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { .removeFromDictionary(false) .build())).get(0); - fileManagementStorageService.storeObject(dossier.getId(), file.getId(), FileType.REDACTION_LOG, objectMapper.writeValueAsBytes(new RedactionLog(1, 1, - List.of(RedactionLogEntry.builder().id(removeRedaction.getAnnotationId()).type("manual").value("value entry").build()), - null, 0, 0, 0, 0))); + var redactionLog = new RedactionLog(1, 1, + List.of(RedactionLogEntry.builder().id(addRedaction.getAnnotationId()).type("manual").value("value entry").build()), + null, 0, 0, 0, 0); + fileManagementStorageService.storeObject(dossier.getId(), file.getId(), FileType.REDACTION_LOG, objectMapper.writeValueAsBytes(redactionLog)); + when(redactionClient.getRedactionLog(Mockito.any())).thenReturn(redactionLog); manualRedactionClient.updateRemoveRedactionStatus(dossier.getId(), file.getId(), UpdateRedactionRequest.builder() .annotationIds(List.of(removeRedaction.getAnnotationId())) @@ -326,10 +331,12 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { loadedRemoveRedaction = manualRedactionClient.getRemoveRedaction(file.getId(), addRedaction.getAnnotationId()); assertThat(loadedRemoveRedaction.getStatus()).isEqualTo(AnnotationStatus.DECLINED); - fileManagementStorageService.storeObject(dossier.getId(), file.getId(), FileType.REDACTION_LOG, objectMapper.writeValueAsBytes(new RedactionLog(1, 1, + var redLog = new RedactionLog(1, 1, List.of(RedactionLogEntry.builder().id("annotationId").type("manual").value("value entry").build()), - null, 0, 0, 0, 0))); + null, 0, 0, 0, 0); + fileManagementStorageService.storeObject(dossier.getId(), file.getId(), FileType.REDACTION_LOG, objectMapper.writeValueAsBytes(redLog)); + when(redactionClient.getRedactionLog(Mockito.any())).thenReturn(redLog); var removeRedaction2 = manualRedactionClient.addRemoveRedaction(dossier.getId(), file.getId(), List.of(RemoveRedactionRequest.builder() .annotationId("annotationId") .comment("comment") From ae1e74768054e372287a0961a443c6e249d2aa61 Mon Sep 17 00:00:00 2001 From: aoezyetimoglu Date: Tue, 28 Jun 2022 21:01:08 +0200 Subject: [PATCH 5/8] RED-4406: 500 when changing status of excluded file --- .../peristence/v1/server/service/RedactionLogService.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/RedactionLogService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/RedactionLogService.java index b0a02cf3f..998785451 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/RedactionLogService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/RedactionLogService.java @@ -40,9 +40,6 @@ public class RedactionLogService { var fileStatus = fileStatusService.getStatus(fileId); - if (fileStatus.isExcluded()) { - throw new NotFoundException("Excluded files have no redactionLog"); - } RedactionLog redactionLog; if (withManualRedactions) { From d48d76284b41429fe30cb9ced301c9b7df6d9443 Mon Sep 17 00:00:00 2001 From: aoezyetimoglu Date: Wed, 29 Jun 2022 09:35:58 +0200 Subject: [PATCH 6/8] RED-4245: File re-upload with keep manual redactions deletes file status properties that should be kept --- .../service/persistence/FileStatusPersistenceService.java | 2 +- .../service/persistence/repository/FileRepository.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 bddba18b5..567302aaf 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 @@ -317,9 +317,9 @@ public class FileStatusPersistenceService { countUpdate = fileRepository.overwriteFile(fileId, filename, uploader, ProcessingStatus.UNPROCESSED, WorkflowStatus.NEW, OffsetDateTime.now() .truncatedTo(ChronoUnit.MILLIS), OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); + deleteFileAttributes(fileId); } - deleteFileAttributes(fileId); if (countUpdate == 0) { throw new NotFoundException("Unknown file=" + fileId); 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 63612b524..aa16546a4 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 @@ -122,7 +122,7 @@ public interface FileRepository extends JpaRepository { @Modifying(clearAutomatically = true) - @Query("update FileEntity f set f.filename = :filename, f.uploader = :uploader, f.processingStatus = :processingStatus, " + "f.lastUploaded = :lastUploaded, f.lastUpdated = :lastUpdated, f.fileManipulationDate = :lastUploaded, " + "f.lastOCRTime = null, f.lastProcessed = null, f.lastReviewer = null, f.lastApprover = null, " + "f.approvalDate = null, f.numberOfAnalyses = 0, f.lastManualChangeDate = null, f.redactionModificationDate = null, " + "f.dictionaryVersion = 0, f.dossierDictionaryVersion = 0, f.rulesVersion = 0, f.hasImages = false, " + "f.hasHints = false, f.hasRedactions = false, f.hasSuggestions = false, f.hasUpdates = false, " + "f.deleted = null, f.hardDeletedTime = null, f.hasHighlights = false, f.processingErrorCounter = 0 where f.id = :fileId") + @Query("update FileEntity f set f.filename = :filename, f.uploader = :uploader, f.processingStatus = :processingStatus, " + "f.lastUploaded = :lastUploaded, f.lastUpdated = :lastUpdated, f.fileManipulationDate = :lastUploaded, " + "f.lastProcessed = null," + "f.approvalDate = null, f.numberOfAnalyses = 0, f.lastManualChangeDate = null, f.redactionModificationDate = null, " + "f.dictionaryVersion = 0, f.dossierDictionaryVersion = 0, f.rulesVersion = 0, f.hasImages = false, " + "f.hasHints = false, f.hasRedactions = false, f.hasSuggestions = false, f.hasUpdates = false, " + "f.deleted = null, f.hardDeletedTime = null, f.hasHighlights = false, f.processingErrorCounter = 0 where f.id = :fileId") int overwriteFileAndKeepManualRedactions(String fileId, String filename, String uploader, ProcessingStatus processingStatus, OffsetDateTime lastUploaded, OffsetDateTime lastUpdated); From 5c1b732b7dc28c92109ed35350028e32fdbbf202 Mon Sep 17 00:00:00 2001 From: devplant Date: Wed, 29 Jun 2022 16:03:06 +0300 Subject: [PATCH 7/8] RED-4424-"lastReviewer" is always equal to "assignee" in the file status - setStatus before setAssignee. Set lastReviewer, lastApprover with the last assignee and not the current assignee - update tests --- .../controller/FileStatusController.java | 4 +- .../v1/server/service/FileStatusService.java | 4 +- .../v1/server/integration/tests/FileTest.java | 47 +++++++++++++++++++ 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusController.java index 4511114e8..d5e6cd62b 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusController.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusController.java @@ -91,9 +91,9 @@ public class FileStatusController implements StatusResource { String assignee = fileStatus.getAssignee(); if (userId != null) { assignee = userId; - fileStatusService.setAssignee(fileId, assignee); } fileStatusService.setStatusSuccessful(fileId, assignee != null ? WorkflowStatus.UNDER_REVIEW : WorkflowStatus.NEW); + fileStatusService.setAssignee(fileId, assignee); analysisFlagsCalculationService.calculateFlags(dossierId, fileId); indexingService.addToIndexingQueue(IndexMessageType.UPDATE, null, dossierId, fileId, 2); } @@ -108,8 +108,8 @@ public class FileStatusController implements StatusResource { assignee = approverId; } + fileStatusService.setStatusSuccessful(fileId, assignee != null ? WorkflowStatus.UNDER_APPROVAL : WorkflowStatus.NEW); fileStatusService.setAssignee(fileId, approverId); - fileStatusService.setStatusSuccessful(fileId, assignee != null ? WorkflowStatus.UNDER_APPROVAL : WorkflowStatus.NEW); analysisFlagsCalculationService.calculateFlags(dossierId, fileId); indexingService.addToIndexingQueue(IndexMessageType.UPDATE, null, dossierId, fileId, 2); } 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 3100fc189..43e868e20 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 @@ -384,10 +384,10 @@ public class FileStatusService { String lastReviewer = fileStatus.getLastReviewer(); String lastApprover = fileStatus.getLastApprover(); if (WorkflowStatus.UNDER_REVIEW.equals(fileStatus.getWorkflowStatus())) { - lastReviewer = StringUtils.isNotEmpty(assignee) ? assignee : fileStatus.getAssignee(); + lastReviewer = StringUtils.isNotEmpty(assignee) ? fileStatus.getAssignee() : lastReviewer; } if (WorkflowStatus.UNDER_APPROVAL.equals(fileStatus.getWorkflowStatus())) { - lastApprover = StringUtils.isNotEmpty(assignee) ? assignee : fileStatus.getAssignee(); + lastApprover = StringUtils.isNotEmpty(assignee) ? fileStatus.getAssignee() : lastApprover; } fileStatusPersistenceService.setAssignee(fileId, assignee, lastReviewer, lastApprover); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java index 96fde2939..34dfbd6eb 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java @@ -491,4 +491,51 @@ public class FileTest extends AbstractPersistenceServerServiceTest { } + @Test + public void testFile4424() { + + var start = OffsetDateTime.now(); + var dossier = dossierTesterAndProvider.provideTestDossier(); + var file = fileTesterAndProvider.testAndProvideFile(dossier); + + // update dossier - add new member + CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest(); + BeanUtils.copyProperties(dossier, cru); + cru.getMemberIds().add("2"); + + var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); + assertThat(loadedFile.getAssignee()).isNull(); + assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.NEW); + assertThat(loadedFile.getLastReviewer()).isNull(); + assertThat(loadedFile.getLastApprover()).isNull(); + + fileClient.setStatusUnderReview(dossier.getId(), file.getId(), "1"); + loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); + assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW); + assertThat(loadedFile.getAssignee()).isEqualTo("1"); + assertThat(loadedFile.getLastReviewer()).isNull(); + assertThat(loadedFile.getLastApprover()).isNull(); + + fileClient.setCurrentFileAssignee(dossier.getId(), file.getId(), "2"); + loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); + assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW); + assertThat(loadedFile.getAssignee()).isEqualTo("2"); + assertThat(loadedFile.getLastReviewer()).isEqualTo("1"); + assertThat(loadedFile.getLastApprover()).isNull(); + + fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "2"); + loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); + assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL); + assertThat(loadedFile.getAssignee()).isEqualTo("2"); + assertThat(loadedFile.getLastReviewer()).isEqualTo("2"); + assertThat(loadedFile.getLastApprover()).isNull(); + + fileClient.setCurrentFileAssignee(dossier.getId(), file.getId(), "1"); + loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); + assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL); + assertThat(loadedFile.getAssignee()).isEqualTo("1"); + assertThat(loadedFile.getLastReviewer()).isEqualTo("2"); + assertThat(loadedFile.getLastApprover()).isEqualTo("2"); + + } } From 91d37f5c6043eb973584948f4e002cad6d03d6ae Mon Sep 17 00:00:00 2001 From: devplant Date: Wed, 29 Jun 2022 20:52:56 +0300 Subject: [PATCH 8/8] RED-4249-When I edit or create a dossier as an owner I want to select from multiple watermark configurations - add endpoint to check if watermark configuration is in use - added 3 new columns: createdBy, dateAdded, dateModified - update tests --- .../configuration/Watermark.java | 5 +++ .../v1/api/resources/WatermarkResource.java | 6 ++++ .../entity/configuration/WatermarkEntity.java | 8 ++++- .../processor/service/WatermarkService.java | 17 ++++++++-- .../repository/DossierRepository.java | 3 ++ .../controller/WatermarkController.java | 11 ++++--- .../sql/31-watermark-configuration.sql | 2 +- .../server/integration/tests/DossierTest.java | 15 ++++++++- .../integration/tests/WatermarkTest.java | 32 +++++++++++++++++++ 9 files changed, 89 insertions(+), 10 deletions(-) diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/Watermark.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/Watermark.java index 01d81b745..f9ee43d0f 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/Watermark.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/Watermark.java @@ -6,6 +6,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.time.OffsetDateTime; + @Data @Builder @NoArgsConstructor @@ -21,6 +23,9 @@ public class Watermark { private int opacity; private int fontSize; private String fontType; + private String createdBy; + private OffsetDateTime dateAdded; + private OffsetDateTime dateModified; private WatermarkOrientation orientation; } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/WatermarkResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/WatermarkResource.java index a1984a09b..19f78b844 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/WatermarkResource.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/WatermarkResource.java @@ -1,5 +1,6 @@ package com.iqser.red.service.persistence.service.v1.api.resources; +import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -11,6 +12,7 @@ import java.util.List; public interface WatermarkResource { String WATERMARK_PATH = "/watermark"; + String CHECK_USED_REST_PATH = "/used"; String WATERMARK_ID_PARAMETER_NAME = "watermarkId"; String WATERMARK_ID_PATH_VARIABLE = "/{" + WATERMARK_ID_PARAMETER_NAME + "}"; @@ -30,4 +32,8 @@ public interface WatermarkResource { @DeleteMapping(value = WATERMARK_PATH + WATERMARK_ID_PATH_VARIABLE) void deleteWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) long watermarkId); + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = WATERMARK_PATH + CHECK_USED_REST_PATH , produces = MediaType.APPLICATION_JSON_VALUE) + JSONPrimitive isWatermarkUsed(@RequestParam(WATERMARK_ID_PARAMETER_NAME) long watermarkId); + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java index c956e8b8e..c8f842f30 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java @@ -12,6 +12,7 @@ import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; import javax.persistence.*; +import java.time.OffsetDateTime; @Data @Builder @@ -40,7 +41,12 @@ public class WatermarkEntity { private int fontSize; @Column private String fontType; - + @Column + private String createdBy; + @Column + private OffsetDateTime dateAdded; + @Column + private OffsetDateTime dateModified; @Column @Enumerated(EnumType.STRING) private WatermarkOrientation orientation; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java index 2ba8e32b5..b049c3c98 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java @@ -15,6 +15,8 @@ import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.transaction.Transactional; +import java.time.OffsetDateTime; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Optional; @@ -56,7 +58,8 @@ public class WatermarkService { if (loadedWatermark.isPresent()) { validateDossierTemplateId(watermark.getDossierTemplateId(), loadedWatermark.get().getDossierTemplateId()); validateWatermarkNameIsUnique(watermark.getName(), loadedWatermark.get().getDossierTemplateId(), loadedWatermark.get().getId()); - BeanUtils.copyProperties(watermark, loadedWatermark.get(), "dossierTemplateId"); + BeanUtils.copyProperties(watermark, loadedWatermark.get(), "dossierTemplateId", "createdBy", "dateAdded", "dateModified"); + loadedWatermark.get().setDateModified(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(loadedWatermark.get().getDossierTemplateId()); loadedWatermark.get().setDossierTemplate(dossierTemplate); return loadedWatermark.get(); @@ -64,7 +67,8 @@ public class WatermarkService { validateDossierTemplateId(watermark.getDossierTemplateId(), null); validateWatermarkNameIsUnique(watermark.getName(), watermark.getDossierTemplateId(), 0); WatermarkEntity watermarkEntity = new WatermarkEntity(); - BeanUtils.copyProperties(watermark, watermarkEntity, "id"); + BeanUtils.copyProperties(watermark, watermarkEntity, "id", "dateAdded", "dateModified"); + watermarkEntity.setDateAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId()); watermarkEntity.setDossierTemplate(dossierTemplate); return watermarkRepository.save(watermarkEntity); @@ -73,7 +77,8 @@ public class WatermarkService { validateDossierTemplateId(watermark.getDossierTemplateId(), null); validateWatermarkNameIsUnique(watermark.getName(), watermark.getDossierTemplateId(), 0); WatermarkEntity watermarkEntity = new WatermarkEntity(); - BeanUtils.copyProperties(watermark, watermarkEntity, "id"); + BeanUtils.copyProperties(watermark, watermarkEntity, "id", "dateAdded", "dateModified"); + watermarkEntity.setDateAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId()); watermarkEntity.setDossierTemplate(dossierTemplate); return watermarkRepository.save(watermarkEntity); @@ -112,4 +117,10 @@ public class WatermarkService { return watermarkRepository.findByDossierTemplateId(dossierTemplateId); } + public boolean isWatermarkUsed(long watermarkId) { + watermarkRepository.findById(watermarkId); //check if watermark exists + int count = dossierRepository.countDossiersWithWatermarkInUse(watermarkId); + return count != 0; + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java index a523e65eb..68653d493 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java @@ -66,4 +66,7 @@ public interface DossierRepository extends JpaRepository @Modifying @Query("update DossierEntity d set d.previewWatermarkId = null where d.previewWatermarkId = :previewWatermarkId") int countDeletePreviewWatermark(long previewWatermarkId); + + @Query("select count(d) from DossierEntity d where d.watermarkId = :watermarkId or d.previewWatermarkId = :watermarkId") + int countDossiersWithWatermarkInUse(long watermarkId); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/WatermarkController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/WatermarkController.java index 7e229cca6..10077e376 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/WatermarkController.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/WatermarkController.java @@ -1,13 +1,12 @@ package com.iqser.red.service.peristence.v1.server.controller; import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; +import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; import com.iqser.red.service.persistence.service.v1.api.resources.WatermarkResource; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -38,4 +37,8 @@ public class WatermarkController implements WatermarkResource { watermarkService.deleteWatermark(watermarkId); } + public JSONPrimitive isWatermarkUsed(@RequestParam(WATERMARK_ID_PARAMETER_NAME) long watermarkId) { + return JSONPrimitive.of(watermarkService.isWatermarkUsed(watermarkId)); + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/sql/31-watermark-configuration.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/sql/31-watermark-configuration.sql index 246eaedad..f9abeee8c 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/sql/31-watermark-configuration.sql +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/sql/31-watermark-configuration.sql @@ -1,6 +1,6 @@ -- add the generated id to watermark_configuration table alter table watermark_configuration add column id BIGINT GENERATED ALWAYS AS IDENTITY; -alter table watermark_configuration add column name VARCHAR (255), add column enabled BOOLEAN DEFAULT TRUE; +alter table watermark_configuration add column name VARCHAR (255), add column enabled BOOLEAN DEFAULT TRUE, add column created_by VARCHAR (255), add column date_added TIMESTAMP WITHOUT TIME ZONE, add column date_modified TIMESTAMP WITHOUT TIME ZONE; --initialise the new columns for the current watermark configurations update watermark_configuration set name = 'Watermark ' || id, enabled = true; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java index 6a5ea5a00..c94708e28 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java @@ -66,6 +66,10 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { var watermarkConfig = watermarkClient.createOrUpdateWatermark(watermark); + watermark.setEnabled(false); + watermark.setName("watermark disabled"); + var watermarkConfigDisabled = watermarkClient.createOrUpdateWatermark(watermark); + var allDossiers = dossierClient.getAllDossiers(false, false); assertThat(allDossiers.size()).isEqualTo(1); assertThat(allDossiers.get(0)).isEqualTo(dossier); @@ -79,7 +83,7 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { cru.setWatermarkId(watermarkConfig.getId()); BeanUtils.copyProperties(dossier, cru); cru.setDossierName("Dossier 1 Update"); - cru.setPreviewWatermarkId(watermarkConfig.getId()); + cru.setPreviewWatermarkId(watermarkConfigDisabled.getId()); // Create dossier status CreateOrUpdateDossierStatusRequest crudsr = new CreateOrUpdateDossierStatusRequest(); crudsr.setName("name1"); @@ -91,11 +95,20 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { cru.setDossierStatusId(loadedDossierStatus.getId()); + try { + dossierClient.updateDossier(cru, dossier.getId()); + } catch (FeignException e) { + assertThat(e.status()).isEqualTo(400); + } + + cru.setPreviewWatermarkId(watermarkConfig.getId()); var updated = dossierClient.updateDossier(cru, dossier.getId()); assertThat(updated.getDossierName()).isEqualTo("Dossier 1 Update"); assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId()); assertThat(updated.getDossierStatusId()).isEqualTo(loadedDossierStatus.getId()); + assertThat(watermarkClient.isWatermarkUsed(watermarkConfig.getId())).isEqualTo(JSONPrimitive.of(true)); + // put dossier status to null cru.setDossierStatusId(null); updated = dossierClient.updateDossier(cru, dossier.getId()); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/WatermarkTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/WatermarkTest.java index d625987d7..c3e660598 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/WatermarkTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/WatermarkTest.java @@ -3,7 +3,12 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertThrows; +import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; +import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; +import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; import org.junit.Test; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.WatermarkClient; @@ -19,9 +24,15 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { @Autowired private DossierTemplateTesterAndProvider dossierTemplateTesterAndProvider; + @Autowired + private DossierTesterAndProvider dossierTesterAndProvider; + @Autowired private WatermarkClient watermarkClient; + @Autowired + private DossierClient dossierClient; + @Test public void testWatermark() { @@ -42,10 +53,12 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { watermark.setOpacity(20); watermark.setOrientation(WatermarkOrientation.DIAGONAL); watermark.setDossierTemplateId(dossierTemplate.getId()); + watermark.setCreatedBy("user"); var saved = watermarkClient.createOrUpdateWatermark(watermark); var loadedWatermark = watermarkClient.getWatermark(saved.getId()); assertThat(loadedWatermark).isEqualTo(saved); + assertThat(saved.getDateAdded()).isNotNull(); // try to save the same watermark without id try { watermarkClient.createOrUpdateWatermark(watermark); @@ -62,9 +75,27 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { // update current watermark saved.setFontSize(14); + saved.setEnabled(true); saved.setDossierTemplateId(null); var updated = watermarkClient.createOrUpdateWatermark(saved); assertThat(updated.getDossierTemplateId()).isEqualTo(dossierTemplate.getId()); + assertThat(updated.getDateModified()).isNotNull(); + assertThat(updated.isEnabled()).isTrue(); + + assertThat(watermarkClient.isWatermarkUsed(updated.getId())).isEqualTo(JSONPrimitive.of(false)); + + var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); + + // update dossier with watermark config + CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest(); + + BeanUtils.copyProperties(dossier, cru); + cru.setWatermarkId(updated.getId()); + + var updatedDossier = dossierClient.updateDossier(cru, dossier.getId()); + assertThat(updatedDossier.getWatermarkId()).isEqualTo(updated.getId()); + + assertThat(watermarkClient.isWatermarkUsed(updated.getId())).isEqualTo(JSONPrimitive.of(true)); // update current watermark with new dossier template id updated.setDossierTemplateId("dossierTemplate2"); @@ -90,6 +121,7 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { } + } @Test