Merge branch 'master' of ssh://git.knecon.com:22222/redactmanager/persistence-service into RED-6855

This commit is contained in:
Corina Olariu 2023-06-16 11:12:35 +03:00
commit 106a27ab9a
11 changed files with 253 additions and 199 deletions

View File

@ -4,7 +4,6 @@ import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_LICENSE_REPO
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.iqser.red.keycloak.commons.KeycloakSecurity; import com.iqser.red.keycloak.commons.KeycloakSecurity;
@ -30,11 +29,9 @@ public class LicenseReportController implements LicenseReportResource {
@Override @Override
@PreAuthorize("hasAuthority('" + READ_LICENSE_REPORT + "')") @PreAuthorize("hasAuthority('" + READ_LICENSE_REPORT + "')")
public LicenseReport getReport(@RequestBody LicenseReportRequest reportRequest, public LicenseReport getReport(@RequestBody LicenseReportRequest reportRequest) {
@RequestParam(value = "offset", defaultValue = "0") int offset,
@RequestParam(value = "limit", defaultValue = "20") int limit) {
LicenseReport licenseReport = licenseReportService.getLicenseReport(reportRequest, offset, limit); LicenseReport licenseReport = licenseReportService.getLicenseReport(reportRequest);
auditPersistenceService.audit(AuditRequest.builder() auditPersistenceService.audit(AuditRequest.builder()
.userId(KeycloakSecurity.getUserId()) .userId(KeycloakSecurity.getUserId())
.objectId(LICENSE_AUDIT_KEY) .objectId(LICENSE_AUDIT_KEY)

View File

@ -4,7 +4,6 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
@ -25,8 +24,6 @@ public interface LicenseReportResource {
@PostMapping(value = LICENSE_REPORT_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = LICENSE_REPORT_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Creates and serves license report.", description = "None") @Operation(summary = "Creates and serves license report.", description = "None")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Successfully created and served a license report.")}) @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Successfully created and served a license report.")})
LicenseReport getReport(@RequestBody LicenseReportRequest reportRequest, LicenseReport getReport(@RequestBody LicenseReportRequest reportRequest);
@RequestParam(value = "offset", defaultValue = "0") int offset,
@RequestParam(value = "limit", defaultValue = "20") int limit);
} }

View File

@ -106,11 +106,10 @@ public class FileStatusService {
@Transactional @Transactional
public List<FileModel> getStatusesForDossiersAndTimePeriod(Set<String> dossierIds, OffsetDateTime start, OffsetDateTime end) { public List<FileModel> getStatusesAddedBefore(OffsetDateTime end) {
var fileEntities = fileStatusPersistenceService.getStatusesForDossiersAndTimePeriod(dossierIds, start, end); var fileEntities = fileStatusPersistenceService.getStatusesAddedBefore(end);
var convertedList = MagicConverter.convert(fileEntities, FileModel.class, new FileModelMapper()); return MagicConverter.convert(fileEntities, FileModel.class, new FileModelMapper());
return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convertedList);
} }

View File

@ -1,27 +1,24 @@
package com.iqser.red.service.persistence.management.v1.processor.service; package com.iqser.red.service.persistence.management.v1.processor.service;
import java.time.Duration;
import java.time.Instant;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.time.YearMonth;
import java.time.ZoneId; import java.time.ZoneId;
import java.util.HashSet; import java.util.ArrayList;
import java.util.LinkedList; import java.util.Comparator;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Map;
import java.util.UUID; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel;
import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReport; import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReport;
import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReportRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReportRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.license.ReportData; import com.iqser.red.service.persistence.service.v1.api.shared.model.license.MonthlyReportData;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -35,106 +32,133 @@ public class LicenseReportService {
private final DossierService dossierService; private final DossierService dossierService;
public LicenseReport getLicenseReport(LicenseReportRequest licenseReportRequest, int offset, int limit) { public LicenseReport getLicenseReport(LicenseReportRequest licenseReportRequest) {
log.info("Generating licence-report"); var files = fileStatusService.getStatusesAddedBefore(OffsetDateTime.ofInstant(licenseReportRequest.getEndDate(), UTC_ZONE_ID));
files.sort(Comparator.comparing(FileModel::getAdded));
Instant start = null; var addDossiers = dossierService.getAllDossiers();
if (log.isInfoEnabled()) { var dossiersById = addDossiers.stream().collect(Collectors.toMap(DossierEntity::getId, Function.identity()));
start = Instant.now();
Map<YearMonth, List<FileModel>> adds = new HashMap<>();
Map<YearMonth, List<FileModel>> softDeletes = new HashMap<>();
Map<YearMonth, List<FileModel>> archives = new HashMap<>();
Map<YearMonth, List<FileModel>> hardDeletes = new HashMap<>();
Map<YearMonth, List<FileModel>> ocrs = new HashMap<>();
for (var file : files) {
adds.computeIfAbsent(YearMonth.from(file.getAdded()), entry -> new ArrayList<>()).add(file);
if (file.getDeleted() != null) {
softDeletes.computeIfAbsent(YearMonth.from(file.getDeleted()), entry -> new ArrayList<>()).add(file);
}
if (file.getHardDeletedTime() != null) {
hardDeletes.computeIfAbsent(YearMonth.from(file.getHardDeletedTime()), entry -> new ArrayList<>()).add(file);
}
if (dossiersById.get(file.getDossierId()).getArchivedTime() != null) {
archives.computeIfAbsent(YearMonth.from(dossiersById.get(file.getDossierId()).getArchivedTime()), entry -> new ArrayList<>()).add(file);
}
if (file.getOcrStartTime() != null) {
ocrs.computeIfAbsent(YearMonth.from(file.getOcrStartTime()), entry -> new ArrayList<>()).add(file);
}
} }
if (StringUtils.isEmpty(licenseReportRequest.getRequestId())) { YearMonth currentMonth = YearMonth.from(files.get(0).getAdded());
licenseReportRequest.setRequestId(UUID.randomUUID().toString()); YearMonth endMonth = YearMonth.from(licenseReportRequest.getEndDate().atZone(UTC_ZONE_ID).toLocalDate());
YearMonth reportStartMonth = YearMonth.from(licenseReportRequest.getStartDate().atZone(UTC_ZONE_ID).toLocalDate());
List<MonthlyReportData> monthlyData = new ArrayList<>();
long activeFilesUploadedBytes = 0;
long trashFilesUploadedBytes = 0;
long archivedFilesUploadedBytes = 0;
int numberOfAnalyzedPages = 0;
int numberOfOcrPages = 0;
int numberOfAnalyzedFiles = 0;
int numberOfAnalyses = 0;
int numberOfOcrFiles = 0;
while (!currentMonth.isAfter(endMonth)) {
var addedFilesInMonth = adds.get(currentMonth);
if (addedFilesInMonth != null) {
for (var add : addedFilesInMonth) {
activeFilesUploadedBytes += add.getFileSize();
numberOfAnalyzedPages += add.getNumberOfPages();
numberOfAnalyzedFiles++;
numberOfAnalyses += add.getNumberOfAnalyses();
}
}
var softDeletedFilesInMonth = softDeletes.get(currentMonth);
if (softDeletedFilesInMonth != null) {
for (var softDeleted : softDeletedFilesInMonth) {
activeFilesUploadedBytes -= softDeleted.getFileSize();
trashFilesUploadedBytes += softDeleted.getFileSize();
}
}
var archivedFilesInMonth = archives.get(currentMonth);
if (archivedFilesInMonth != null) {
for (var archived : archivedFilesInMonth) {
activeFilesUploadedBytes -= archived.getFileSize();
archivedFilesUploadedBytes += archived.getFileSize();
}
}
var hardDeletedFilesInMonth = hardDeletes.get(currentMonth);
if (hardDeletedFilesInMonth != null) {
for (var hardDeleted : hardDeletedFilesInMonth) {
if (hardDeleted.getDeleted() != null) {
trashFilesUploadedBytes -= hardDeleted.getFileSize();
} else {
activeFilesUploadedBytes -= hardDeleted.getFileSize();
}
}
}
var ocrFilesInMonth = ocrs.get(currentMonth);
if (ocrFilesInMonth != null) {
for (var ocrFile : ocrFilesInMonth) {
numberOfOcrPages += ocrFile.getNumberOfPages(); // We count the entire document if ocr is performed.
numberOfOcrFiles++;
}
}
if (currentMonth.equals(reportStartMonth) || currentMonth.isAfter(reportStartMonth)) {
monthlyData.add(MonthlyReportData.builder()
.activeFilesUploadedBytes(activeFilesUploadedBytes)
.trashFilesUploadedBytes(trashFilesUploadedBytes)
.archivedFilesUploadedBytes(archivedFilesUploadedBytes)
.totalFilesUploadedBytes(activeFilesUploadedBytes + trashFilesUploadedBytes + archivedFilesUploadedBytes)
.numberOfAnalyzedPages(numberOfAnalyzedPages)
.numberOfOcrPages(numberOfOcrPages)
.build());
}
currentMonth = currentMonth.plusMonths(1);
} }
DetailedReportData detailedReportData = loadDetailedReportData(licenseReportRequest); return LicenseReport.builder()
.totalFilesUploadedBytes(activeFilesUploadedBytes + trashFilesUploadedBytes + archivedFilesUploadedBytes)
LicenseReport licenseReport = new LicenseReport(); .activeFilesUploadedBytes(activeFilesUploadedBytes)
licenseReport.setNumberOfAnalyzedPages(detailedReportData.getTotalPagesAnalyzed()); .trashFilesUploadedBytes(trashFilesUploadedBytes)
licenseReport.setNumberOfAnalyzedFiles(detailedReportData.getData().size()); .archivedFilesUploadedBytes(archivedFilesUploadedBytes)
licenseReport.setNumberOfOcrFiles((int) detailedReportData.getData().stream().filter(reportData -> reportData.getNumberOfOcrPages() > 0).count()); .numberOfAnalyzedPages(numberOfAnalyzedPages)
licenseReport.setNumberOfOcrPages(detailedReportData.getTotalOcrPages()); .numberOfOcrPages(numberOfOcrPages)
licenseReport.setNumberOfDossiers(detailedReportData.getNumberOfDossiers()); .numberOfAnalyzedFiles(numberOfAnalyzedFiles)
licenseReport.setNumberOfAnalyses(detailedReportData.getTotalNumberOfAnalyses()); .numberOfAnalyses(numberOfAnalyses)
licenseReport.setData(detailedReportData.getData().subList(offset, Math.min(offset + limit, detailedReportData.getData().size()))); .numberOfOcrFiles(numberOfOcrFiles)
licenseReport.setOffset(offset); .numberOfDossiers(addDossiers.stream()
licenseReport.setLimit(limit); .filter(dossier -> dossier.getHardDeletedTime() == null || dossier.getHardDeletedTime()
licenseReport.setStartDate(detailedReportData.getStartDate()); .isAfter(OffsetDateTime.ofInstant(licenseReportRequest.getEndDate(), UTC_ZONE_ID)))
licenseReport.setEndDate(detailedReportData.getEndDate()); .collect(Collectors.toSet())
licenseReport.setRequestId(licenseReportRequest.getRequestId()); .size())
.startDate(licenseReportRequest.getStartDate())
if (start != null) { .endDate(licenseReportRequest.getEndDate())
log.info("getLicenceReport took {} to process", Duration.between(start, Instant.now()).toString()); .monthlyData(monthlyData)
} .build();
return licenseReport;
}
private DetailedReportData loadDetailedReportData(LicenseReportRequest licenseReportRequest) {
log.debug("No licence-report found in cache, generating new report");
Instant start = null;
if (log.isInfoEnabled()) {
start = Instant.now();
}
final Set<String> dossierIds;
if (CollectionUtils.isEmpty(licenseReportRequest.getDossierIds())) {
dossierIds = dossierService.getAllDossiers().stream().map(DossierEntity::getId).collect(Collectors.toSet());
} else {
dossierIds = new HashSet<>(licenseReportRequest.getDossierIds());
}
var result = new DetailedReportData(new LinkedList<>(), dossierIds.size(), 0, 0, 0, licenseReportRequest.getStartDate(), licenseReportRequest.getEndDate());
fileStatusService.getStatusesForDossiersAndTimePeriod( //
dossierIds, //
OffsetDateTime.ofInstant(licenseReportRequest.getStartDate(), UTC_ZONE_ID), //
OffsetDateTime.ofInstant(licenseReportRequest.getEndDate(), UTC_ZONE_ID)) //
.forEach(fileStatus -> {
ReportData reportData = new ReportData();
reportData.setDossier(fileStatus.getDossierId());
reportData.setFileName(fileStatus.getFilename());
reportData.setAddedDate(fileStatus.getAdded().toInstant());
reportData.setLastUpdatedDate(fileStatus.getLastUpdated() == null ? null : fileStatus.getLastUpdated().toInstant());
reportData.setDeletedDate(fileStatus.getDeleted() == null ? null : fileStatus.getDeleted().toInstant());
reportData.setWorkflowStatus(fileStatus.getWorkflowStatus());
reportData.setNumberOfAnalyzedPages(fileStatus.getNumberOfPages());
reportData.setNumberOfOcrPages(fileStatus.getOcrStartTime() != null ? fileStatus.getNumberOfPages() : 0);
reportData.setAnalysisCount(fileStatus.getNumberOfAnalyses());
result.totalPagesAnalyzed += fileStatus.getNumberOfPages();
result.totalOcrPages += fileStatus.getOcrStartTime() != null ? fileStatus.getNumberOfPages() : 0;
result.totalNumberOfAnalyses += fileStatus.getNumberOfAnalyses();
result.data.add(reportData);
});
if (start != null) {
log.info("loadReport took {} to process", Duration.between(start, Instant.now()).toString());
}
return result;
}
// This was also used to cache results so that subsequent pagination works faster.
// Currently, pagination is unused, and it is unclear, if caching is needed.
// This intermediate object may be re-used for caching and pagination, if needed.
@Data
@AllArgsConstructor
private static class DetailedReportData {
List<ReportData> data;
int numberOfDossiers;
int totalNumberOfAnalyses;
int totalPagesAnalyzed;
int totalOcrPages;
Instant startDate;
Instant endDate;
} }
} }

View File

@ -339,9 +339,9 @@ public class FileStatusPersistenceService {
} }
public List<FileEntity> getStatusesForDossiersAndTimePeriod(Set<String> dossierIds, OffsetDateTime start, OffsetDateTime end) { public List<FileEntity> getStatusesAddedBefore(OffsetDateTime end) {
return fileRepository.findByDossierIdInAndAddedBetween(dossierIds, start, end); return fileRepository.findByAddedBefore(end);
} }

View File

@ -2,7 +2,6 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.util.List; import java.util.List;
import java.util.Set;
import javax.transaction.Transactional; import javax.transaction.Transactional;
@ -25,7 +24,7 @@ public interface FileRepository extends JpaRepository<FileEntity, String> {
List<FileEntity> findByDossierId(String dossierId); List<FileEntity> findByDossierId(String dossierId);
List<FileEntity> findByDossierIdInAndAddedBetween(Set<String> dossierIds, OffsetDateTime start, OffsetDateTime end); List<FileEntity> findByAddedBefore(OffsetDateTime end);
@Modifying @Modifying

View File

@ -2,11 +2,10 @@ package com.iqser.red.service.peristence.v1.server.integration.tests;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import java.time.Instant;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit; import java.time.ZoneId;
import java.util.stream.Collectors;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -15,6 +14,9 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTem
import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; 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.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository;
import com.iqser.red.service.persistence.service.v1.api.shared.model.FileStatus;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier;
import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReport; import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReport;
import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReportRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReportRequest;
@ -35,44 +37,104 @@ public class LicenseReportTest extends AbstractPersistenceServerServiceTest {
@Autowired @Autowired
private DossierTesterAndProvider dossierTesterAndProvider; private DossierTesterAndProvider dossierTesterAndProvider;
@Autowired
private FileRepository fileRepository;
@Autowired
private DossierRepository dossierRepository;
@Test @Test
public void testLicenseReport() { public void testLicenseReport() {
var template = dossierTemplateTesterAndProvider.provideTestTemplate(); var template = dossierTemplateTesterAndProvider.provideTestTemplate();
var dossier1 = dossierTesterAndProvider.provideTestDossier(template, "Dossier1"); var lastYearDossier = dossierTesterAndProvider.provideTestDossier(template, "lastYearDossier");
var lastYearFile1 = addFileOnDate(lastYearDossier, "2022-01-01T10:00:00Z");
var lastYearFile2 = addFileOnDate(lastYearDossier, "2022-01-02T10:00:00Z");
var file1 = fileTesterAndProvider.testAndProvideFile(dossier1, "test1.pdf"); var januaryDossier = dossierTesterAndProvider.provideTestDossier(template, "januaryDossier");
var file2 = fileTesterAndProvider.testAndProvideFile(dossier1, "test2.pdf"); var januaryFile1 = addFileOnDate(januaryDossier, "2023-01-01T10:00:00Z");
var januaryFile2 = addFileOnDate(januaryDossier, "2023-01-02T10:00:00Z");
var dossier2 = dossierTesterAndProvider.provideTestDossier(template, "Dossier2"); var februaryDossier = dossierTesterAndProvider.provideTestDossier(template, "februaryDossier");
var februaryFile1 = addFileOnDate(februaryDossier, "2023-02-01T10:00:00Z");
var februaryFile2 = addFileOnDate(februaryDossier, "2023-02-02T10:00:00Z");
var file3 = fileTesterAndProvider.testAndProvideFile(dossier2, "test3.pdf"); var marchDossier = dossierTesterAndProvider.provideTestDossier(template, "marchDossier");
var file4 = fileTesterAndProvider.testAndProvideFile(dossier2, "test4.pdf"); var marchFile1 = addFileOnDate(marchDossier, "2023-03-01T10:00:00Z");
var marchFile2 = addFileOnDate(marchDossier, "2023-03-02T10:00:00Z");
var dossiers = Lists.newArrayList(dossier1, dossier2); var aprilDossier = dossierTesterAndProvider.provideTestDossier(template, "aprilDossier");
var files = Lists.newArrayList(file1, file2, file3, file4); var aprilFile1 = addFileOnDate(aprilDossier, "2023-04-01T10:00:00Z");
var aprilFile2 = addFileOnDate(aprilDossier, "2023-04-02T10:00:00Z");
LicenseReportRequest request = new LicenseReportRequest(); softDeleteFile(januaryFile1.getFileId(), "2023-02-01T10:00:00Z");
request.setDossierIds(dossiers.stream().map(Dossier::getId).collect(Collectors.toList()));
var startDate = OffsetDateTime.now().minusHours(10).toInstant().truncatedTo(ChronoUnit.MILLIS); hardDeleteFile(januaryFile1.getFileId(), "2023-03-01T10:00:00Z");
request.setStartDate(startDate);
var endDate = OffsetDateTime.now().plusHours(10).toInstant().truncatedTo(ChronoUnit.MILLIS); archiveDossier(februaryDossier.getDossierId(), "2023-05-01T10:00:00Z");
request.setEndDate(endDate);
String requestId = "123"; LicenseReport licenseReport = licenseReportClient.getReport(LicenseReportRequest.builder()
request.setRequestId(requestId); .startDate(Instant.parse("2023-01-01T10:00:00Z"))
.endDate(Instant.parse("2023-05-01T10:00:00Z"))
.build());
LicenseReport licenseReport = licenseReportClient.getReport(request, 0, 20); assertThat(licenseReport.getTotalFilesUploadedBytes()).isEqualTo(900L);
assertThat(licenseReport.getActiveFilesUploadedBytes()).isEqualTo(700L);
assertThat(licenseReport.getArchivedFilesUploadedBytes()).isEqualTo(200L);
assertThat(licenseReport.getTrashFilesUploadedBytes()).isEqualTo(0L);
assertThat(licenseReport.getNumberOfDossiers()).isEqualTo(dossiers.size()); assertThat(licenseReport.getMonthlyData().size()).isEqualTo(5);
assertThat(licenseReport.getNumberOfAnalyzedFiles()).isEqualTo(files.size()); assertThat(licenseReport.getMonthlyData().get(1).getTrashFilesUploadedBytes()).isEqualTo(100L);
assertThat(licenseReport.getRequestId()).isEqualTo(requestId); assertThat(licenseReport.getMonthlyData().get(2).getTrashFilesUploadedBytes()).isEqualTo(0L);
assertThat(licenseReport.getStartDate()).isEqualTo(startDate); }
assertThat(licenseReport.getEndDate()).isEqualTo(endDate);
private FileStatus addFileOnDate(Dossier dossier, String date) {
var file = fileTesterAndProvider.testAndProvideFile(dossier, date + ".pdf");
setAdded(file.getId(), date);
return file;
}
private void setAdded(String fileId, String date) {
fileRepository.findById(fileId).ifPresent((file) -> {
file.setAdded(OffsetDateTime.ofInstant(Instant.parse(date), ZoneId.of("Z")));
file.setFileSize(100L);
fileRepository.saveAndFlush(file);
});
}
private void archiveDossier(String dossierId, String date) {
dossierRepository.findById(dossierId).ifPresent((dossier) -> {
dossier.setArchivedTime(OffsetDateTime.ofInstant(Instant.parse(date), ZoneId.of("Z")));
dossierRepository.saveAndFlush(dossier);
});
}
private void softDeleteFile(String fileId, String date) {
fileRepository.findById(fileId).ifPresent((file) -> {
file.setDeleted(OffsetDateTime.ofInstant(Instant.parse(date), ZoneId.of("Z")));
fileRepository.saveAndFlush(file);
});
}
private void hardDeleteFile(String fileId, String date) {
fileRepository.findById(fileId).ifPresent((file) -> {
file.setHardDeletedTime(OffsetDateTime.ofInstant(Instant.parse(date), ZoneId.of("Z")));
fileRepository.saveAndFlush(file);
});
} }
} }

View File

@ -15,28 +15,21 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
public class LicenseReport { public class LicenseReport {
private long totalFilesUploadedBytes;
private long activeFilesUploadedBytes;
private long trashFilesUploadedBytes;
private long archivedFilesUploadedBytes;
private int numberOfAnalyzedFiles; private int numberOfAnalyzedFiles;
private int numberOfOcrFiles; private int numberOfOcrFiles;
private int numberOfDossiers; private int numberOfDossiers;
private int numberOfAnalyzedPages; private int numberOfAnalyzedPages;
private int numberOfOcrPages; private int numberOfOcrPages;
private int numberOfAnalyses;
private int numberOfAnalyses; // includes reanalysis counts
private Instant startDate; private Instant startDate;
private Instant endDate; private Instant endDate;
private int offset; @Builder.Default
private List<MonthlyReportData> monthlyData = new ArrayList<>();
private int limit;
private List<ReportData> data = new ArrayList<>();
// To be used for consecutive/paged calls
private String requestId;
} }

View File

@ -3,31 +3,21 @@ package com.iqser.red.service.persistence.service.v1.api.shared.model.license;
import java.time.Instant; import java.time.Instant;
import java.time.Year; import java.time.Year;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@Data @Data
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@EqualsAndHashCode(of = "requestId")
public class LicenseReportRequest { public class LicenseReportRequest {
private String requestId;
private Instant startDate; private Instant startDate;
private Instant endDate; private Instant endDate;
private List<String> dossierIds = new ArrayList<>();
public Instant getStartDate() { public Instant getStartDate() {
if (startDate == null) { if (startDate == null) {

View File

@ -0,0 +1,21 @@
package com.iqser.red.service.persistence.service.v1.api.shared.model.license;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MonthlyReportData {
private long totalFilesUploadedBytes;
private long activeFilesUploadedBytes;
private long trashFilesUploadedBytes;
private long archivedFilesUploadedBytes;
private int numberOfAnalyzedPages;
private int numberOfOcrPages;
}

View File

@ -1,28 +0,0 @@
package com.iqser.red.service.persistence.service.v1.api.shared.model.license;
import java.time.Instant;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ReportData {
private String dossier;
private String fileName;
private Instant addedDate;
private Instant lastUpdatedDate;
private Instant deletedDate;
private int numberOfAnalyzedPages;
private int numberOfOcrPages;
private WorkflowStatus workflowStatus;
private int analysisCount;
}