diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadWithOptionRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadWithOptionRequest.java index ab2f4edb1..e69a365f3 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadWithOptionRequest.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadWithOptionRequest.java @@ -1,13 +1,18 @@ package com.iqser.red.service.persistence.service.v1.api.model.download; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; -import lombok.*; - import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + @Data @Builder @AllArgsConstructor @@ -26,4 +31,6 @@ public class DownloadWithOptionRequest { @Builder.Default private Set downloadFileTypes = new HashSet<>(); + private String redactionPreviewColor; + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java index 1878c78da..1966cf8b7 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java @@ -17,12 +17,12 @@ import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.Table; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; 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.entity.dossier.ReportTemplateEntity; import com.iqser.red.service.persistence.management.v1.processor.utils.JSONDownloadFileTypeConverter; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue; @@ -77,4 +77,6 @@ public class DownloadStatusEntity { @Fetch(FetchMode.SUBSELECT) List reports = new ArrayList<>(); + String redactionPreviewColor; + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java index 5bc544a58..2dc4fce91 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java @@ -9,7 +9,6 @@ import java.util.Set; import javax.transaction.Transactional; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; @@ -17,6 +16,7 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.download import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DownloadStatusRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue; @@ -38,7 +38,8 @@ public class DownloadStatusPersistenceService { String mimeType, List fileIds, Set downloadFileTypes, - List reportTemplateIds) { + List reportTemplateIds, + String redactionPreviewColor) { DownloadStatusEntity downloadStatus = new DownloadStatusEntity(); downloadStatus.setUserId(userId); @@ -50,6 +51,7 @@ public class DownloadStatusPersistenceService { downloadStatus.setFiles(fileIds != null ? fileRepository.findAllById(fileIds) : new ArrayList<>()); downloadStatus.setDownloadFileTypes(downloadFileTypes != null ? new HashSet<>(downloadFileTypes) : new HashSet<>()); downloadStatus.setReports(reportTemplateIds != null ? reportTemplateRepository.findAllById(reportTemplateIds) : new ArrayList<>()); + downloadStatus.setRedactionPreviewColor(redactionPreviewColor); downloadStatusRepository.save(downloadStatus); } @@ -58,7 +60,7 @@ public class DownloadStatusPersistenceService { // use this to create a status for export dossier template. public void createStatus(String userId, String storageId, String filename, String mimeType) { - this.createStatus(userId, storageId, null, filename, mimeType, null, null, null); + this.createStatus(userId, storageId, null, filename, mimeType, null, null, null, null); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DownloadController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DownloadController.java index 0be2ff715..63ac2aeec 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DownloadController.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DownloadController.java @@ -6,10 +6,6 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadWithOptionRequest; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -20,16 +16,20 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; import com.iqser.red.service.peristence.v1.server.model.DownloadJob; import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils; +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.entity.dossier.ReportTemplateEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository; 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.WorkflowStatus; import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadRequest; import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatus; +import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadWithOptionRequest; import com.iqser.red.service.persistence.service.v1.api.resources.DownloadResource; import lombok.RequiredArgsConstructor; @@ -69,7 +69,9 @@ public class DownloadController implements DownloadResource { return this.startPrepareDownload(requestWithOptions, dossier, existingFileStatuses); } + public JSONPrimitive prepareDownload(@RequestBody DownloadWithOptionRequest request) { + var existingFileStatuses = fileStatusPersistenceService.getStatusesForDossier(request.getDossierId()); var dossier = dossierPersistenceService.getActiveOrArchivedDossier(request.getDossierId()); // check reports list and download types so both can be valid @@ -85,19 +87,29 @@ public class DownloadController implements DownloadResource { return this.startPrepareDownload(request, dossier, existingFileStatuses); } + private JSONPrimitive startPrepareDownload(DownloadWithOptionRequest request, DossierEntity dossier, List existingFileStatuses) { - var mimeType = "application/zip"; + var downloadArchiveMimeType = "application/zip"; - String downloadFilename = buildName(request.getDossierId(), request.getFileIds(), request.getUserId(), mimeType, existingFileStatuses); + String downloadFilename = buildName(request.getDossierId(), request.getFileIds(), request.getUserId(), downloadArchiveMimeType, existingFileStatuses); String storageId = StorageIdUtils.getStorageId(request.getUserId(), request.getDossierId(), downloadFilename); - downloadStatusPersistenceService.createStatus(request.getUserId(), storageId, dossier, downloadFilename, mimeType, request.getFileIds(), request.getDownloadFileTypes(), request.getReportTemplateIds()); + downloadStatusPersistenceService.createStatus(request.getUserId(), + storageId, + dossier, + downloadFilename, + downloadArchiveMimeType, + request.getFileIds(), + request.getDownloadFileTypes(), + request.getReportTemplateIds(), + request.getRedactionPreviewColor()); addToDownloadQueue(DownloadJob.builder().storageId(storageId).userId(request.getUserId()).build(), 1); return new JSONPrimitive<>(storageId); } + public List getDownloadStatus(@PathVariable(USER_ID) String userId) { return convert(downloadStatusPersistenceService.getStatusesByUser(userId), DownloadStatus.class); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java index 878e0620f..c66cd58c7 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java @@ -28,6 +28,7 @@ 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.entity.dossier.ReportTemplateEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; @@ -61,8 +62,8 @@ public class DownloadPreparationService { RabbitTemplate rabbitTemplate; ObjectMapper objectMapper; StorageService storageService; - DownloadReportCleanupService downloadReportCleanupService; + ColorsService colorsService; FileManagementServiceSettings settings; @@ -73,6 +74,16 @@ public class DownloadPreparationService { DossierEntity dossier = downloadStatus.getDossier(); + String storedPreviewColor = downloadStatus.getRedactionPreviewColor(); + + final String previewColor; + if (storedPreviewColor == null || storedPreviewColor.isBlank()) { + var colors = colorsService.getColors(dossier.getDossierTemplateId()); + previewColor = colors.getPreviewColor(); + } else { + previewColor = storedPreviewColor; + } + RedactionMessage message = RedactionMessage.builder() .dossierId(dossier.getId()) .downloadId(reportResultMessage.getDownloadId()) @@ -83,6 +94,7 @@ public class DownloadPreparationService { .filter(f -> !WorkflowStatus.APPROVED.equals(f.getWorkflowStatus())) .map(FileEntity::getId) .collect(Collectors.toSet())) + .redactionPreviewColor(previewColor) .build(); log.info("Sending redaction request for downloadId:{} to pdftron-redaction-queue", message.getDownloadId()); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml index 0c3784afd..da7e7150d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml @@ -107,3 +107,5 @@ databaseChangeLog: file: db/changelog/tenant/sql/42-add-encoding-column-file-attribute-config.sql - include: file: db/changelog/tenant/43-add-reports-information-column.changelog.yaml + - include: + file: db/changelog/tenant/44-add-redaction-preview-color-column.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/44-add-redaction-preview-color-column.changelog.yaml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/44-add-redaction-preview-color-column.changelog.yaml new file mode 100644 index 000000000..7d65427cc --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/44-add-redaction-preview-color-column.changelog.yaml @@ -0,0 +1,13 @@ +databaseChangeLog: + - changeSet: + id: add-redaction-preview-color-column + author: viktorseifert + changes: + - addColumn: + columns: + - column: + name: redaction_preview_color + type: CHAR(7) + constraints: + nullable: true + tableName: download_status diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java index a1ab54613..6862aa45f 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java @@ -19,10 +19,11 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTes 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.peristence.v1.server.service.download.DownloadReportMessageReceiver; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadRequest; +import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadWithOptionRequest; import com.iqser.red.service.redaction.report.v1.api.model.ReportResultMessage; import com.iqser.red.service.redaction.report.v1.api.model.StoredFileInformation; import com.iqser.red.storage.commons.service.StorageService; @@ -94,25 +95,34 @@ public class DownloadPreparationTest extends AbstractPersistenceServerServiceTes .watermarkId(dossier.getWatermarkId()) .dueDate(dossier.getDueDate()) .dossierTemplateId(dossier.getDossierTemplateId()) - .reportTemplateIds(availableTemplates.stream().map(a -> a.getTemplateId()).collect(Collectors.toList())) + .reportTemplateIds(availableTemplates.stream().map(ReportTemplate::getTemplateId).collect(Collectors.toList())) .build(), dossier.getId()); var updatedDossier = dossierClient.getDossierById(dossier.getId(), false, false); assertThat(updatedDossier.getReportTemplateIds()).isNotEmpty(); - downloadClient.prepareDownload(DownloadRequest.builder().userId("1").dossierId(dossier.getId()).fileIds(Collections.singletonList(file.getId())).build()); + downloadClient.prepareDownload(DownloadWithOptionRequest.builder() + .userId("1") + .dossierId(dossier.getId()) + .fileIds(Collections.singletonList(file.getId())) + .redactionPreviewColor("#aaaaaa") + .build()); var statuses = downloadClient.getDownloadStatus("1"); assertThat(statuses).isNotEmpty(); assertThat(statuses.iterator().next().getLastDownload()).isNull(); - ArrayList sivList = new ArrayList<>(); + // FIXME Check if this is still needed. + // This variable seems to do nothing, if it is not needed it can be removed. + var sivList = new ArrayList(); var siv = new StoredFileInformation(); siv.setFileId(file.getId()); siv.setStorageId("XYZ"); siv.setTemplateId(availableTemplates.iterator().next().getTemplateId()); sivList.add(siv); + + // FIXME Check if this is still needed. storageService.storeObject("XYZ", new ByteArrayInputStream(new byte[]{1, 2, 3, 4})); ReportResultMessage reportResultMessage = new ReportResultMessage(); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java index bf95361c0..7fef5b600 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java @@ -35,10 +35,7 @@ import org.springframework.jdbc.core.StatementCallback; import org.springframework.jdbc.datasource.SingleConnectionDataSource; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; -import org.testcontainers.shaded.org.apache.commons.io.IOUtils; -import com.iqser.red.service.pdftron.redaction.v1.api.model.ByteContentDocument; -import com.iqser.red.service.pdftron.redaction.v1.api.model.DocumentRequest; import com.iqser.red.service.peristence.v1.server.Application; import com.iqser.red.service.peristence.v1.server.client.RedactionClient; import com.iqser.red.service.peristence.v1.server.client.SearchClient; @@ -46,7 +43,6 @@ import com.iqser.red.service.peristence.v1.server.integration.client.Application import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; import com.iqser.red.service.peristence.v1.server.integration.client.TenantsClient; import com.iqser.red.service.peristence.v1.server.utils.MetricsPrinterService; -import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils; import com.iqser.red.service.persistence.management.v1.processor.client.PDFTronRedactionClient; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ApplicationConfigRepository; @@ -82,7 +78,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.WatermarkRepository; import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.ApplicationConfig; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.TenantRequest; import com.iqser.red.service.redaction.v1.model.RedactionLog; import com.iqser.red.service.redaction.v1.model.RedactionResult; @@ -211,31 +206,6 @@ public abstract class AbstractPersistenceServerServiceTest { when(amqpAdmin.getQueueInfo(Mockito.any())).thenReturn(null); - when(pdfTronRedactionClient.redact(Mockito.any())).thenAnswer((answer) -> { - Object[] args = answer.getArguments(); - DocumentRequest d = (DocumentRequest) args[0]; - var untouchedObjectId = StorageIdUtils.getStorageId(d.getDossierId(), d.getFileId(), FileType.ORIGIN); - - return new ByteContentDocument(IOUtils.toByteArray(storageService.getObject(untouchedObjectId) - .getInputStream()), null); - }); - when(pdfTronRedactionClient.redactionPreview(Mockito.any())).thenAnswer((answer) -> { - Object[] args = answer.getArguments(); - DocumentRequest d = (DocumentRequest) args[0]; - var untouchedObjectId = StorageIdUtils.getStorageId(d.getDossierId(), d.getFileId(), FileType.ORIGIN); - - return new ByteContentDocument(IOUtils.toByteArray(storageService.getObject(untouchedObjectId) - .getInputStream()), null); - }); - when(pdfTronRedactionClient.redactionPreviewDiff(Mockito.any())).thenAnswer((answer) -> { - Object[] args = answer.getArguments(); - DocumentRequest d = (DocumentRequest) args[0]; - var untouchedObjectId = StorageIdUtils.getStorageId(d.getDossierId(), d.getFileId(), FileType.ORIGIN); - - return new ByteContentDocument(IOUtils.toByteArray(storageService.getObject(untouchedObjectId) - .getInputStream()), null); - }); - when(redactionClient.sections(Mockito.any())).thenReturn(new RedactionResult()); when(redactionClient.getRedactionLog(Mockito.any())).thenReturn(new RedactionLog(1, 1, Lists.newArrayList(), null, 0, 0, 0, 0)); } diff --git a/persistence-service-v1/pom.xml b/persistence-service-v1/pom.xml index 0dc376757..0e19dee95 100755 --- a/persistence-service-v1/pom.xml +++ b/persistence-service-v1/pom.xml @@ -27,7 +27,7 @@ 3.206.0 2.39.0 - 3.143.0 + 3.150.0 3.63.0