From 4c4e1ced91bb1610e51ac833d25a59fd4eb39747 Mon Sep 17 00:00:00 2001 From: Kresnadi Budisantoso Date: Wed, 29 Nov 2023 22:32:24 +0100 Subject: [PATCH 1/4] RED-7962 Changed response type to "text/plain; charset=utf-8" - Fixup of previous commit - Use "text/plain; charset=utf-8" instead of "application/octet-stream" as response type for rule files as they are actually text files. --- .../controller/DossierTemplateControllerV2.java | 4 ++-- .../external/resource/DossierTemplateResource.java | 13 +++++++------ .../src/main/resources/api/openapi.yaml | 6 ++---- 3 files changed, 11 insertions(+), 12 deletions(-) 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/DossierTemplateControllerV2.java b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java index 532cae8b5..eaf465c56 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java @@ -198,14 +198,14 @@ public class DossierTemplateControllerV2 implements DossierTemplateResource { } - private ResponseEntity downloadRules(String dossierTemplateId, RuleFileType ruleFileType) { + private ResponseEntity downloadRules(String dossierTemplateId, RuleFileType ruleFileType) { var ruleEntity = rulesPersistenceService.getRules(dossierTemplateId, ruleFileType); var data = ruleEntity.getValue().getBytes(StandardCharsets.UTF_8); HttpHeaders httpHeaders = new HttpHeaders(); - httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); + httpHeaders.setContentType(MediaType.TEXT_PLAIN); httpHeaders.add("Content-Disposition", "attachment" + "; filename*=utf-8''" + StringEncodingUtils.urlEncode(ruleFileType.name().toLowerCase() + RULES_DOWNLOAD_FILE_NAME_SUFFIX)); diff --git a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/DossierTemplateResource.java b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/DossierTemplateResource.java index c509262db..6643e29b8 100644 --- a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/DossierTemplateResource.java +++ b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/DossierTemplateResource.java @@ -7,6 +7,7 @@ import com.iqser.red.service.persistence.service.v2.api.external.model.RulesVali import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; @@ -76,10 +77,10 @@ public interface DossierTemplateResource { @ResponseStatus(value = HttpStatus.OK) @Operation(summary = "Returns file containing the currently used entity rules.") @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "404", description = "The DossierTemplate is not found.") + @ApiResponse(responseCode = "200", description = "OK", content = @Content(mediaType = MediaType.TEXT_PLAIN_VALUE + "; charset=utf-8")), + @ApiResponse(responseCode = "404", description = "The DossierTemplate is not found.", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE)) }) - @GetMapping(value = PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + ENTITY_RULES_PATH, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) + @GetMapping(value = PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + ENTITY_RULES_PATH) ResponseEntity downloadEntityRules(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId); @@ -100,10 +101,10 @@ public interface DossierTemplateResource { @ResponseStatus(value = HttpStatus.OK) @Operation(summary = "Returns file containing the currently used component rules.") @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "404", description = "The DossierTemplate is not found.") + @ApiResponse(responseCode = "200", description = "OK", content = @Content(mediaType = MediaType.TEXT_PLAIN_VALUE + "; charset=utf-8")), + @ApiResponse(responseCode = "404", description = "The DossierTemplate is not found.", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE)) }) - @GetMapping(value = PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + COMPONENT_RULES_PATH, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) + @GetMapping(value = PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + COMPONENT_RULES_PATH) ResponseEntity downloadComponentRules(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId); @Operation(summary = "Get the file attribute definitions of a DossierTemplate.", description = "None") diff --git a/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/openapi.yaml b/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/openapi.yaml index 2101e8000..4ccd4fb90 100644 --- a/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/openapi.yaml +++ b/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/openapi.yaml @@ -129,10 +129,9 @@ paths: type: string example: attachment; filename*=utf-8''entity-rules.drl content: - application/octet-stream: + text/plain; charset=utf-8: schema: type: string - format: binary description: | Successfully downloaded the requested rules file. "400": @@ -211,10 +210,9 @@ paths: type: string example: attachment; filename*=utf-8''component-rules.drl content: - application/octet-stream: + text/plain; charset=utf-8: schema: type: string - format: binary description: | Successfully downloaded the requested rules file. "400": -- 2.47.2 From 9d84085d462cb54da3ed9c93025da50db4f5e6ea Mon Sep 17 00:00:00 2001 From: Kresnadi Budisantoso Date: Wed, 29 Nov 2023 23:16:31 +0100 Subject: [PATCH 2/4] Hotfix: Download rule file endpoint (old version) ignores the file type --- .../v1/external/api/impl/controller/RulesController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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/RulesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java index 918aa61e0..e67e90e6c 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java @@ -141,7 +141,7 @@ public class RulesController implements RulesResource { public ResponseEntity downloadFile(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @PathVariable(RULE_FILE_TYPE_PARAMETER_NAME) RuleFileType ruleFileType) { - byte[] data = download(dossierTemplateId).getRules().getBytes(StandardCharsets.UTF_8); + byte[] data = download(dossierTemplateId, ruleFileType).getRules().getBytes(StandardCharsets.UTF_8); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.TEXT_PLAIN); -- 2.47.2 From b9d473677c95cde3190d86249b6d8489a40c3eaf Mon Sep 17 00:00:00 2001 From: Kresnadi Budisantoso Date: Wed, 29 Nov 2023 23:25:46 +0100 Subject: [PATCH 3/4] Hotfix: Download file name not properly recognized by the browser as the response header is malformed --- .../v1/external/api/impl/controller/RulesController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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/RulesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java index e67e90e6c..15d585ac0 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java @@ -145,7 +145,7 @@ public class RulesController implements RulesResource { HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.TEXT_PLAIN); - httpHeaders.add("Content-Disposition", "attachment; filename*=utf-8\"" + ruleFileType.name() + "_" + DOWNLOAD_FILE_NAME + "\""); + httpHeaders.add("Content-Disposition", "attachment; filename*=utf-8''" + ruleFileType.name() + "_" + DOWNLOAD_FILE_NAME); InputStream is = new ByteArrayInputStream(data); return new ResponseEntity<>(new InputStreamResource(is), httpHeaders, HttpStatus.OK); -- 2.47.2 From 1de62109938ddc71477b830e1577e681672f7984 Mon Sep 17 00:00:00 2001 From: Kresnadi Budisantoso Date: Wed, 29 Nov 2023 23:58:40 +0100 Subject: [PATCH 4/4] RED-962 Fixup response type & error 500 --- .../v2/api/external/resource/DossierTemplateResource.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/DossierTemplateResource.java b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/DossierTemplateResource.java index 6643e29b8..91daba819 100644 --- a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/DossierTemplateResource.java +++ b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/DossierTemplateResource.java @@ -77,8 +77,8 @@ public interface DossierTemplateResource { @ResponseStatus(value = HttpStatus.OK) @Operation(summary = "Returns file containing the currently used entity rules.") @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK", content = @Content(mediaType = MediaType.TEXT_PLAIN_VALUE + "; charset=utf-8")), - @ApiResponse(responseCode = "404", description = "The DossierTemplate is not found.", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE)) + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "The DossierTemplate is not found.") }) @GetMapping(value = PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + ENTITY_RULES_PATH) ResponseEntity downloadEntityRules(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId); @@ -101,8 +101,8 @@ public interface DossierTemplateResource { @ResponseStatus(value = HttpStatus.OK) @Operation(summary = "Returns file containing the currently used component rules.") @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK", content = @Content(mediaType = MediaType.TEXT_PLAIN_VALUE + "; charset=utf-8")), - @ApiResponse(responseCode = "404", description = "The DossierTemplate is not found.", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE)) + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "The DossierTemplate is not found.") }) @GetMapping(value = PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + COMPONENT_RULES_PATH) ResponseEntity downloadComponentRules(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId); -- 2.47.2