From c96aded201a7bfdb0fb3e481b5b3701b19fc43b0 Mon Sep 17 00:00:00 2001 From: "Stanislav.Melnichuk" Date: Mon, 18 May 2020 11:01:41 +0300 Subject: [PATCH 1/2] Add graphQL endpoint template resolve as in graphiql controller. --- .../boot/ReactiveVoyagerController.java | 6 ++++-- .../voyager/boot/VoyagerController.java | 7 +++++-- .../boot/VoyagerIndexHtmlTemplate.java | 20 +++++++++++++++---- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/ReactiveVoyagerController.java b/voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/ReactiveVoyagerController.java index 05a002ac..54062399 100644 --- a/voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/ReactiveVoyagerController.java +++ b/voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/ReactiveVoyagerController.java @@ -5,8 +5,10 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import java.io.IOException; +import java.util.Map; /** * @author Max David Günther @@ -17,9 +19,9 @@ public class ReactiveVoyagerController { private VoyagerIndexHtmlTemplate indexTemplate; @GetMapping(path = "${voyager.mapping:/voyager}") - public ResponseEntity voyager() throws IOException { + public ResponseEntity voyager(@PathVariable Map params) throws IOException { // no context path in spring-webflux - String indexHtmlContent = indexTemplate.fillIndexTemplate(""); + String indexHtmlContent = indexTemplate.fillIndexTemplate("", params); return ResponseEntity.ok() .contentType(MediaType.valueOf("text/html; charset=UTF-8")) .body(indexHtmlContent); diff --git a/voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/VoyagerController.java b/voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/VoyagerController.java index 11e40ace..e7e4282d 100644 --- a/voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/VoyagerController.java +++ b/voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/VoyagerController.java @@ -4,10 +4,12 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import java.io.IOException; +import java.util.Map; /** * @author Max David Günther @@ -18,9 +20,10 @@ public class VoyagerController { private VoyagerIndexHtmlTemplate indexTemplate; @RequestMapping(value = "${voyager.mapping:/voyager}") - public ResponseEntity voyager(HttpServletRequest request) throws IOException { + public ResponseEntity voyager(HttpServletRequest request, + @PathVariable Map params) throws IOException { String contextPath = request.getContextPath(); - String indexHtmlContent = indexTemplate.fillIndexTemplate(contextPath); + String indexHtmlContent = indexTemplate.fillIndexTemplate(contextPath, params); return ResponseEntity.ok() .contentType(MediaType.valueOf("text/html; charset=UTF-8")) .body(indexHtmlContent); diff --git a/voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/VoyagerIndexHtmlTemplate.java b/voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/VoyagerIndexHtmlTemplate.java index 877bb6d0..3f0a27c4 100644 --- a/voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/VoyagerIndexHtmlTemplate.java +++ b/voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/VoyagerIndexHtmlTemplate.java @@ -1,10 +1,11 @@ package graphql.kickstart.voyager.boot; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.text.StrSubstitutor; +import org.apache.commons.text.StringSubstitutor; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ClassPathResource; import org.springframework.util.StreamUtils; +import org.springframework.web.bind.annotation.RequestParam; import java.io.IOException; import java.nio.charset.Charset; @@ -36,10 +37,10 @@ public class VoyagerIndexHtmlTemplate { @Value("${voyager.cdn.version:1.0.0-rc.26}") private String voyagerCdnVersion; - public String fillIndexTemplate(String contextPath) throws IOException { + public String fillIndexTemplate(String contextPath, Map params) throws IOException { String template = StreamUtils.copyToString(new ClassPathResource("voyager.html").getInputStream(), Charset.defaultCharset()); Map replacements = new HashMap<>(); - replacements.put("graphqlEndpoint", contextPath + graphqlEndpoint); + replacements.put("graphqlEndpoint", constructGraphQlEndpoint(contextPath, params)); replacements.put("pageTitle", pageTitle); replacements.put("pageFavicon", getResourceUrl(staticBasePath, "favicon.ico", FAVICON_APIS_GURU)); replacements.put("es6PromiseJsUrl", getResourceUrl(staticBasePath, "es6-promise.auto.min.js", @@ -58,7 +59,18 @@ public String fillIndexTemplate(String contextPath) throws IOException { joinJsDelivrPath(VOYAGER, voyagerCdnVersion, "dist/voyager.worker.min.js"))); replacements.put("contextPath", contextPath); - return StrSubstitutor.replace(template, replacements); + return StringSubstitutor.replace(template, replacements); + } + + private String constructGraphQlEndpoint(String contextPath, @RequestParam Map params) { + String endpoint = graphqlEndpoint; + for (Map.Entry param : params.entrySet()) { + endpoint = endpoint.replaceAll("\\{" + param.getKey() + "}", param.getValue()); + } + if (StringUtils.isNotBlank(contextPath) && !endpoint.startsWith(contextPath)) { + return contextPath + endpoint; + } + return endpoint; } private String getResourceUrl(String staticBasePath, String staticFileName, String cdnUrl) { From 94e63af24f507e453ce9a3c9c23800bced4faf16 Mon Sep 17 00:00:00 2001 From: Michiel Oliemans Date: Fri, 13 Nov 2020 16:10:44 +0100 Subject: [PATCH 2/2] Update README.md Force recheck of PR