From 4453eab3bf72a76ae88e460554d12a2fe41a09af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominique=20Eifl=C3=A4nder?= Date: Wed, 4 Dec 2024 11:07:36 +0100 Subject: [PATCH] RED-9844: Added endpoint for get components with fileIds --- .../controller/ComponentControllerV2.java | 34 ++++++++++++ .../external/model/BulkComponentsRequest.java | 18 +++++++ .../external/resource/ComponentResource.java | 11 ++++ .../src/main/resources/api/documine.yaml | 54 +++++++++++++++++++ .../src/main/resources/application.yaml | 3 ++ 5 files changed, 120 insertions(+) create mode 100644 persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/BulkComponentsRequest.java diff --git a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/ComponentControllerV2.java b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/ComponentControllerV2.java index 050659512..f16507e2e 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/ComponentControllerV2.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/ComponentControllerV2.java @@ -16,8 +16,10 @@ 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.persistence.service.v1.external.api.impl.controller.DossierController; import com.iqser.red.persistence.service.v1.external.api.impl.controller.StatusController; import com.iqser.red.persistence.service.v2.external.api.impl.mapper.ComponentMapper; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles; import com.iqser.red.service.persistence.management.v1.processor.service.ComponentLogService; @@ -29,6 +31,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.users.m import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v2.api.external.model.BulkComponentsRequest; import com.iqser.red.service.persistence.service.v2.api.external.model.Component; import com.iqser.red.service.persistence.service.v2.api.external.model.ComponentOverrideList; import com.iqser.red.service.persistence.service.v2.api.external.model.FileComponents; @@ -37,6 +40,7 @@ import com.iqser.red.service.persistence.service.v2.api.external.resource.Compon import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.knecon.fforesight.tenantcommons.TenantProvider; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; @@ -51,11 +55,16 @@ public class ComponentControllerV2 implements ComponentResource { private final UserService userService; private final StatusController statusController; private final FileStatusService fileStatusService; + private final DossierController dossierController; private final DossierTemplatePersistenceService dossierTemplatePersistenceService; private final CurrentApplicationTypeProvider currentApplicationTypeProvider; private final ComponentMapper componentMapper = ComponentMapper.INSTANCE; + @Value("${documine.components.filesLimit:100}") + private int documineComponentsFilesLimit = 100; + + @Override public FileComponents getComponents(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, @PathVariable(DOSSIER_ID_PARAM) String dossierId, @@ -92,12 +101,37 @@ public class ComponentControllerV2 implements ComponentResource { checkApplicationType(); dossierTemplatePersistenceService.checkDossierTemplateExistsOrElseThrow404(dossierTemplateId); var dossierFiles = statusController.getDossierStatus(dossierId); + + if(dossierFiles.size() > documineComponentsFilesLimit) { + throw new BadRequestException(String.format("The dossier you requested components for contains %s files this is above the limit of %s files for this endpoint, please use the POST %s", dossierFiles.size(), documineComponentsFilesLimit, FILE_PATH + BULK_COMPONENTS_PATH)); + } + return new FileComponentsList(dossierFiles.stream() .map(file -> getComponents(dossierTemplateId, dossierId, file.getFileId(), includeDetails)) .toList()); } + @Override + public FileComponentsList getComponentsForFiles(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, + @PathVariable(DOSSIER_ID_PARAM) String dossierId, + @RequestParam(name = INCLUDE_DETAILS_PARAM, defaultValue = "false", required = false) boolean includeDetails, + @RequestBody BulkComponentsRequest bulkComponentsRequest){ + + if(bulkComponentsRequest.getFileIds().size() > documineComponentsFilesLimit) { + throw new BadRequestException(String.format("You requested components for %s files this is above the limit of %s files for this endpoint, lower the fileIds in the request", bulkComponentsRequest.getFileIds().size(), documineComponentsFilesLimit)); + } + + checkApplicationType(); + dossierTemplatePersistenceService.checkDossierTemplateExistsOrElseThrow404(dossierTemplateId); + dossierController.getDossier(dossierId, false, false); + return new FileComponentsList(bulkComponentsRequest.getFileIds().stream() + .map(fileId -> getComponents(dossierTemplateId, dossierId, fileId, includeDetails)) + .toList()); + + } + + @Override @PreAuthorize("hasAuthority('" + GET_RSS + "')") public void addOverride(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, diff --git a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/BulkComponentsRequest.java b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/BulkComponentsRequest.java new file mode 100644 index 000000000..7e38b5b7d --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/BulkComponentsRequest.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.service.v2.api.external.model; + +import java.util.ArrayList; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BulkComponentsRequest { + + private List fileIds = new ArrayList<>(); +} diff --git a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/ComponentResource.java b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/ComponentResource.java index 2df5d5ff7..b08a6862f 100644 --- a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/ComponentResource.java +++ b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/ComponentResource.java @@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; +import com.iqser.red.service.persistence.service.v2.api.external.model.BulkComponentsRequest; import com.iqser.red.service.persistence.service.v2.api.external.model.Component; import com.iqser.red.service.persistence.service.v2.api.external.model.ComponentOverrideList; import com.iqser.red.service.persistence.service.v2.api.external.model.FileComponents; @@ -74,6 +75,16 @@ public interface ComponentResource { @Parameter(name = INCLUDE_DETAILS_PARAM, description = INCLUDE_DETAILS_DESCRIPTION) @RequestParam(name = INCLUDE_DETAILS_PARAM, defaultValue = "false", required = false) boolean includeDetails); + @PostMapping(value = FILE_PATH + + BULK_COMPONENTS_PATH, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Returns the components for all files of a dossier", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + FileComponentsList getComponentsForFiles(@Parameter(name = DOSSIER_TEMPLATE_ID_PARAM, description = "The identifier of the dossier template that is used for the dossier.", required = true) @PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, + @Parameter(name = DOSSIER_ID_PARAM, description = "The identifier of the dossier that contains the file.", required = true) @PathVariable(DOSSIER_ID_PARAM) String dossierId, + @Parameter(name = INCLUDE_DETAILS_PARAM, description = INCLUDE_DETAILS_DESCRIPTION) @RequestParam(name = INCLUDE_DETAILS_PARAM, defaultValue = "false", required = false) boolean includeDetails, + @RequestBody BulkComponentsRequest bulkComponentsRequest); + + @ResponseBody @ResponseStatus(value = HttpStatus.NO_CONTENT) @PostMapping(value = FILE_PATH + FILE_ID_PATH_VARIABLE + OVERRIDES_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) diff --git a/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/documine.yaml b/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/documine.yaml index d0ddd5c4b..38b9fba25 100644 --- a/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/documine.yaml +++ b/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/documine.yaml @@ -1626,6 +1626,50 @@ paths: $ref: '#/components/responses/429' "500": $ref: '#/components/responses/500' + post: + operationId: getComponentsForFiles + tags: + - 4. Components + summary: Returns the FileComponents for requested files + description: | + This endpoint fetches components for the requested files by its ids. Like individual file components, + these represent various aspects, metadata or content of the files. Entity and component rules define these components based on the file's + content. They can give a *structured view* on a document's text. + + To include detailed component information, set the `includeDetails` query parameter to `true`. + parameters: + - $ref: '#/components/parameters/dossierTemplateId' + - $ref: '#/components/parameters/dossierId' + - $ref: '#/components/parameters/includeComponentDetails' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BulkComponentsRequest' + required: true + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/FileComponentsList' + application/xml: + schema: + $ref: '#/components/schemas/FileComponentsList' + description: | + Successfully fetched components for all files in the dossier. + "400": + $ref: '#/components/responses/400' + "401": + $ref: '#/components/responses/401' + "403": + $ref: '#/components/responses/403' + "404": + $ref: '#/components/responses/404-dossier' + "429": + $ref: '#/components/responses/429' + "500": + $ref: '#/components/responses/500' /api/downloads: get: operationId: getDownloadStatusList @@ -2773,6 +2817,16 @@ components: entityRuleId: DEF.13.37 type: another_entity_type page: 456 + BulkComponentsRequest: + type: object + description: Request payload to get components for multiple files. + properties: + fileIds: + type: array + description: A list with unique identifiers of the files for which components should be retrieved. + items: + type: string + description: The unique identifier of a file. DossierStatusDefinition: type: object description: | diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yaml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yaml index 967a19f9e..cd5b15108 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yaml +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yaml @@ -9,6 +9,9 @@ tenant-user-management-service.url: "http://tenant-user-management-service:8080/ logging.pattern.level: "%5p [${spring.application.name},%X{traceId:-},%X{spanId:-}]" +documine: + components: + filesLimit: 150 logging.type: ${LOGGING_TYPE:CONSOLE} kubernetes.namespace: ${NAMESPACE:default}