diff --git a/docs/antora.yml b/docs/antora.yml new file mode 100644 index 0000000..65bcea5 --- /dev/null +++ b/docs/antora.yml @@ -0,0 +1,3 @@ +name: onecx-help +title: Help Management +version: latest \ No newline at end of file diff --git a/docs/modules/onecx-help-bff/nav.adoc b/docs/modules/onecx-help-bff/nav.adoc new file mode 100644 index 0000000..6f2ca6d --- /dev/null +++ b/docs/modules/onecx-help-bff/nav.adoc @@ -0,0 +1 @@ +* xref:onecx-help-bff:index.adoc[Help Bff] \ No newline at end of file diff --git a/docs/modules/onecx-help-bff/pages/index.adoc b/docs/modules/onecx-help-bff/pages/index.adoc new file mode 100644 index 0000000..b2785de --- /dev/null +++ b/docs/modules/onecx-help-bff/pages/index.adoc @@ -0,0 +1,8 @@ +include::onecx-help-bff-attributes.adoc[opts=optional] + +== onecx-help-bff + +include::docs.adoc[opts=optional] + + +include::onecx-help-bff-docs.adoc[opts=optional] diff --git a/docs/modules/onecx-help-bff/pages/onecx-help-bff-attributes.adoc b/docs/modules/onecx-help-bff/pages/onecx-help-bff-attributes.adoc new file mode 100644 index 0000000..48aa211 --- /dev/null +++ b/docs/modules/onecx-help-bff/pages/onecx-help-bff-attributes.adoc @@ -0,0 +1,5 @@ + +:docker-registry: https://github.com/onecx/onecx-help-bff/pkgs/container/onecx-help-bff +:helm-registry: https://github.com/onecx/onecx-help-bff/pkgs/container/charts%2Fonecx-help-bff +:properties-file: src/main/resources/application.properties +:helm-file: src/main/helm/values.yaml \ No newline at end of file diff --git a/docs/modules/onecx-help-bff/pages/onecx-help-bff-docs.adoc b/docs/modules/onecx-help-bff/pages/onecx-help-bff-docs.adoc new file mode 100644 index 0000000..d969906 --- /dev/null +++ b/docs/modules/onecx-help-bff/pages/onecx-help-bff-docs.adoc @@ -0,0 +1,66 @@ + +include::onecx-help-bff-attributes.adoc[opts=optional] + +=== Default properties + +.{properties-file} +[%collapsible%open] +==== +[source,properties,subs=attributes+] +---- +quarkus.http.auth.permission.health.paths=/q/* +quarkus.http.auth.permission.health.policy=permit +quarkus.http.auth.permission.default.paths=/* +quarkus.http.auth.permission.default.policy=authenticated +onecx.permissions.application-id=${quarkus.application.name} +%prod.quarkus.rest-client.onecx_help_svc.url=http://onecx-help-svc:8080 +%prod.quarkus.oidc-client.client-id=${quarkus.application.name} +org.eclipse.microprofile.rest.client.propagateHeaders=apm-principal-token +quarkus.openapi-generator.codegen.spec.onecx_help_svc_yaml.config-key=onecx_help_svc +quarkus.openapi-generator.codegen.spec.onecx_help_svc_yaml.base-package=gen.org.tkit.onecx.help.client +quarkus.openapi-generator.codegen.spec.onecx_help_svc_yaml.return-response=true +quarkus.openapi-generator.codegen.input-base-dir=target/tmp/openapi +quarkus.openapi-generator.codegen.spec.onecx_help_svc_yaml.additional-api-type-annotations=@org.eclipse.microprofile.rest.client.annotation.RegisterClientHeaders; +quarkus.openapi-generator.codegen.spec.onecx_help_svc_yaml.additional-model-type-annotations=@io.quarkus.runtime.annotations.RegisterForReflection; +---- +==== + +=== Extensions + +include::onecx-help-bff-extensions.adoc[opts=optional] + +=== Container + +{docker-registry}[Docker registry] + + +=== Helm + +{helm-registry}[Helm registry] + +Default values + +.{helm-file} +[source,yaml] +---- +app: + name: bff + image: + repository: "onecx/onecx-help-bff" + operator: + # Permission + permission: + enabled: true + spec: + permissions: + helps: + read: permission on all GET requests and POST search + write: permission on PUT, POST, PATCH requests, where objects are saved or updated + delete: permission on all DELETE requests + keycloak: + client: + enabled: true + password: "my-custom-password" + +---- + diff --git a/docs/modules/onecx-help-bff/pages/onecx-help-bff-extensions.adoc b/docs/modules/onecx-help-bff/pages/onecx-help-bff-extensions.adoc new file mode 100644 index 0000000..2bb1068 --- /dev/null +++ b/docs/modules/onecx-help-bff/pages/onecx-help-bff-extensions.adoc @@ -0,0 +1,145 @@ + +include::onecx-help-bff-attributes.adoc[opts=optional] + +[.extension.table.searchable, cols="50,.^15,.^15,.^20"] +|=== +h| Extensions +h| Documentation +h| Configuration +h| Version + +| quarkus-rest + +| https://quarkus.io/guides/rest[Link] +| https://github.com/quarkusio/quarkusio.github.io/blob/develop/_generated-doc/latest/config/quarkus-rest.adoc[Link] +| 3.9.3 + +| quarkus-smallrye-openapi + +| https://quarkus.io/guides/openapi-swaggerui[Link] +| https://github.com/quarkusio/quarkusio.github.io/blob/develop/_generated-doc/latest/config/quarkus-smallrye-openapi.adoc[Link] +| 3.9.3 + +| quarkus-rest-jackson + +| https://quarkus.io/guides/rest-json[Link] +| +| 3.9.3 + +| quarkus-openapi-generator + +| https://docs.quarkiverse.io/quarkus-openapi-generator/dev/index.html[Link] +| https://github.com/quarkiverse/quarkus-openapi-generator/blob/2.4.1/docs/modules/ROOT/pages/includes/quarkus-openapi-generator.adoc[Link] +| 2.4.1 + +| quarkus-rest-client-reactive-jackson + +| https://quarkus.io/guides/rest-client[Link] +| +| 3.9.3 + +| tkit-quarkus-log-cdi + +| https://1000kit.github.io/tkit-quarkus/current/tkit-quarkus/tkit-quarkus-log-cdi.html[Link] +| https://github.com/1000kit/tkit-quarkus/blob/2.22.0/docs/modules/tkit-quarkus/pages/includes/tkit-quarkus-log-cdi.adoc[Link] +| 2.22.0 + +| tkit-quarkus-log-rs + +| https://1000kit.github.io/tkit-quarkus/current/tkit-quarkus/tkit-quarkus-log-rs.html[Link] +| https://github.com/1000kit/tkit-quarkus/blob/2.22.0/docs/modules/tkit-quarkus/pages/includes/tkit-quarkus-log-rs.adoc[Link] +| 2.22.0 + +| tkit-quarkus-log-json + +| https://1000kit.github.io/tkit-quarkus/current/tkit-quarkus/tkit-quarkus-log-json.html[Link] +| https://github.com/1000kit/tkit-quarkus/blob/2.22.0/docs/modules/tkit-quarkus/pages/includes/tkit-quarkus-log-json.adoc[Link] +| 2.22.0 + +| tkit-quarkus-rest + +| https://1000kit.github.io/tkit-quarkus/current/tkit-quarkus/tkit-quarkus-rest.html[Link] +| https://github.com/1000kit/tkit-quarkus/blob/2.22.0/docs/modules/tkit-quarkus/pages/includes/tkit-quarkus-rest.adoc[Link] +| 2.22.0 + +| tkit-quarkus-rest-context + +| https://1000kit.github.io/tkit-quarkus/current/tkit-quarkus/tkit-quarkus-rest-context.html[Link] +| https://github.com/1000kit/tkit-quarkus/blob/2.22.0/docs/modules/tkit-quarkus/pages/includes/tkit-quarkus-rest-context.adoc[Link] +| 2.22.0 + +| quarkus-hibernate-validator + +| https://quarkus.io/guides/validation[Link] +| https://github.com/quarkusio/quarkusio.github.io/blob/develop/_generated-doc/latest/config/quarkus-hibernate-validator.adoc[Link] +| 3.9.3 + +| quarkus-smallrye-health + +| https://quarkus.io/guides/smallrye-health[Link] +| https://github.com/quarkusio/quarkusio.github.io/blob/develop/_generated-doc/latest/config/quarkus-smallrye-health.adoc[Link] +| 3.9.3 + +| quarkus-opentelemetry + +| https://quarkus.io/guides/opentelemetry[Link] +| https://github.com/quarkusio/quarkusio.github.io/blob/develop/_generated-doc/latest/config/quarkus-opentelemetry.adoc[Link] +| 3.9.3 + +| quarkus-micrometer-registry-prometheus + +| https://quarkus.io/guides/telemetry-micrometer[Link] +| https://github.com/quarkusio/quarkusio.github.io/blob/develop/_generated-doc/latest/config/quarkus-micrometer-registry-prometheus.adoc[Link] +| 3.9.3 + +| quarkus-oidc + +| https://quarkus.io/guides/security-oidc-bearer-token-authentication-tutorial[Link] +| https://github.com/quarkusio/quarkusio.github.io/blob/develop/_generated-doc/latest/config/quarkus-oidc.adoc[Link] +| 3.9.3 + +| quarkus-oidc-client-reactive-filter + +| https://quarkus.io/guides/security-openid-connect-client-reference[Link] +| https://github.com/quarkusio/quarkusio.github.io/blob/develop/_generated-doc/latest/config/quarkus-oidc-client-reactive-filter.adoc[Link] +| 3.9.3 + +| onecx-permissions + +| https://onecx.github.io/docs/onecx-quarkus/current/onecx-quarkus/onecx-permissions.html[Link] +| https://github.com/onecx/onecx-quarkus/blob/0.17.0/docs/modules/onecx-quarkus/pages/includes/onecx-permissions.adoc[Link] +| 0.17.0 + +| tkit-quarkus-security + +| https://1000kit.github.io/tkit-quarkus/current/tkit-quarkus/tkit-quarkus-security.html[Link] +| https://github.com/1000kit/tkit-quarkus/blob/2.22.0/docs/modules/tkit-quarkus/pages/includes/tkit-quarkus-security.adoc[Link] +| 2.22.0 + +| onecx-core + +| https://onecx.github.io/docs/onecx-quarkus/current/onecx-quarkus/onecx-core.html[Link] +| +| 0.17.0 + +| quarkus-arc + +| https://quarkus.io/guides/cdi-reference[Link] +| https://github.com/quarkusio/quarkusio.github.io/blob/develop/_generated-doc/latest/config/quarkus-arc.adoc[Link] +| 3.9.3 + +| quarkus-container-image-docker + +| https://quarkus.io/guides/container-image[Link] +| https://github.com/quarkusio/quarkusio.github.io/blob/develop/_generated-doc/latest/config/quarkus-container-image-docker.adoc[Link] +| 3.9.3 + + +| quarkus-oidc-client + +| +| +| 3.9.3 + + +|=== \ No newline at end of file diff --git a/pom.xml b/pom.xml index cf3494a..4dcdd2c 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.tkit.onecx onecx-quarkus3-parent - 0.37.0 + 0.47.0 onecx-help-bff @@ -15,7 +15,7 @@ io.quarkus - quarkus-resteasy-reactive + quarkus-rest io.quarkus @@ -23,7 +23,7 @@ io.quarkus - quarkus-resteasy-reactive-jackson + quarkus-rest-jackson io.quarkiverse.openapi.generator diff --git a/src/main/java/org/tkit/onecx/help/bff/rs/controller/HelpRestController.java b/src/main/java/org/tkit/onecx/help/bff/rs/controller/HelpRestController.java index 6c50f5d..cab3e06 100644 --- a/src/main/java/org/tkit/onecx/help/bff/rs/controller/HelpRestController.java +++ b/src/main/java/org/tkit/onecx/help/bff/rs/controller/HelpRestController.java @@ -8,6 +8,7 @@ import jakarta.ws.rs.core.Response; import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.jboss.resteasy.reactive.ClientWebApplicationException; import org.jboss.resteasy.reactive.RestResponse; import org.jboss.resteasy.reactive.server.ServerExceptionMapper; import org.tkit.onecx.help.bff.rs.mappers.ExceptionMapper; @@ -104,7 +105,7 @@ public RestResponse constraint(ConstraintViolationExce } @ServerExceptionMapper - public Response restException(WebApplicationException ex) { - return Response.status(ex.getResponse().getStatus()).build(); + public Response restException(ClientWebApplicationException ex) { + return exceptionMapper.clientException(ex); } } diff --git a/src/main/java/org/tkit/onecx/help/bff/rs/mappers/ExceptionMapper.java b/src/main/java/org/tkit/onecx/help/bff/rs/mappers/ExceptionMapper.java index 880a0a3..bff4ec6 100644 --- a/src/main/java/org/tkit/onecx/help/bff/rs/mappers/ExceptionMapper.java +++ b/src/main/java/org/tkit/onecx/help/bff/rs/mappers/ExceptionMapper.java @@ -1,5 +1,7 @@ package org.tkit.onecx.help.bff.rs.mappers; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; + import java.util.List; import java.util.Map; import java.util.Set; @@ -9,6 +11,7 @@ import jakarta.validation.Path; import jakarta.ws.rs.core.Response; +import org.jboss.resteasy.reactive.ClientWebApplicationException; import org.jboss.resteasy.reactive.RestResponse; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -17,6 +20,7 @@ import gen.org.tkit.onecx.help.bff.rs.internal.model.ProblemDetailInvalidParamDTO; import gen.org.tkit.onecx.help.bff.rs.internal.model.ProblemDetailParamDTO; import gen.org.tkit.onecx.help.bff.rs.internal.model.ProblemDetailResponseDTO; +import gen.org.tkit.onecx.permission.model.ProblemDetailResponse; @Mapper(uses = { OffsetDateTimeMapper.class }) public interface ExceptionMapper { @@ -27,6 +31,24 @@ default RestResponse constraint(ConstraintViolationExc return RestResponse.status(Response.Status.BAD_REQUEST, dto); } + default Response clientException(ClientWebApplicationException ex) { + if (ex.getResponse().getStatus() == 500) { + return Response.status(400).build(); + } else { + if (ex.getResponse().getMediaType() != null + && ex.getResponse().getMediaType().toString().equals(APPLICATION_JSON)) { + return Response.status(ex.getResponse().getStatus()) + .entity(map(ex.getResponse().readEntity(ProblemDetailResponse.class))).build(); + } else { + return Response.status(ex.getResponse().getStatus()).build(); + } + } + } + + @Mapping(target = "removeParamsItem", ignore = true) + @Mapping(target = "removeInvalidParamsItem", ignore = true) + ProblemDetailResponseDTO map(ProblemDetailResponse problemDetailResponse); + @Mapping(target = "removeParamsItem", ignore = true) @Mapping(target = "removeInvalidParamsItem", ignore = true) @Mapping(target = "params", ignore = true) diff --git a/src/test/java/org/tkit/onecx/help/bff/rs/HelpRestControllerTest.java b/src/test/java/org/tkit/onecx/help/bff/rs/HelpRestControllerTest.java index 1a8e5df..b980c7c 100644 --- a/src/test/java/org/tkit/onecx/help/bff/rs/HelpRestControllerTest.java +++ b/src/test/java/org/tkit/onecx/help/bff/rs/HelpRestControllerTest.java @@ -254,9 +254,7 @@ void getHelpById_shouldReturnNotFound_whenHelpDoesNotExist() { .withMethod(HttpMethod.GET)) .withPriority(100) .withId(MOCK_ID) - .respond(httpRequest -> response().withStatusCode(Response.Status.NOT_FOUND.getStatusCode()) - .withContentType(MediaType.APPLICATION_JSON) - .withBody(JsonBody.json(Response.status(Response.Status.NOT_FOUND).build()))); + .respond(httpRequest -> response().withStatusCode(Response.Status.NOT_FOUND.getStatusCode())); // bff call var response = given() @@ -267,7 +265,6 @@ void getHelpById_shouldReturnNotFound_whenHelpDoesNotExist() { .get(id) .then() .statusCode(Response.Status.NOT_FOUND.getStatusCode()); - Assertions.assertNotNull(response); }