From f18323ee669cfa0d2fc8e91d127740309038f0dc Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Tue, 13 Jul 2021 16:38:05 +0200
Subject: [PATCH] OZG-409 Make endpoint answer with 'Hello World'

---
 goofy-server/pom.xml                          | 30 ++++----
 .../goofy/kommentar/GraphQLDataFetchers.java  | 69 +++++++++++++++++++
 .../goofy/kommentar/GraphQLProvider.java      | 58 ++++++++++++++++
 .../src/main/resources/schema.graphqls        |  3 +
 4 files changed, 148 insertions(+), 12 deletions(-)
 create mode 100644 goofy-server/src/main/java/de/itvsh/goofy/kommentar/GraphQLDataFetchers.java
 create mode 100644 goofy-server/src/main/java/de/itvsh/goofy/kommentar/GraphQLProvider.java
 create mode 100644 goofy-server/src/main/resources/schema.graphqls

diff --git a/goofy-server/pom.xml b/goofy-server/pom.xml
index 1eae5f8ddd..7131e6c50f 100644
--- a/goofy-server/pom.xml
+++ b/goofy-server/pom.xml
@@ -63,7 +63,7 @@
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-security</artifactId>
 		</dependency>
-		
+
 		<dependency>
 			<groupId>org.keycloak</groupId>
 			<artifactId>keycloak-spring-boot-starter</artifactId>
@@ -73,6 +73,12 @@
 			<artifactId>keycloak-admin-client</artifactId>
 		</dependency>
 
+		<dependency>
+			<groupId>com.graphql-java</groupId>
+			<artifactId>graphql-java-spring-boot-starter-webmvc</artifactId>
+			<version>2.0</version>
+		</dependency>
+
 		<!-- own projects -->
 		<dependency>
 			<groupId>de.itvsh.ozg.pluto</groupId>
@@ -84,7 +90,7 @@
 			<groupId>org.mapstruct</groupId>
 			<artifactId>mapstruct</artifactId>
 		</dependency>
-		
+
 		<!-- aspectJ -->
 		<dependency>
 			<groupId>org.aspectj</groupId>
@@ -205,19 +211,19 @@
 							-Amapstruct.unmappedTargetPolicy=ERROR
 						</compilerArg>
 						<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
-			            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
-			            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
-			            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
-			            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
-			            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
-			            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
-			            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
-			            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
-			            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED</arg>
+						<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
+						<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
+						<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
+						<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
+						<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
+						<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
+						<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
+						<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
+						<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED</arg>
 					</compilerArgs>
 				</configuration>
 			</plugin>
-			
+
 			<plugin>
 				<groupId>org.jacoco</groupId>
 				<artifactId>jacoco-maven-plugin</artifactId>
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/kommentar/GraphQLDataFetchers.java b/goofy-server/src/main/java/de/itvsh/goofy/kommentar/GraphQLDataFetchers.java
new file mode 100644
index 0000000000..dd5fdd257d
--- /dev/null
+++ b/goofy-server/src/main/java/de/itvsh/goofy/kommentar/GraphQLDataFetchers.java
@@ -0,0 +1,69 @@
+package de.itvsh.goofy.kommentar;
+
+import com.google.common.collect.ImmutableMap;
+import graphql.schema.DataFetcher;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class GraphQLDataFetchers {
+
+    private static List<Map<String, String>> books = Arrays.asList(
+            ImmutableMap.of("id", "book-1",
+                    "name", "Harry Potter and the Philosopher's Stone",
+                    "pageCount", "223",
+                    "authorId", "author-1"),
+            ImmutableMap.of("id", "book-2",
+                    "name", "Moby Dick",
+                    "pageCount", "635",
+                    "authorId", "author-2"),
+            ImmutableMap.of("id", "book-3",
+                    "name", "Interview with the vampire",
+                    "pageCount", "371",
+                    "authorId", "author-3")
+    );
+
+    private static List<Map<String, String>> authors = Arrays.asList(
+            ImmutableMap.of("id", "author-1",
+                    "firstName", "Joanne",
+                    "lastName", "Rowling"),
+            ImmutableMap.of("id", "author-2",
+                    "firstName", "Herman",
+                    "lastName", "Melville"),
+            ImmutableMap.of("id", "author-3",
+                    "firstName", "Anne",
+                    "lastName", "Rice")
+    );
+
+    public DataFetcher getBookByIdDataFetcher() {
+        return dataFetchingEnvironment -> {
+            String bookId = dataFetchingEnvironment.getArgument("id");
+            return books
+                    .stream()
+                    .filter(book -> book.get("id").equals(bookId))
+                    .findFirst()
+                    .orElse(null);
+        };
+    }
+
+    public DataFetcher getAuthorDataFetcher() {
+        return dataFetchingEnvironment -> {
+            Map<String,String> book = dataFetchingEnvironment.getSource();
+            String authorId = book.get("authorId");
+            return authors
+                    .stream()
+                    .filter(author -> author.get("id").equals(authorId))
+                    .findFirst()
+                    .orElse(null);
+        };
+    }
+
+    public DataFetcher getGreetingDataFetcher() {
+        return dataFetchingEnvironment -> {
+            return "Hello World";
+        };
+    }
+}
\ No newline at end of file
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/kommentar/GraphQLProvider.java b/goofy-server/src/main/java/de/itvsh/goofy/kommentar/GraphQLProvider.java
new file mode 100644
index 0000000000..887a1c790e
--- /dev/null
+++ b/goofy-server/src/main/java/de/itvsh/goofy/kommentar/GraphQLProvider.java
@@ -0,0 +1,58 @@
+package de.itvsh.goofy.kommentar;
+
+import com.google.common.base.Charsets;
+import com.google.common.io.Resources;
+import graphql.GraphQL;
+import graphql.schema.GraphQLSchema;
+import graphql.schema.idl.RuntimeWiring;
+import graphql.schema.idl.SchemaGenerator;
+import graphql.schema.idl.SchemaParser;
+import graphql.schema.idl.TypeDefinitionRegistry;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.io.IOException;
+import java.net.URL;
+
+import static graphql.schema.idl.TypeRuntimeWiring.newTypeWiring;
+
+@Component
+public class GraphQLProvider {
+
+    private GraphQL graphQL;
+    @Autowired
+    GraphQLDataFetchers graphQLDataFetchers;
+
+    @Bean
+    public GraphQL graphQL() {
+        return graphQL;
+    }
+
+    @PostConstruct
+    public void init() throws IOException {
+        URL url = Resources.getResource("schema.graphqls");
+        String sdl = Resources.toString(url, Charsets.UTF_8);
+        GraphQLSchema graphQLSchema = buildSchema(sdl);
+        this.graphQL = GraphQL.newGraphQL(graphQLSchema).build();
+    }
+
+    private GraphQLSchema buildSchema(String sdl) {
+        TypeDefinitionRegistry typeRegistry = new SchemaParser().parse(sdl);
+        RuntimeWiring runtimeWiring = buildWiring();
+        SchemaGenerator schemaGenerator = new SchemaGenerator();
+        return schemaGenerator.makeExecutableSchema(typeRegistry, runtimeWiring);
+    }
+
+    private RuntimeWiring buildWiring() {
+        return RuntimeWiring.newRuntimeWiring()
+                /*.type(newTypeWiring("Query")
+                        .dataFetcher("bookById", graphQLDataFetchers.getBookByIdDataFetcher()))
+                .type(newTypeWiring("Book")
+                        .dataFetcher("author", graphQLDataFetchers.getAuthorDataFetcher()))*/
+                .type(newTypeWiring("Query")
+                        .dataFetcher("greeting", graphQLDataFetchers.getGreetingDataFetcher()))
+                .build();
+    }
+}
\ No newline at end of file
diff --git a/goofy-server/src/main/resources/schema.graphqls b/goofy-server/src/main/resources/schema.graphqls
new file mode 100644
index 0000000000..8f3f9ebb07
--- /dev/null
+++ b/goofy-server/src/main/resources/schema.graphqls
@@ -0,0 +1,3 @@
+type Query {
+	greeting: String
+}
\ No newline at end of file
-- 
GitLab