Add next/prev navigation
diff --git a/org.apache.sling.graphql.samples.website/src/main/java/org/apache/sling/graphql/samples/website/datafetchers/NavigationDataFetcher.java b/org.apache.sling.graphql.samples.website/src/main/java/org/apache/sling/graphql/samples/website/datafetchers/NavigationDataFetcher.java
index 2879a67..9fe2dd1 100644
--- a/org.apache.sling.graphql.samples.website/src/main/java/org/apache/sling/graphql/samples/website/datafetchers/NavigationDataFetcher.java
+++ b/org.apache.sling.graphql.samples.website/src/main/java/org/apache/sling/graphql/samples/website/datafetchers/NavigationDataFetcher.java
@@ -21,11 +21,13 @@
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.StreamSupport;
import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.graphql.samples.website.models.SlingWrappers;
import graphql.schema.DataFetcher;
@@ -38,6 +40,7 @@
public static final String NAME = "navigation";
public static final String CONTENT_ROOT = "/content/articles";
+ public static final String ARTICLE_RESOURCE_SUPERTYPE = "samples/article";
private final Resource resource;
@@ -55,11 +58,41 @@
}
+ String getNextOrPreviousPath(Resource r, String propertyName, String currentValue, boolean isNext) {
+ String result = null;
+ final String jcrQuery = String.format(
+ "/jcr:root/content/articles//*[%s %s '%s'] order by %s %s",
+ propertyName,
+ isNext ? ">" : "<",
+ currentValue,
+ propertyName,
+ isNext ? "ascending" : "descending"
+ );
+ final Iterator<Resource> it = r.getResourceResolver().findResources(jcrQuery, "xpath");
+ if(it.hasNext()) {
+ result = it.next().getPath();
+ }
+ return result;
+ }
+
+ /** If r is an article, add previous/next navigation based on article filenames */
+ private void maybeAddPrevNext(Map<String, Object> result, Resource r) {
+ final String propName = "filename";
+ if(ARTICLE_RESOURCE_SUPERTYPE.equals(r.getResourceSuperType())) {
+ final String filename = r.adaptTo(ValueMap.class).get(propName, String.class);
+ if(filename != null) {
+ result.put("previous", getNextOrPreviousPath(r, propName, filename, false));
+ result.put("next", getNextOrPreviousPath(r, propName, filename, true));
+ }
+ }
+ }
+
@Override
- public Object get(DataFetchingEnvironment environment) throws Exception {
+ public Object get(DataFetchingEnvironment env) throws Exception {
final Map<String, Object> result = new HashMap<>();
result.put("root", CONTENT_ROOT);
result.put("sections", getSections());
+ maybeAddPrevNext(result, FetcherUtil.getSourceResource(env, resource));
return result;
}
}
\ No newline at end of file
diff --git a/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/article.hbs b/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/article.hbs
index fab9208..e33b48e 100644
--- a/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/article.hbs
+++ b/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/article.hbs
@@ -31,6 +31,13 @@
<a href="{{this.path}}.html">{{this.name}}</a>
</span>
{{/each}}
+ <br/>
+ {{#if data.navigation.previous}}
+ <a href="{{data.navigation.previous}}.html">Previous article</a>
+ {{/if}}
+ {{#if data.navigation.next}}
+ <a href="{{data.navigation.next}}.html">Next article</a>
+ {{/if}}
<hr/>
</div>
diff --git a/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/json.gql b/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/json.gql
index 6c12163..8531cbd 100644
--- a/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/json.gql
+++ b/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/json.gql
@@ -19,6 +19,8 @@
{
navigation {
root
+ previous
+ next
sections {
path
name
diff --git a/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/common/GQLschema.jsp b/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/common/GQLschema.jsp
index 7b909b8..248f71f 100644
--- a/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/common/GQLschema.jsp
+++ b/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/common/GQLschema.jsp
@@ -24,6 +24,8 @@
type Navigation {
root: String
sections: [Section]
+ previous: String
+ next: String
}
type Section {