diff --git a/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/ReportRequestMessage.java b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/ReportRequestMessage.java index c5e4ad8..a926b3c 100644 --- a/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/ReportRequestMessage.java +++ b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/ReportRequestMessage.java @@ -24,6 +24,8 @@ public class ReportRequestMessage { private String dossierTemplateId; + private boolean includeUnprocessed; + @Builder.Default private List fileIds = new ArrayList<>(); diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/client/EntityLogClient.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/client/EntityLogClient.java new file mode 100644 index 0000000..9493a90 --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/client/EntityLogClient.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.redaction.report.v1.server.client; + +import org.springframework.cloud.openfeign.FeignClient; + +import com.iqser.red.service.persistence.service.v1.api.internal.resources.EntityLogResource; + +@FeignClient(name = "EntityLogResource", url = "${persistence-service.url}") +public interface EntityLogClient extends EntityLogResource { + +} diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/EntityLogConverterService.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/EntityLogConverterService.java index 7d5ff88..d737833 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/EntityLogConverterService.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/EntityLogConverterService.java @@ -25,6 +25,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.service.redaction.report.v1.server.client.DictionaryClient; import com.iqser.red.service.redaction.report.v1.server.client.DossierClient; +import com.iqser.red.service.redaction.report.v1.server.client.EntityLogClient; import com.iqser.red.service.redaction.report.v1.server.model.ReportRedactionEntry; import com.iqser.red.service.redaction.report.v1.server.storage.ReportStorageService; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; @@ -42,9 +43,11 @@ public class EntityLogConverterService { private final ReportStorageService reportStorageService; + private final EntityLogClient entityLogClient; + @Timed("redactmanager_getReportEntries") - public List getReportEntries(String dossierId, String fileId, boolean isExcluded) { + public List getReportEntries(String dossierId, String fileId, boolean isExcluded, boolean includeUnprocessed) { if (isExcluded) { return new ArrayList<>(); @@ -53,7 +56,11 @@ public class EntityLogConverterService { EntityLog entityLog; Map mapOfEntityDisplayName; try { - entityLog = reportStorageService.getEntityLog(dossierId, fileId, new ArrayList<>()); + if (includeUnprocessed) { + entityLog = entityLogClient.getEntityLog(dossierId, fileId, null, includeUnprocessed); + } else { + entityLog = reportStorageService.getEntityLog(dossierId, fileId, new ArrayList<>()); + } mapOfEntityDisplayName = fillMapOfTypeAndEntityDisplayName(dossierId); } catch (StorageObjectDoesNotExist e) { return new ArrayList<>(); diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportGenerationService.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportGenerationService.java index 1dd1d40..6f17c2b 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportGenerationService.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportGenerationService.java @@ -78,7 +78,7 @@ public class ReportGenerationService { var fileStatus = fileStatusClient.getFileStatus(dossierId, fileId); generatePlaceholderService.resolveFileAttributeValues(fileStatus, placeholderModel); - List reportEntries = entityLogConverterService.getReportEntries(dossierId, fileId, fileStatus.isExcluded()); + List reportEntries = entityLogConverterService.getReportEntries(dossierId, fileId, fileStatus.isExcluded(), reportMessage.isIncludeUnprocessed()); generateMultiFileExcelReports(reportTemplates.multiFileWorkbookReportTemplates, placeholderModel, fileStatus, isLastFile, dossierName, reportEntries); diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportV2IntegrationTest.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportV2IntegrationTest.java index 760d2b5..9304d04 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportV2IntegrationTest.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportV2IntegrationTest.java @@ -1,12 +1,17 @@ package com.iqser.red.service.redaction.report.v1.server; import static com.iqser.red.service.redaction.report.v1.server.utils.OsUtils.getTemporaryDirectory; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; import java.io.FileOutputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Base64; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -16,6 +21,7 @@ import java.util.stream.IntStream; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -36,6 +42,10 @@ import com.amazonaws.services.s3.AmazonS3; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; @@ -51,6 +61,7 @@ import com.iqser.red.service.redaction.report.v1.server.client.DictionaryClient; import com.iqser.red.service.redaction.report.v1.server.client.DossierAttributesClient; import com.iqser.red.service.redaction.report.v1.server.client.DossierAttributesConfigClient; import com.iqser.red.service.redaction.report.v1.server.client.DossierClient; +import com.iqser.red.service.redaction.report.v1.server.client.EntityLogClient; import com.iqser.red.service.redaction.report.v1.server.client.FileAttributesConfigClient; import com.iqser.red.service.redaction.report.v1.server.client.FileStatusClient; import com.iqser.red.service.redaction.report.v1.server.client.ReportTemplateClient; @@ -106,6 +117,9 @@ public class RedactionReportV2IntegrationTest { @MockBean private DossierClient dossierClient; + @MockBean + private EntityLogClient entityLogClient; + @MockBean private FileStatusClient fileStatusClient; @@ -233,6 +247,7 @@ public class RedactionReportV2IntegrationTest { public void testBasicExcelReportFlow() { var reportRequestMessage = prepareFlow(2, "templates/Excel QC (incl. Skipped Redactions).xlsx"); + reportRequestMessage.setIncludeUnprocessed(false); processRequest(reportRequestMessage, ".xlsx"); MetricValidationUtils.validateMetric(prometheusMeterRegistry, "redactmanager_generateReports", 1, null); @@ -247,6 +262,7 @@ public class RedactionReportV2IntegrationTest { public void testMultifileWordReportFlow() { var reportRequestMessage = prepareFlow(2, "templates/Justification Appendix A1.docx"); + reportRequestMessage.setIncludeUnprocessed(false); processRequest(reportRequestMessage, ".docx"); MetricValidationUtils.validateMetric(prometheusMeterRegistry, "redactmanager_generateReports", 1, null); @@ -263,6 +279,7 @@ public class RedactionReportV2IntegrationTest { public void test2FilesConcurrently() { var reportRequestMessage = prepareFlow(1, "templates/report.xlsx", "templates/report-advanced.xlsx"); + reportRequestMessage.setIncludeUnprocessed(false); processRequest(reportRequestMessage, ".xlsx"); MetricValidationUtils.validateMetric(prometheusMeterRegistry, "redactmanager_generateReports", 1, null); @@ -271,6 +288,34 @@ public class RedactionReportV2IntegrationTest { MetricValidationUtils.validateMetric(prometheusMeterRegistry, "redactmanager_getReportEntries", 1, null); } + @Test + @SneakyThrows + public void testIncludeUnprocessed() { + + var reportRequestMessage = prepareFlow(2, "templates/Excel QC (incl. Skipped Redactions).xlsx"); + reportRequestMessage.setIncludeUnprocessed(true); + when(entityLogClient.getEntityLog(anyString(), anyString(), any(), eq(true))).thenReturn(new EntityLog( + 1, 1, List.of(EntityLogEntry.builder() + .state(EntryState.APPLIED) + .positions(List.of(new Position(1, 1, 1, 1, 1))) + .id("123") + .value("Value") + .entryType(EntryType.ENTITY) + .type("manual") + .startOffset(1) + .endOffset(10) + .color(new float[]{0, 0, 0}) + .section("section") + .build()), Collections.emptyList(), 1, 1, 1, 1) + ); + processRequest(reportRequestMessage, ".xlsx"); + + MetricValidationUtils.validateMetric(prometheusMeterRegistry, "redactmanager_generateReports", 1, null); + MetricValidationUtils.validateMetric(prometheusMeterRegistry, "redactmanager_generateExcelReport", 1, null); + MetricValidationUtils.validateMetric(prometheusMeterRegistry, "redactmanager_calculateExcelModel", 1, null); + MetricValidationUtils.validateMetric(prometheusMeterRegistry, "redactmanager_getReportEntries", 2, null); + } + private List createFileModels(int numOfFileModelsToCreate) {