Merge branch 'RED-7784' into 'master'

RED-7784 - Include unprocessed option for report generation

Closes RED-7784

See merge request redactmanager/redaction-report-service!26
This commit is contained in:
Andrei Isvoran 2023-11-06 15:45:17 +01:00
commit ffbe388278
5 changed files with 67 additions and 3 deletions

View File

@ -24,6 +24,8 @@ public class ReportRequestMessage {
private String dossierTemplateId;
private boolean includeUnprocessed;
@Builder.Default
private List<String> fileIds = new ArrayList<>();

View File

@ -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 {
}

View File

@ -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<ReportRedactionEntry> getReportEntries(String dossierId, String fileId, boolean isExcluded) {
public List<ReportRedactionEntry> getReportEntries(String dossierId, String fileId, boolean isExcluded, boolean includeUnprocessed) {
if (isExcluded) {
return new ArrayList<>();
@ -53,7 +56,11 @@ public class EntityLogConverterService {
EntityLog entityLog;
Map<String, String> 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<>();

View File

@ -78,7 +78,7 @@ public class ReportGenerationService {
var fileStatus = fileStatusClient.getFileStatus(dossierId, fileId);
generatePlaceholderService.resolveFileAttributeValues(fileStatus, placeholderModel);
List<ReportRedactionEntry> reportEntries = entityLogConverterService.getReportEntries(dossierId, fileId, fileStatus.isExcluded());
List<ReportRedactionEntry> reportEntries = entityLogConverterService.getReportEntries(dossierId, fileId, fileStatus.isExcluded(), reportMessage.isIncludeUnprocessed());
generateMultiFileExcelReports(reportTemplates.multiFileWorkbookReportTemplates, placeholderModel, fileStatus, isLastFile, dossierName, reportEntries);

View File

@ -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<FileModel> createFileModels(int numOfFileModelsToCreate) {