DM-285: add component log and entity log, deprecate redaction log
* also refactor RedactionLogController
This commit is contained in:
parent
261d69fa52
commit
fa10f64c4d
@ -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<String> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -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<byte[]> 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -102,82 +102,6 @@ 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')")
|
@PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')")
|
||||||
public RedactionLog getFilteredRedactionLog(@PathVariable(DOSSIER_ID) String dossierId,
|
public RedactionLog getFilteredRedactionLog(@PathVariable(DOSSIER_ID) String dossierId,
|
||||||
|
|||||||
@ -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<String> 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);
|
||||||
|
|
||||||
|
}
|
||||||
@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
@ -26,11 +26,6 @@ public interface RedactionLogResource {
|
|||||||
String REDACTION_LOG_PATH = ExternalApi.BASE_PATH + "/redactionLog";
|
String REDACTION_LOG_PATH = ExternalApi.BASE_PATH + "/redactionLog";
|
||||||
String SECTION_GRID_PATH = ExternalApi.BASE_PATH + "/sectionGrid";
|
String SECTION_GRID_PATH = ExternalApi.BASE_PATH + "/sectionGrid";
|
||||||
String SECTION_TEXT_PATH = ExternalApi.BASE_PATH + "/sectionText";
|
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 = "fileId";
|
||||||
String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}";
|
String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}";
|
||||||
@ -39,6 +34,7 @@ public interface RedactionLogResource {
|
|||||||
String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}";
|
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)
|
@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")
|
@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.")})
|
@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);
|
@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)
|
@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")
|
@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.")})
|
@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);
|
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)
|
@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")
|
@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.")})
|
@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);
|
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)
|
@Deprecated(forRemoval = true)
|
||||||
@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);
|
|
||||||
|
|
||||||
|
|
||||||
@PostMapping(value = REDACTION_LOG_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE + "/filtered", produces = MediaType.APPLICATION_JSON_VALUE)
|
@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")
|
@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.")})
|
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The redaction log is not found.")})
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -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<String> 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<EntityLogEntry> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -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.InternalServerErrorException;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
|
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.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.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.RedactionLog;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.imported.ImportedRedactions;
|
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) {
|
public void storeRedactionLog(String dossierId, String fileId, RedactionLog redactionLog) {
|
||||||
|
|
||||||
storageService.storeJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.REDACTION_LOG), 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));
|
return storageService.objectExists(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, origin));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public boolean objectExists(String storageId) {
|
public boolean objectExists(String storageId) {
|
||||||
|
|
||||||
return storageService.objectExists(TenantContext.getTenantId(), storageId);
|
return storageService.objectExists(TenantContext.getTenantId(), storageId);
|
||||||
@ -149,4 +165,17 @@ public class FileManagementStorageService {
|
|||||||
storageService.deleteObject(TenantContext.getTenantId(), storageId);
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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.FileStatusProcessingUpdateService;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService;
|
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.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.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.LayoutParsingFinishedEvent;
|
||||||
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingQueueNames;
|
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingQueueNames;
|
||||||
@ -43,7 +42,7 @@ public class LayoutParsingFinishedMessageReceiver {
|
|||||||
|
|
||||||
fileStatusService.updateLayoutProcessedTime(layoutParsingRequestIdentifierService.parseFileId(response.identifier()));
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
@ -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<ComponentLogEntry> componentLogEntries = new ArrayList<>();
|
||||||
|
|
||||||
|
long dictionaryVersion = -1;
|
||||||
|
long dossierDictionaryVersion = -1;
|
||||||
|
long rulesVersion = -1;
|
||||||
|
|
||||||
|
}
|
||||||
@ -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<ComponentEntityReference> componentEntityReferences;
|
||||||
|
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog;
|
||||||
|
|
||||||
|
public enum ChangeType {
|
||||||
|
ADDED,
|
||||||
|
REMOVED,
|
||||||
|
CHANGED
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog;
|
||||||
|
|
||||||
|
public enum Engine {
|
||||||
|
DICTIONARY,
|
||||||
|
NER,
|
||||||
|
RULE
|
||||||
|
}
|
||||||
@ -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> entityLogEntry = new ArrayList<>();
|
||||||
|
private List<EntityLogLegalBasis> legalBasis = new ArrayList<>();
|
||||||
|
|
||||||
|
private long dictionaryVersion = -1;
|
||||||
|
private long dossierDictionaryVersion = -1;
|
||||||
|
private long rulesVersion = -1;
|
||||||
|
private long legalBasisVersion = -1;
|
||||||
|
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,109 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
@Deprecated // should be replaced with EntryState enum
|
||||||
|
boolean applied;
|
||||||
|
@Deprecated
|
||||||
|
boolean ignored;
|
||||||
|
@Deprecated
|
||||||
|
boolean isHint;
|
||||||
|
@Deprecated
|
||||||
|
boolean isRecommendation;
|
||||||
|
@Deprecated
|
||||||
|
boolean isFalsePositive;
|
||||||
|
|
||||||
|
String section;
|
||||||
|
float[] color;
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
List<Position> positions = new ArrayList<>();
|
||||||
|
int sectionNumber;
|
||||||
|
|
||||||
|
String textBefore;
|
||||||
|
String textAfter;
|
||||||
|
|
||||||
|
int startOffset;
|
||||||
|
int endOffset;
|
||||||
|
|
||||||
|
boolean isImage;
|
||||||
|
boolean imageHasTransparency;
|
||||||
|
|
||||||
|
boolean isDictionaryEntry;
|
||||||
|
boolean isDossierDictionaryEntry;
|
||||||
|
|
||||||
|
boolean excluded;
|
||||||
|
|
||||||
|
String sourceId;
|
||||||
|
|
||||||
|
@EqualsAndHashCode.Exclude
|
||||||
|
@Builder.Default
|
||||||
|
List<Change> changes = new ArrayList<>();
|
||||||
|
|
||||||
|
@EqualsAndHashCode.Exclude
|
||||||
|
@Builder.Default
|
||||||
|
List<ManualChange> manualChanges = new ArrayList<>();
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
Set<Engine> engines = new HashSet<>();
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
Set<String> reference = new HashSet<>();
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
Set<String> 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 <T> Optional<T> last(List<T> list) {
|
||||||
|
|
||||||
|
return list == null || list.isEmpty() ? Optional.empty() : Optional.of(list.get(list.size() - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog;
|
||||||
|
|
||||||
|
public enum EntryState {
|
||||||
|
APPLIED,
|
||||||
|
SKIPPED,
|
||||||
|
IGNORED,
|
||||||
|
REMOVED
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
}
|
||||||
@ -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<String> excludedTypes;
|
||||||
|
private boolean withManualRedactions;
|
||||||
|
private boolean includeFalsePositives;
|
||||||
|
private OffsetDateTime specifiedDate;
|
||||||
|
|
||||||
|
}
|
||||||
@ -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<String, String> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog;
|
||||||
|
|
||||||
|
public class Position {
|
||||||
|
|
||||||
|
float[] rectangle; // x, y, w, h
|
||||||
|
int pageNumber;
|
||||||
|
|
||||||
|
}
|
||||||
@ -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<Position> positions = new ArrayList<>();
|
||||||
|
|
||||||
|
}
|
||||||
@ -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<Integer, List<ImportedRedaction>> importedRedactions = new HashMap<>();
|
||||||
|
|
||||||
|
}
|
||||||
@ -22,7 +22,9 @@ public enum FileType {
|
|||||||
DOCUMENT_TEXT(".json"),
|
DOCUMENT_TEXT(".json"),
|
||||||
DOCUMENT_STRUCTURE(".json"),
|
DOCUMENT_STRUCTURE(".json"),
|
||||||
DOCUMENT_POSITION(".json"),
|
DOCUMENT_POSITION(".json"),
|
||||||
DOCUMENT_PAGES(".json");
|
DOCUMENT_PAGES(".json"),
|
||||||
|
ENTITY_LOG(".json"),
|
||||||
|
COMPONENT_LOG(".json");
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final String extension;
|
private final String extension;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user