Skip to content
This repository was archived by the owner on Dec 19, 2023. It is now read-only.

Commit 2e38056

Browse files
committed
Introducing ConfigurationProperties
1 parent 423f52c commit 2e38056

File tree

8 files changed

+95
-57
lines changed

8 files changed

+95
-57
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ voyager:
455455
endpoint: /graphql
456456
cdn:
457457
enabled: false
458-
version: 1.0.0-rc.31
458+
version: latest
459459
pageTitle: Voyager
460460
displayOptions:
461461
skipRelay: true

voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/ReactiveVoyagerAutoConfiguration.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.springframework.beans.factory.annotation.Value;
44
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
55
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
6+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
67
import org.springframework.context.annotation.Bean;
78
import org.springframework.context.annotation.Configuration;
89
import org.springframework.core.io.ClassPathResource;
@@ -16,11 +17,9 @@
1617
@Configuration
1718
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
1819
@ConditionalOnProperty(value = "voyager.enabled", havingValue = "true", matchIfMissing = true)
20+
@EnableConfigurationProperties(VoyagerPropertiesConfiguration.class)
1921
public class ReactiveVoyagerAutoConfiguration {
2022

21-
@Value("${voyager.mapping:/voyager}")
22-
private String voyagerPath;
23-
2423
@Bean
2524
ReactiveVoyagerController voyagerController() {
2625
return new ReactiveVoyagerController();
@@ -35,7 +34,7 @@ public RouterFunction<ServerResponse> voyagerStaticFilesRouter() {
3534
}
3635

3736
@Bean
38-
VoyagerIndexHtmlTemplate voyagerIndexHtmlTemplate() {
39-
return new VoyagerIndexHtmlTemplate();
37+
VoyagerIndexHtmlTemplate voyagerIndexHtmlTemplate(final VoyagerPropertiesConfiguration voyagerPropertiesConfiguration) {
38+
return new VoyagerIndexHtmlTemplate(voyagerPropertiesConfiguration);
4039
}
4140
}

voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/ReactiveVoyagerController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.IOException;
44
import java.util.Map;
5+
import lombok.RequiredArgsConstructor;
56
import org.springframework.beans.factory.annotation.Autowired;
67
import org.springframework.http.MediaType;
78
import org.springframework.http.ResponseEntity;
@@ -13,6 +14,7 @@
1314
* @author Max David Günther
1415
*/
1516
@Controller
17+
@RequiredArgsConstructor
1618
public class ReactiveVoyagerController {
1719

1820
@Autowired

voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/VoyagerAutoConfiguration.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
44
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
5+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
56
import org.springframework.context.annotation.Bean;
67
import org.springframework.context.annotation.Configuration;
78

@@ -11,6 +12,7 @@
1112
@Configuration
1213
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
1314
@ConditionalOnProperty(value = "voyager.enabled", havingValue = "true", matchIfMissing = true)
15+
@EnableConfigurationProperties(VoyagerPropertiesConfiguration.class)
1416
public class VoyagerAutoConfiguration {
1517

1618
@Bean
@@ -19,7 +21,7 @@ VoyagerController voyagerController() {
1921
}
2022

2123
@Bean
22-
VoyagerIndexHtmlTemplate voyagerIndexHtmlTemplate() {
23-
return new VoyagerIndexHtmlTemplate();
24+
VoyagerIndexHtmlTemplate voyagerIndexHtmlTemplate(final VoyagerPropertiesConfiguration voyagerPropertiesConfiguration) {
25+
return new VoyagerIndexHtmlTemplate(voyagerPropertiesConfiguration);
2426
}
2527
}

voyager-spring-boot-autoconfigure/src/main/java/graphql/kickstart/voyager/boot/VoyagerIndexHtmlTemplate.java

Lines changed: 20 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,70 +4,40 @@
44
import java.nio.charset.Charset;
55
import java.util.HashMap;
66
import java.util.Map;
7+
import lombok.RequiredArgsConstructor;
78
import org.apache.commons.lang3.StringUtils;
89
import org.apache.commons.text.StringSubstitutor;
910
import org.springframework.beans.factory.annotation.Value;
11+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
1012
import org.springframework.core.io.ClassPathResource;
1113
import org.springframework.util.StreamUtils;
1214
import org.springframework.web.bind.annotation.RequestParam;
1315

1416
/**
1517
* @author Guilherme Blanco
1618
*/
19+
@RequiredArgsConstructor
1720
public class VoyagerIndexHtmlTemplate {
1821

1922
private static final String CDNJS_CLOUDFLARE_COM_AJAX_LIBS = "//cdnjs.cloudflare.com/ajax/libs/";
2023
private static final String CDN_JSDELIVR_NET_NPM = "//cdn.jsdelivr.net/npm/";
2124
private static final String VOYAGER = "graphql-voyager";
2225
private static final String FAVICON_APIS_GURU = "//apis.guru/graphql-voyager/icons/favicon-16x16.png";
2326

24-
@Value("${voyager.endpoint:/graphql}")
25-
private String graphqlEndpoint;
26-
27-
@Value("${voyager.pageTitle:Voyager}")
28-
private String pageTitle;
29-
30-
@Value("${voyager.basePath:/}")
31-
private String basePath;
32-
33-
@Value("${voyager.cdn.enabled:false}")
34-
private boolean voyagerCdnEnabled;
35-
36-
@Value("${voyager.cdn.version:1.0.0-rc.31}")
37-
private String voyagerCdnVersion;
38-
39-
@Value("${voyager.displayOptions.skipRelay:true}")
40-
private boolean voyagerDisplayOptionsSkipRelay;
41-
42-
@Value("${voyager.displayOptions.skipDeprecated:true}")
43-
private boolean voyagerDisplayOptionsSkipDeprecated;
44-
45-
@Value("${voyager.displayOptions.rootType:Query}")
46-
private String voyagerDisplayOptionsRootType;
47-
48-
@Value("${voyager.displayOptions.sortByAlphabet:false}")
49-
private boolean voyagerDisplayOptionsSortByAlphabet;
50-
51-
@Value("${voyager.displayOptions.showLeafFields:true}")
52-
private boolean voyagerDisplayOptionsShowLeafFields;
53-
54-
@Value("${voyager.displayOptions.hideRoot:false}")
55-
private boolean voyagerDisplayOptionsHideRoot;
56-
57-
@Value("${voyager.hideDocs:false}")
58-
private boolean voyagerHideDocs;
59-
60-
@Value("${voyager.hideSettings:false}")
61-
private boolean voyagerHideSettings;
27+
private final VoyagerPropertiesConfiguration voyagerConfiguration;
6228

6329
public String fillIndexTemplate(String contextPath, Map<String, String> params)
6430
throws IOException {
6531
String template = StreamUtils
6632
.copyToString(new ClassPathResource("voyager.html").getInputStream(),
6733
Charset.defaultCharset());
34+
35+
String basePath = voyagerConfiguration.getBasePath();
36+
String voyagerCdnVersion = voyagerConfiguration.getCdn().getVersion();
37+
6838
Map<String, String> replacements = new HashMap<>();
6939
replacements.put("graphqlEndpoint", constructGraphQlEndpoint(contextPath, params));
70-
replacements.put("pageTitle", pageTitle);
40+
replacements.put("pageTitle", voyagerConfiguration.getPageTitle());
7141
replacements
7242
.put("pageFavicon", getResourceUrl(basePath, "favicon.ico", FAVICON_APIS_GURU));
7343
replacements.put("es6PromiseJsUrl", getResourceUrl(basePath, "es6-promise.auto.min.js",
@@ -85,14 +55,15 @@ public String fillIndexTemplate(String contextPath, Map<String, String> params)
8555
replacements.put("voyagerWorkerJsUrl", getResourceUrl(basePath, "voyager.worker.js",
8656
joinJsDelivrPath(voyagerCdnVersion, "dist/voyager.worker.min.js")));
8757
replacements.put("contextPath", contextPath);
88-
replacements.put("voyagerDisplayOptionsSkipRelay", Boolean.toString(voyagerDisplayOptionsSkipRelay));
89-
replacements.put("voyagerDisplayOptionsSkipDeprecated", Boolean.toString(voyagerDisplayOptionsSkipDeprecated));
90-
replacements.put("voyagerDisplayOptionsRootType", voyagerDisplayOptionsRootType);
91-
replacements.put("voyagerDisplayOptionsSortByAlphabet", Boolean.toString(voyagerDisplayOptionsSortByAlphabet));
92-
replacements.put("voyagerDisplayOptionsShowLeafFields", Boolean.toString(voyagerDisplayOptionsShowLeafFields));
93-
replacements.put("voyagerDisplayOptionsHideRoot", Boolean.toString(voyagerDisplayOptionsHideRoot));
94-
replacements.put("voyagerHideDocs", Boolean.toString(voyagerHideDocs));
95-
replacements.put("voyagerHideSettings", Boolean.toString(voyagerHideSettings));
58+
replacements.put("voyagerDisplayOptionsSkipRelay", Boolean.toString(voyagerConfiguration.getDisplayOptions().isSkipRelay()));
59+
replacements.put("voyagerDisplayOptionsSkipDeprecated", Boolean.toString(voyagerConfiguration.getDisplayOptions().isSkipDeprecated()));
60+
replacements.put("voyagerDisplayOptionsRootType", voyagerConfiguration.getDisplayOptions().getRootType());
61+
replacements.put("voyagerDisplayOptionsSortByAlphabet", Boolean.toString(
62+
voyagerConfiguration.getDisplayOptions().isSortByAlphabet()));
63+
replacements.put("voyagerDisplayOptionsShowLeafFields", Boolean.toString(voyagerConfiguration.getDisplayOptions().isShowLeafFields()));
64+
replacements.put("voyagerDisplayOptionsHideRoot", Boolean.toString(voyagerConfiguration.getDisplayOptions().isHideRoot()));
65+
replacements.put("voyagerHideDocs", Boolean.toString(voyagerConfiguration.isHideDocs()));
66+
replacements.put("voyagerHideSettings", Boolean.toString(voyagerConfiguration.isHideSettings()));
9667

9768

9869

@@ -101,7 +72,7 @@ public String fillIndexTemplate(String contextPath, Map<String, String> params)
10172

10273
private String constructGraphQlEndpoint(String contextPath,
10374
@RequestParam Map<String, String> params) {
104-
String endpoint = graphqlEndpoint;
75+
String endpoint = voyagerConfiguration.getEndpoint();
10576
for (Map.Entry<String, String> param : params.entrySet()) {
10677
endpoint = endpoint.replaceAll("\\{" + param.getKey() + "}", param.getValue());
10778
}
@@ -112,7 +83,7 @@ private String constructGraphQlEndpoint(String contextPath,
11283
}
11384

11485
private String getResourceUrl(String staticBasePath, String staticFileName, String cdnUrl) {
115-
if (voyagerCdnEnabled && StringUtils.isNotBlank(cdnUrl)) {
86+
if (voyagerConfiguration.getCdn().isEnabled() && StringUtils.isNotBlank(cdnUrl)) {
11687
return cdnUrl;
11788
}
11889
return joinStaticPath(staticBasePath, staticFileName);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package graphql.kickstart.voyager.boot;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
import graphql.kickstart.voyager.boot.properties.VoyagerCdn;
5+
import graphql.kickstart.voyager.boot.properties.VoyagerDisplayOptions;
6+
import lombok.Data;
7+
import org.springframework.boot.context.properties.ConfigurationProperties;
8+
import org.springframework.boot.context.properties.NestedConfigurationProperty;
9+
import org.springframework.validation.annotation.Validated;
10+
11+
12+
@Data
13+
@ConfigurationProperties(prefix = "voyager")
14+
@Validated
15+
public class VoyagerPropertiesConfiguration {
16+
17+
private String endpoint = "/graphql";
18+
19+
private String pageTitle = "Voyager";
20+
21+
private String basePath = "/";
22+
23+
@NestedConfigurationProperty
24+
@JsonIgnore
25+
private VoyagerCdn cdn = new VoyagerCdn();
26+
27+
@NestedConfigurationProperty
28+
@JsonIgnore
29+
private VoyagerDisplayOptions displayOptions = new VoyagerDisplayOptions();
30+
31+
@JsonIgnore
32+
private boolean hideDocs;
33+
34+
@JsonIgnore
35+
private boolean hideSettings;
36+
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package graphql.kickstart.voyager.boot.properties;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class VoyagerCdn {
7+
8+
private boolean enabled;
9+
private String version = "latest";
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package graphql.kickstart.voyager.boot.properties;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import lombok.Data;
5+
6+
@Data
7+
@JsonInclude(JsonInclude.Include.NON_NULL)
8+
public class VoyagerDisplayOptions {
9+
10+
private boolean skipRelay = true;
11+
private boolean skipDeprecated = true;
12+
private String rootType = "Query";
13+
private boolean sortByAlphabet = false;
14+
private boolean showLeafFields = true;
15+
private boolean hideRoot = false;
16+
17+
}

0 commit comments

Comments
 (0)