From b028da4c2fdf4bc31462d7d69d1e39b436b67fa1 Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Thu, 7 Sep 2023 12:24:41 +0200 Subject: [PATCH] DM-285: add component log and entity log, deprecate redaction log * also refactor RedactionLogController --- .../controller/AnalysisLogController.java | 71 ++++++++ .../impl/controller/DocumentController.java | 168 ++++++++++++++++++ .../controller/RedactionLogController.java | 81 +-------- .../resource/AnalysisLogResource.java | 58 ++++++ .../external/resource/DocumentResource.java | 58 ++++++ .../resource/RedactionLogResource.java | 41 +---- .../service/ComponentLogService.java | 21 +++ .../processor/service/EntityLogService.java | 87 +++++++++ .../service/FileManagementStorageService.java | 29 +++ .../LayoutParsingFinishedMessageReceiver.java | 3 +- .../ComponentEntityReference.java | 22 +++ .../componentlog/ComponentLog.java | 26 +++ .../componentlog/ComponentLogEntry.java | 25 +++ .../model/analysislog/entitylog/Change.java | 20 +++ .../analysislog/entitylog/ChangeType.java | 7 + .../model/analysislog/entitylog/Engine.java | 8 + .../analysislog/entitylog/EntityLog.java | 34 ++++ .../entitylog/EntityLogChanges.java | 17 ++ .../entitylog/EntityLogComment.java | 22 +++ .../analysislog/entitylog/EntityLogEntry.java | 97 ++++++++++ .../entitylog/EntityLogLegalBasis.java | 16 ++ .../analysislog/entitylog/EntryState.java | 8 + .../analysislog/entitylog/EntryType.java | 10 ++ .../FilteredRedactionLogRequest.java | 22 +++ .../analysislog/entitylog/ManualChange.java | 59 ++++++ .../entitylog/ManualRedactionType.java | 13 ++ .../model/analysislog/entitylog/Position.java | 18 ++ .../entitylog/imported/ImportedRedaction.java | 24 +++ .../imported/ImportedRedactions.java | 21 +++ .../dossier/file/FileType.java | 4 +- 30 files changed, 973 insertions(+), 117 deletions(-) create mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AnalysisLogController.java create mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DocumentController.java create mode 100644 persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/AnalysisLogResource.java create mode 100644 persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DocumentResource.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogService.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentEntityReference.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLog.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLogEntry.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/Change.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/ChangeType.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/Engine.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLog.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogChanges.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogComment.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogEntry.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogLegalBasis.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntryState.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntryType.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/FilteredRedactionLogRequest.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/ManualChange.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/ManualRedactionType.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/Position.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/imported/ImportedRedaction.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/imported/ImportedRedactions.java diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AnalysisLogController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AnalysisLogController.java new file mode 100644 index 000000000..457d9ca26 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AnalysisLogController.java @@ -0,0 +1,71 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_REDACTION_LOG; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; + +import java.util.List; + +import org.springframework.security.access.prepost.PreAuthorize; +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 com.iqser.red.service.persistence.management.v1.processor.service.ComponentLogService; +import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.AnalysisLogResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLog; +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.redactionlog.FilteredRedactionLogRequest; + +import feign.FeignException; +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class AnalysisLogController implements AnalysisLogResource { + + private final EntityLogService redactionLogService; + private final ComponentLogService componentLogService; + + + @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") + public EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = "excludedType", required = false) List excludedTypes, + @RequestParam(value = "withManualRedactions", required = false, defaultValue = "true") boolean withManualRedactions, + @RequestParam(value = "includeFalsePositives", required = false, defaultValue = "false") boolean includeFalsePositives) { + + try { + return redactionLogService.getEntityLog(dossierId, fileId, excludedTypes); + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") + public EntityLog getFilteredEntityLog(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody FilteredRedactionLogRequest filteredRedactionLogRequest) { + + try { + return redactionLogService.getFilteredEntityLog(dossierId, fileId, filteredRedactionLogRequest); + } catch (FeignException e) { + throw processFeignException(e); + } + + } + + + @Override + public ComponentLog getComponentLog(String dossierId, String fileId) { + + try { + return componentLogService.getComponentLog(dossierId, fileId); + } catch (FeignException e) { + throw processFeignException(e); + } + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DocumentController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DocumentController.java new file mode 100644 index 000000000..a2b4eb03f --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DocumentController.java @@ -0,0 +1,168 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_REDACTION_LOG; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; +import com.iqser.red.service.persistence.management.v1.processor.service.RedactionLogService; +import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DocumentResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; +import com.knecon.fforesight.tenantcommons.TenantContext; + +import feign.FeignException; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; + +@RestController +@RequiredArgsConstructor +public class DocumentController implements DocumentResource { + + private final RedactionLogService redactionLogService; + private final FileStatusService fileStatusService; + private final FileManagementStorageService fileManagementStorageService; + + + @SneakyThrows + @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") + public ResponseEntity getDocumentText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + try { + return buildZipFileResponseEntity(fileId, dossierId, FileType.DOCUMENT_TEXT); + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @SneakyThrows + @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") + public ResponseEntity getDocumentPositions(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + try { + return buildZipFileResponseEntity(fileId, dossierId, FileType.DOCUMENT_POSITION); + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @SneakyThrows + @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") + public ResponseEntity getDocumentStructure(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + try { + return buildZipFileResponseEntity(fileId, dossierId, FileType.DOCUMENT_STRUCTURE); + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @SneakyThrows + @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") + public ResponseEntity getDocumentPages(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + try { + return buildZipFileResponseEntity(fileId, dossierId, FileType.DOCUMENT_PAGES); + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @SneakyThrows + @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") + public ResponseEntity getSimplifiedSectionText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + try { + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.parseMediaType("application/zip")); + + var fileStatus = fileStatusService.getStatus(fileId); + String filename = fileStatus.getFilename(); + if (filename != null) { + var index = filename.lastIndexOf("."); + String prefix = filename.substring(0, index); + filename = prefix + ".json"; + httpHeaders.add("Content-Disposition", "attachment; filename*=utf-8''" + StringEncodingUtils.urlEncode(prefix) + ".zip"); + } + + byte[] zipBytes = getZippedBytes(dossierId, fileId, filename, FileType.SIMPLIFIED_TEXT); + return new ResponseEntity<>(zipBytes, httpHeaders, HttpStatus.OK); + + } catch (StorageObjectDoesNotExist e) { + throw new RuntimeException("Simplified Text is not available", e); + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + private ResponseEntity buildZipFileResponseEntity(String fileId, String dossierId, FileType fileType) throws IOException { + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.parseMediaType("application/zip")); + + var fileStatus = fileStatusService.getStatus(fileId); + String filename = fileStatus.getFilename(); + if (filename != null) { + var index = filename.lastIndexOf("."); + String prefix = filename.substring(0, index); + filename = prefix + ".json"; + httpHeaders.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=utf-8''" + StringEncodingUtils.urlEncode(prefix) + ".zip"); + } + + byte[] zipBytes = getZippedBytes(dossierId, fileId, filename, fileType); + httpHeaders.setContentLength(zipBytes.length); + return new ResponseEntity<>(zipBytes, httpHeaders, HttpStatus.OK); + } + + + private byte[] getZippedBytes(String dossierId, String fileId, String filename, FileType fileType) throws IOException { + + try { + String objectId = dossierId + "/" + fileId + "." + fileType.name() + fileType.getExtension(); + + try (var inputStream = fileManagementStorageService.getObject(TenantContext.getTenantId(), objectId)) { + byte[] input = inputStream.readAllBytes(); + inputStream.close(); + return zipBytes(filename, input); + } + + } catch (StorageObjectDoesNotExist e) { + throw new RuntimeException(String.format("%s is not available", fileType.name()), e); + } + } + + + public static byte[] zipBytes(String filename, byte[] input) throws IOException { + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ZipOutputStream zos = new ZipOutputStream(baos); + ZipEntry entry = new ZipEntry(filename); + entry.setSize(input.length); + zos.putNextEntry(entry); + zos.write(input); + zos.closeEntry(); + zos.close(); + return baos.toByteArray(); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RedactionLogController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RedactionLogController.java index a9aa72d55..f8cccee23 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RedactionLogController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RedactionLogController.java @@ -44,6 +44,7 @@ public class RedactionLogController implements RedactionLogResource { private final FileManagementStorageService fileManagementStorageService; + @Deprecated(forRemoval = true) @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") public RedactionLog getRedactionLog(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @@ -59,6 +60,7 @@ public class RedactionLogController implements RedactionLogResource { } + @Deprecated(forRemoval = true) @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") public SectionGrid getSectionGrid(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { @@ -70,6 +72,7 @@ public class RedactionLogController implements RedactionLogResource { } + @Deprecated(forRemoval = true) @SneakyThrows @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") public ResponseEntity getSectionText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { @@ -102,83 +105,7 @@ public class RedactionLogController implements RedactionLogResource { } - @SneakyThrows - @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") - public ResponseEntity getDocumentText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { - - try { - return buildZipFileResponseEntity(fileId, dossierId, FileType.DOCUMENT_TEXT); - } catch (FeignException e) { - throw processFeignException(e); - } - } - - - @SneakyThrows - @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") - public ResponseEntity getDocumentPositions(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { - - try { - return buildZipFileResponseEntity(fileId, dossierId, FileType.DOCUMENT_POSITION); - } catch (FeignException e) { - throw processFeignException(e); - } - } - - - @SneakyThrows - @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") - public ResponseEntity getDocumentStructure(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { - - try { - return buildZipFileResponseEntity(fileId, dossierId, FileType.DOCUMENT_STRUCTURE); - } catch (FeignException e) { - throw processFeignException(e); - } - } - - - @SneakyThrows - @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") - public ResponseEntity getDocumentPages(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { - - try { - return buildZipFileResponseEntity(fileId, dossierId, FileType.DOCUMENT_PAGES); - } catch (FeignException e) { - throw processFeignException(e); - } - } - - - @SneakyThrows - @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") - public ResponseEntity getSimplifiedSectionText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { - - try { - - HttpHeaders httpHeaders = new HttpHeaders(); - httpHeaders.setContentType(MediaType.parseMediaType("application/zip")); - - var fileStatus = fileStatusService.getStatus(fileId); - String filename = fileStatus.getFilename(); - if (filename != null) { - var index = filename.lastIndexOf("."); - String prefix = filename.substring(0, index); - filename = prefix + ".json"; - httpHeaders.add("Content-Disposition", "attachment; filename*=utf-8''" + StringEncodingUtils.urlEncode(prefix) + ".zip"); - } - - byte[] zipBytes = getZippedBytes(dossierId, fileId, filename, FileType.SIMPLIFIED_TEXT); - return new ResponseEntity<>(zipBytes, httpHeaders, HttpStatus.OK); - - } catch (StorageObjectDoesNotExist e) { - throw new RuntimeException("Simplified Text is not available", e); - } catch (FeignException e) { - throw processFeignException(e); - } - } - - + @Deprecated(forRemoval = true) @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") public RedactionLog getFilteredRedactionLog(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/AnalysisLogResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/AnalysisLogResource.java new file mode 100644 index 000000000..1ec6ecbb2 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/AnalysisLogResource.java @@ -0,0 +1,58 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLog; +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.redactionlog.FilteredRedactionLogRequest; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(value = HttpStatus.OK) +public interface AnalysisLogResource { + + String ENTITY_LOG_PATH = ExternalApi.BASE_PATH + "/entityLog"; + String COMPONENT_LOG_PATH = ExternalApi.BASE_PATH + "/componentLog"; + + String FILE_ID = "fileId"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + + String DOSSIER_ID = "dossierId"; + String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + + + @GetMapping(value = ENTITY_LOG_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets the redaction log for a fileId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The redaction log is not found.")}) + EntityLog getEntityLog(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = "excludedType", required = false) List excludedTypes, + @RequestParam(value = "withManualRedactions", required = false, defaultValue = "true") boolean withManualRedactions, + @RequestParam(value = "includeFalsePositives", required = false, defaultValue = "false") boolean includeFalsePositives); + + + @PostMapping(value = ENTITY_LOG_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE + "/filtered", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets the redaction log for a fileId grater than the specified date", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The redaction log is not found.")}) + EntityLog getFilteredEntityLog(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody FilteredRedactionLogRequest filteredRedactionLogRequest); + + + @GetMapping(value = COMPONENT_LOG_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets the redaction log for a fileId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The redaction log is not found.")}) + ComponentLog getComponentLog(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DocumentResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DocumentResource.java new file mode 100644 index 000000000..0a1292627 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DocumentResource.java @@ -0,0 +1,58 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.ResponseStatus; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(value = HttpStatus.OK) +public interface DocumentResource { + + String DOCUMENT_TEXT_PATH = ExternalApi.BASE_PATH + "/documentText"; + String DOCUMENT_POSITIONS_PATH = ExternalApi.BASE_PATH + "/documentPositions"; + String DOCUMENT_PAGES_PATH = ExternalApi.BASE_PATH + "/documentPages"; + String DOCUMENT_STRUCTURE_PATH = ExternalApi.BASE_PATH + "/documentStructure"; + String SIMPLIFIED_SECTION_TEXT_PATH = ExternalApi.BASE_PATH + "/simplifiedSectionText"; + + String FILE_ID = "fileId"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + + String DOSSIER_ID = "dossierId"; + String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + + + @GetMapping(value = DOCUMENT_TEXT_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Gets the text blocks of a document for a fileId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The document text is not found.")}) + ResponseEntity getDocumentText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + + + @GetMapping(value = DOCUMENT_POSITIONS_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Gets the positions of the text blocks of a document for a fileId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The document positions is not found.")}) + ResponseEntity getDocumentPositions(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + + + @GetMapping(value = DOCUMENT_STRUCTURE_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Gets the document structure for a fileId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The document structure is not found.")}) + ResponseEntity getDocumentStructure(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + + + @GetMapping(value = DOCUMENT_PAGES_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Gets the page information of a document for a fileId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The page information is not found.")}) + ResponseEntity getDocumentPages(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + + + @GetMapping(value = SIMPLIFIED_SECTION_TEXT_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Gets the simplified section text for a fileId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The simplified section text is not found.")}) + ResponseEntity getSimplifiedSectionText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RedactionLogResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RedactionLogResource.java index 4f1904009..2af8ffc9b 100644 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RedactionLogResource.java +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RedactionLogResource.java @@ -26,11 +26,6 @@ public interface RedactionLogResource { String REDACTION_LOG_PATH = ExternalApi.BASE_PATH + "/redactionLog"; String SECTION_GRID_PATH = ExternalApi.BASE_PATH + "/sectionGrid"; String SECTION_TEXT_PATH = ExternalApi.BASE_PATH + "/sectionText"; - String DOCUMENT_TEXT_PATH = ExternalApi.BASE_PATH + "/documentText"; - String DOCUMENT_POSITIONS_PATH = ExternalApi.BASE_PATH + "/documentPositions"; - String DOCUMENT_PAGES_PATH = ExternalApi.BASE_PATH + "/documentPages"; - String DOCUMENT_STRUCTURE_PATH = ExternalApi.BASE_PATH + "/documentStructure"; - String SIMPLIFIED_SECTION_TEXT_PATH = ExternalApi.BASE_PATH + "/simplifiedSectionText"; String FILE_ID = "fileId"; String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; @@ -39,6 +34,7 @@ public interface RedactionLogResource { String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + @Deprecated(forRemoval = true) @GetMapping(value = REDACTION_LOG_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Gets the redaction log for a fileId", description = "None") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The redaction log is not found.")}) @@ -49,50 +45,21 @@ public interface RedactionLogResource { @RequestParam(value = "includeFalsePositives", required = false, defaultValue = "false") boolean includeFalsePositives); - @Deprecated + @Deprecated(forRemoval = true) @GetMapping(value = SECTION_GRID_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Gets the section grid for a fileId", description = "None") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The section grid is not found.")}) SectionGrid getSectionGrid(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); - @Deprecated + @Deprecated(forRemoval = true) @GetMapping(value = SECTION_TEXT_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) @Operation(summary = "Gets the text blocks of a document for a fileId", description = "None") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The section text is not found.")}) ResponseEntity getSectionText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); - @GetMapping(value = DOCUMENT_TEXT_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) - @Operation(summary = "Gets the text blocks of a document for a fileId", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The document text is not found.")}) - ResponseEntity getDocumentText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); - - - @GetMapping(value = DOCUMENT_POSITIONS_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) - @Operation(summary = "Gets the positions of the text blocks of a document for a fileId", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The document positions is not found.")}) - ResponseEntity getDocumentPositions(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); - - - @GetMapping(value = DOCUMENT_STRUCTURE_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) - @Operation(summary = "Gets the document structure for a fileId", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The document structure is not found.")}) - ResponseEntity getDocumentStructure(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); - - - @GetMapping(value = DOCUMENT_PAGES_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) - @Operation(summary = "Gets the page information of a document for a fileId", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The page information is not found.")}) - ResponseEntity getDocumentPages(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); - - - @GetMapping(value = SIMPLIFIED_SECTION_TEXT_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) - @Operation(summary = "Gets the simplified section text for a fileId", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The simplified section text is not found.")}) - ResponseEntity getSimplifiedSectionText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); - - + @Deprecated(forRemoval = true) @PostMapping(value = REDACTION_LOG_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE + "/filtered", produces = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Gets the redaction log for a fileId grater than the specified date", description = "None") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The redaction log is not found.")}) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java new file mode 100644 index 000000000..12e982779 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java @@ -0,0 +1,21 @@ +package com.iqser.red.service.persistence.management.v1.processor.service; + +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLog; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class ComponentLogService { + + private final FileManagementStorageService fileManagementStorageService; + + + public ComponentLog getComponentLog(String dossierId, String fileId) { + + return fileManagementStorageService.getComponentLog(dossierId, fileId); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogService.java new file mode 100644 index 000000000..12a93d663 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogService.java @@ -0,0 +1,87 @@ +package com.iqser.red.service.persistence.management.v1.processor.service; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import org.springframework.stereotype.Service; + +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.redactionlog.FilteredRedactionLogRequest; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class EntityLogService { + + private final FileManagementStorageService fileManagementStorageService; + private final FileStatusService fileStatusService; + + + public EntityLog getEntityLog(String dossierId, String fileId) { + + return getEntityLog(dossierId, fileId, Collections.emptyList()); + } + + + public EntityLog getEntityLog(String dossierId, String fileId, List excludedTypes) { + + var fileStatus = fileStatusService.getStatus(fileId); + + EntityLog redactionLog; + + redactionLog = fileManagementStorageService.getEntityLog(dossierId, fileId); + + if (fileStatus.isExcluded()) { + redactionLog.setEntityLogEntry(new ArrayList<>()); + } + + if (excludedTypes != null) { + redactionLog.getEntityLogEntry().removeIf(nextEntry -> excludedTypes.contains(nextEntry.getType())); + } + + return redactionLog; + } + + + + public EntityLog getFilteredEntityLog(String dossierId, String fileId, FilteredRedactionLogRequest filteredRedactionLogRequest) { + + if (filteredRedactionLogRequest.getSpecifiedDate() == null) { + filteredRedactionLogRequest.setSpecifiedDate(OffsetDateTime.MIN); + } + + var entityLog = getEntityLog(dossierId, fileId, filteredRedactionLogRequest.getExcludedTypes()); + var entityLogEntry = entityLog.getEntityLogEntry(); + + Iterator it = entityLogEntry.iterator(); + while (it.hasNext()) { + var redactionLogEntry = it.next(); + boolean isAfterSpecifiedDate = false; + for (var change : redactionLogEntry.getChanges()) { + if (change.getDateTime() != null && change.getDateTime().isAfter(filteredRedactionLogRequest.getSpecifiedDate())) { + isAfterSpecifiedDate = true; + } + } + for (var manualChange : redactionLogEntry.getManualChanges()) { + if (manualChange.getProcessedDate() != null && manualChange.getProcessedDate() + .isAfter(filteredRedactionLogRequest.getSpecifiedDate()) || manualChange.getRequestedDate() != null && manualChange.getRequestedDate() + .isAfter(filteredRedactionLogRequest.getSpecifiedDate())) { + isAfterSpecifiedDate = true; + } + } + + if (!isAfterSpecifiedDate) { + it.remove(); + } + + } + + return entityLog; + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileManagementStorageService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileManagementStorageService.java index 27bcc7e41..b0fe9fe4b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileManagementStorageService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileManagementStorageService.java @@ -12,6 +12,8 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.exception.InternalServerErrorException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLog; +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.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.imported.ImportedRedactions; @@ -93,6 +95,19 @@ public class FileManagementStorageService { } + public EntityLog getEntityLog(String dossierId, String fileId) { + + try { + return storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.ENTITY_LOG), EntityLog.class); + } catch (StorageObjectDoesNotExist e) { + log.debug("RedactionLog does not exist"); + throw new NotFoundException(String.format("RedactionLog does not exist for Dossier ID \"%s\" and File ID \"%s\"!", dossierId, fileId)); + } catch (StorageException e) { + throw new InternalServerErrorException(e.getMessage()); + } + } + + public void storeRedactionLog(String dossierId, String fileId, RedactionLog redactionLog) { storageService.storeJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.REDACTION_LOG), redactionLog); @@ -132,6 +147,7 @@ public class FileManagementStorageService { return storageService.objectExists(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, origin)); } + public boolean objectExists(String storageId) { return storageService.objectExists(TenantContext.getTenantId(), storageId); @@ -149,4 +165,17 @@ public class FileManagementStorageService { storageService.deleteObject(TenantContext.getTenantId(), storageId); } + + public ComponentLog getComponentLog(String dossierId, String fileId) { + + try { + return storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.COMPONENT_LOG), ComponentLog.class); + } catch (StorageObjectDoesNotExist e) { + log.debug("RedactionLog does not exist"); + throw new NotFoundException(String.format("RedactionLog does not exist for Dossier ID \"%s\" and File ID \"%s\"!", dossierId, fileId)); + } catch (StorageException e) { + throw new InternalServerErrorException(e.getMessage()); + } + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/LayoutParsingFinishedMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/LayoutParsingFinishedMessageReceiver.java index 0c380367a..5a0bb92c2 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/LayoutParsingFinishedMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/LayoutParsingFinishedMessageReceiver.java @@ -12,7 +12,6 @@ import com.iqser.red.service.persistence.management.v1.processor.configuration.M import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusProcessingUpdateService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; import com.iqser.red.service.persistence.management.v1.processor.service.layoutparsing.LayoutParsingRequestIdentifierService; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileErrorInfo; import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingFinishedEvent; import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingQueueNames; @@ -43,7 +42,7 @@ public class LayoutParsingFinishedMessageReceiver { fileStatusService.updateLayoutProcessedTime(layoutParsingRequestIdentifierService.parseFileId(response.identifier())); - log.info("Received message {} in {}", response, MessagingConfiguration.OCR_STATUS_UPDATE_RESPONSE_QUEUE); + log.info("Received message {} in {}", response, LayoutParsingQueueNames.LAYOUT_PARSING_FINISHED_EVENT_QUEUE); } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentEntityReference.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentEntityReference.java new file mode 100644 index 000000000..0e49049e4 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentEntityReference.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.FieldDefaults; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE) +public class ComponentEntityReference { + + String id; + String type; + int page; + String ruleIdentifier; + String reason; +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLog.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLog.java new file mode 100644 index 000000000..0cc13dd6b --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLog.java @@ -0,0 +1,26 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog; + +import java.util.ArrayList; +import java.util.List; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.FieldDefaults; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE) +public class ComponentLog { + + int analysisNumber; + + List componentLogEntries = new ArrayList<>(); + + long dictionaryVersion = -1; + long dossierDictionaryVersion = -1; + long rulesVersion = -1; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLogEntry.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLogEntry.java new file mode 100644 index 000000000..c5537e519 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLogEntry.java @@ -0,0 +1,25 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog; + +import java.util.List; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.FieldDefaults; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE) +public class ComponentLogEntry { + + String value; + String originalValue; + String transformation; + + List componentEntityReferences; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/Change.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/Change.java new file mode 100644 index 000000000..e08c314f7 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/Change.java @@ -0,0 +1,20 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +import java.time.OffsetDateTime; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Change { + + private int analysisNumber; + private ChangeType type; + private OffsetDateTime dateTime; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/ChangeType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/ChangeType.java new file mode 100644 index 000000000..fb317062a --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/ChangeType.java @@ -0,0 +1,7 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +public enum ChangeType { + ADDED, + REMOVED, + CHANGED +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/Engine.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/Engine.java new file mode 100644 index 000000000..ab36047ba --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/Engine.java @@ -0,0 +1,8 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +public enum Engine { + DICTIONARY, + NER, + RULE, + MANUAL +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLog.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLog.java new file mode 100644 index 000000000..b1de32916 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLog.java @@ -0,0 +1,34 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +import java.util.ArrayList; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class EntityLog { + + /** + * Version 0 Redaction Logs have manual redactions merged inside them + * Version 1 Redaction Logs only contain system ( rule/dictionary ) redactions. Manual Redactions are merged in at runtime. + */ + private long analysisVersion; + + /** + * Which analysis created this redactionLog. + */ + private int analysisNumber; + + private List entityLogEntry = new ArrayList<>(); + private List legalBasis = new ArrayList<>(); + + private long dictionaryVersion = -1; + private long dossierDictionaryVersion = -1; + private long rulesVersion = -1; + private long legalBasisVersion = -1; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogChanges.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogChanges.java new file mode 100644 index 000000000..1bfb03b4b --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogChanges.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EntityLogChanges { + + private EntityLog entityLog; + private boolean hasChanges; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogComment.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogComment.java new file mode 100644 index 000000000..1629071b2 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogComment.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +import java.time.OffsetDateTime; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EntityLogComment { + + private long id; + private String user; + private String text; + private String annotationId; + private String fileId; + private OffsetDateTime date; + private OffsetDateTime softDeletedTime; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogEntry.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogEntry.java new file mode 100644 index 000000000..338782867 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogEntry.java @@ -0,0 +1,97 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.FieldDefaults; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode +@FieldDefaults(level = AccessLevel.PRIVATE) +public class EntityLogEntry { + + String id; + String type; + EntryType entryType; + EntryState state; + String value; + String reason; + String matchedRule; + boolean rectangle; + String legalBasis; + + boolean imported; + + String section; + float[] color; + + @Builder.Default + List positions = new ArrayList<>(); + int sectionNumber; + + String textBefore; + String textAfter; + + int startOffset; + int endOffset; + + boolean imageHasTransparency; + + boolean isDictionaryEntry; + boolean isDossierDictionaryEntry; + + boolean excluded; + + String sourceId; + + @EqualsAndHashCode.Exclude + @Builder.Default + List changes = new ArrayList<>(); + + @EqualsAndHashCode.Exclude + @Builder.Default + List manualChanges = new ArrayList<>(); + + @Builder.Default + Set engines = new HashSet<>(); + + @Builder.Default + Set reference = new HashSet<>(); + + @Builder.Default + Set importedRedactionIntersections = new HashSet<>(); + + + public boolean lastChangeIsRemoved() { + + return last(changes).map(c -> c.getType() == ChangeType.REMOVED).orElse(false); + } + + + public boolean isManuallyRemoved() { + + return manualChanges != null && manualChanges.stream() + .anyMatch(mc -> mc.getManualRedactionType() == ManualRedactionType.REMOVE_LOCALLY && mc.getAnnotationStatus() == AnnotationStatus.APPROVED); + } + + + private Optional last(List list) { + + return list == null || list.isEmpty() ? Optional.empty() : Optional.of(list.get(list.size() - 1)); + } + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogLegalBasis.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogLegalBasis.java new file mode 100644 index 000000000..86df0c8f6 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogLegalBasis.java @@ -0,0 +1,16 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EntityLogLegalBasis { + + private String name; + private String description; + private String reason; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntryState.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntryState.java new file mode 100644 index 000000000..41497ec8f --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntryState.java @@ -0,0 +1,8 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +public enum EntryState { + APPLIED, + SKIPPED, + IGNORED, + REMOVED +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntryType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntryType.java new file mode 100644 index 000000000..143461605 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntryType.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +public enum EntryType { + ENTITY, + HINT, + FALSE_POSITIVE, + RECOMMENDATION, + FALSE_RECOMMENDATION, + IMAGE +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/FilteredRedactionLogRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/FilteredRedactionLogRequest.java new file mode 100644 index 000000000..b3b167964 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/FilteredRedactionLogRequest.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +import java.time.OffsetDateTime; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class FilteredRedactionLogRequest { + + private List excludedTypes; + private boolean withManualRedactions; + private boolean includeFalsePositives; + private OffsetDateTime specifiedDate; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/ManualChange.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/ManualChange.java new file mode 100644 index 000000000..d6a25d5bb --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/ManualChange.java @@ -0,0 +1,59 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +import java.time.OffsetDateTime; +import java.util.HashMap; +import java.util.Map; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.BaseAnnotation; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ManualChange { + + private AnnotationStatus annotationStatus; + private ManualRedactionType manualRedactionType; + private OffsetDateTime processedDate; + private OffsetDateTime requestedDate; + private String userId; + private Map propertyChanges = new HashMap<>(); + + + public static ManualChange from(BaseAnnotation baseAnnotation) { + + ManualChange manualChange = new ManualChange(); + manualChange.annotationStatus = baseAnnotation.getStatus(); + manualChange.processedDate = baseAnnotation.getProcessedDate(); + manualChange.requestedDate = baseAnnotation.getRequestDate(); + manualChange.userId = baseAnnotation.getUser(); + return manualChange; + } + + + public boolean isProcessed() { + + return processedDate != null; + } + + + public ManualChange withManualRedactionType(ManualRedactionType manualRedactionType) { + + this.manualRedactionType = manualRedactionType; + return this; + } + + + public ManualChange withChange(String property, String value) { + + this.propertyChanges.put(property, value); + return this; + } + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/ManualRedactionType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/ManualRedactionType.java new file mode 100644 index 000000000..efc9540a4 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/ManualRedactionType.java @@ -0,0 +1,13 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +public enum ManualRedactionType { + ADD_LOCALLY, + ADD_TO_DICTIONARY, + REMOVE_LOCALLY, + REMOVE_FROM_DICTIONARY, + FORCE_REDACT, + FORCE_HINT, + RECATEGORIZE, + LEGAL_BASIS_CHANGE, + RESIZE +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/Position.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/Position.java new file mode 100644 index 000000000..3122d37ee --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/Position.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.FieldDefaults; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE) +public class Position { + + float[] rectangle; // x, y, w, h + int pageNumber; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/imported/ImportedRedaction.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/imported/ImportedRedaction.java new file mode 100644 index 000000000..776997f9f --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/imported/ImportedRedaction.java @@ -0,0 +1,24 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.imported; + +import java.util.ArrayList; +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ImportedRedaction { + + private String id; + + @Builder.Default + private List positions = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/imported/ImportedRedactions.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/imported/ImportedRedactions.java new file mode 100644 index 000000000..eda8a0285 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/imported/ImportedRedactions.java @@ -0,0 +1,21 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.imported; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ImportedRedactions { + + @Builder.Default + private Map> importedRedactions = new HashMap<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileType.java index 8a2e3f5ac..8008340ee 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileType.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileType.java @@ -22,7 +22,9 @@ public enum FileType { DOCUMENT_TEXT(".json"), DOCUMENT_STRUCTURE(".json"), DOCUMENT_POSITION(".json"), - DOCUMENT_PAGES(".json"); + DOCUMENT_PAGES(".json"), + ENTITY_LOG(".json"), + COMPONENT_LOG(".json"); @Getter private final String extension;