Преглед на файлове

feat(update): add graphql api

remy.liu преди 4 години
родител
ревизия
3935768ea8

+ 1 - 1
base-module/pom.xml

@@ -9,7 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>common-module</artifactId>
+    <artifactId>base-module</artifactId>
 
     <properties>
         <maven.compiler.source>8</maven.compiler.source>

+ 1 - 1
base-module/src/main/java/com/remy/common/entity/BaseEntity.java

@@ -1,4 +1,4 @@
-package com.remy.common.entity.po;
+package com.remy.common.entity;
 
 import lombok.Data;
 import lombok.NoArgsConstructor;

+ 0 - 8
common-module/pom.xml

@@ -16,12 +16,4 @@
         <maven.compiler.target>8</maven.compiler.target>
     </properties>
 
-
-    <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-jpa</artifactId>
-        </dependency>
-    </dependencies>
-
 </project>

+ 0 - 40
common-module/src/main/java/com/remy/common/entity/po/BaseEntity.java

@@ -1,40 +0,0 @@
-package com.remy.common.entity;
-
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.SuperBuilder;
-
-import javax.persistence.*;
-import java.io.Serializable;
-import java.util.Date;
-
-@Data
-@SuperBuilder
-@NoArgsConstructor
-@MappedSuperclass
-public class BaseEntity implements Serializable {
-
-    private static final long serialVersionUID = 1412134936159005266L;
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.AUTO)
-    private Long id;
-
-    @Column(name = "create_time")
-    private Date createTime;
-
-    @Column(name = "update_time")
-    private Date updateTime;
-
-    @PrePersist
-    public void prePersist() {
-        this.setCreateTime(new Date());
-        this.setUpdateTime(new Date());
-    }
-
-    @PreUpdate
-    public void preUpdate() {
-        this.setUpdateTime(new Date());
-    }
-
-}

+ 18 - 0
common-module/src/main/java/com/remy/common/module/BaseDTO.java

@@ -0,0 +1,18 @@
+package com.remy.common.module;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import java.util.Date;
+
+@Data
+@SuperBuilder
+@NoArgsConstructor
+public class BaseDTO {
+    private Long id;
+
+    private Date createTime;
+
+    private Date updateTime;
+}

+ 29 - 0
common-module/src/main/java/com/remy/common/module/GoodsDTO.java

@@ -0,0 +1,29 @@
+package com.remy.common.module;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import java.math.BigDecimal;
+
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class GoodsDTO extends BaseDTO {
+
+    private String serialNo;
+
+    private String name;
+
+    private String description;
+
+    private String img;
+
+    private String detail;
+
+    private BigDecimal price;
+
+    private Integer itemCount;
+}

+ 1 - 1
goods-service/pom.xml

@@ -27,7 +27,7 @@
         </dependency>
         <dependency>
             <groupId>com.remy</groupId>
-            <artifactId>common-module</artifactId>
+            <artifactId>base-module</artifactId>
         </dependency>
     </dependencies>
 

+ 8 - 4
graphql-api/pom.xml

@@ -29,10 +29,10 @@
             <groupId>com.graphql-java-kickstart</groupId>
             <artifactId>playground-spring-boot-starter</artifactId>
         </dependency>
-        <dependency>
-            <groupId>com.graphql-java-kickstart</groupId>
-            <artifactId>voyager-spring-boot-starter</artifactId>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.graphql-java-kickstart</groupId>-->
+<!--            <artifactId>voyager-spring-boot-starter</artifactId>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>com.graphql-java-kickstart</groupId>
             <artifactId>graphql-java-tools</artifactId>
@@ -41,6 +41,10 @@
             <groupId>com.graphql-java-kickstart</groupId>
             <artifactId>graphql-spring-boot-starter-test</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.remy</groupId>
+            <artifactId>common-module</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 0 - 21
graphql-api/src/main/java/com/remy/graphql/GraphqlApplication.java

@@ -1,32 +1,11 @@
 package com.remy.graphql;
 
-import graphql.Scalars;
-import graphql.schema.*;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
 
 @SpringBootApplication
 public class GraphqlApplication {
-
     public static void main(String[] args) {
         SpringApplication.run(GraphqlApplication.class, args);
     }
-
-    @Bean
-    GraphQLSchema schema() {
-        DataFetcher<String> test = env -> "response";
-        return GraphQLSchema.newSchema()
-                .query(
-                        GraphQLObjectType.newObject()
-                                .name("query")
-                                .field(field -> field.name("test").type(Scalars.GraphQLString))
-                                .build())
-                .codeRegistry(
-                        GraphQLCodeRegistry.newCodeRegistry()
-                                .dataFetcher(FieldCoordinates.coordinates("query", "test"), test)
-                                .build())
-                .build();
-    }
 }

+ 15 - 0
graphql-api/src/main/java/com/remy/graphql/evn/RestAPIEnv.java

@@ -0,0 +1,15 @@
+package com.remy.graphql.evn;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConfigurationProperties(prefix = "rest.api")
+@Getter
+@Setter
+public class RestAPIEnv {
+
+    private String goodsEndpoint;
+}

+ 42 - 0
graphql-api/src/main/java/com/remy/graphql/helper/BeanHelper.java

@@ -0,0 +1,42 @@
+package com.remy.graphql.helper;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class BeanHelper {
+
+    private static ObjectMapper mapper;
+
+    static {
+        mapper = new ObjectMapper();
+        mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+        mapper.configure(MapperFeature.REQUIRE_SETTERS_FOR_GETTERS, true);
+    }
+
+    public static String toJSON(Object object) {
+        try {
+            String jsonString = mapper.writeValueAsString(object);
+            return jsonString;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static <T> T fromJSON(String json, Class<T> clazz) {
+        try {
+            return (T) mapper.readValue(json, clazz);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static <T> T fromJSON(String json, TypeReference<T> clazz) {
+        try {
+            return (T) mapper.readValue(json, clazz);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

+ 25 - 0
graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/GoodsMutation.java

@@ -0,0 +1,25 @@
+package com.remy.graphql.resolvers.mutation;
+
+import com.remy.common.module.GoodsDTO;
+import com.remy.graphql.evn.RestAPIEnv;
+import com.remy.graphql.helper.BeanHelper;
+import graphql.kickstart.tools.GraphQLMutationResolver;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.concurrent.CompletableFuture;
+
+@Component
+public class GoodsMutation implements GraphQLMutationResolver {
+
+    @Autowired
+    RestAPIEnv apiEnv;
+
+    CompletableFuture<GoodsDTO> createGoods(GoodsDTO goodsDTO) {
+        return CompletableFuture.supplyAsync(() ->
+                new RestTemplate().postForObject(apiEnv.getGoodsEndpoint(),
+                        goodsDTO, GoodsDTO.class));
+    }
+
+}

+ 22 - 0
graphql-api/src/main/java/com/remy/graphql/resolvers/query/GoodsQuery.java

@@ -0,0 +1,22 @@
+package com.remy.graphql.resolvers.query;
+
+import com.remy.common.module.GoodsDTO;
+import com.remy.graphql.evn.RestAPIEnv;
+import graphql.kickstart.tools.GraphQLQueryResolver;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.concurrent.CompletableFuture;
+
+@Component
+public class GoodsQuery implements GraphQLQueryResolver {
+
+    @Autowired
+    RestAPIEnv apiEnv;
+
+    public CompletableFuture<GoodsDTO> goods(String serialNo) {
+        return CompletableFuture.supplyAsync(() ->
+                new RestTemplate().getForObject(apiEnv.getGoodsEndpoint() + serialNo, GoodsDTO.class));
+    }
+}

+ 12 - 36
graphql-api/src/main/resources/application.yml

@@ -1,40 +1,16 @@
+spring:
+  application:
+    name: graphql-api
+server:
+  port: 8080
 graphql:
   servlet:
-    # Sets if GraphQL servlet should be created and exposed. If not specified defaults to "true".
-    enabled: true
-    # Sets the path where GraphQL servlet will be exposed. If not specified defaults to "/graphql"
-    mapping: /graphql
-    cors-enabled: true
-    cors:
-      allowed-origins: '*'
-      allowed-methods: GET, HEAD, POST
-    # if you want to @ExceptionHandler annotation for custom GraphQLErrors
     exception-handlers-enabled: true
-    context-setting: PER_REQUEST_WITH_INSTRUMENTATION
-    # Sets if asynchronous operations are supported for GraphQL requests. If not specified defaults to true.
-    async-mode-enabled: true
-
+  graphiql:
+    enabled: true
+  playground:
+    enabled: true
 
-graphiql:
-  mapping: /graphiql
-  endpoint:
-    graphql: /graphql
-    subscriptions: /subscriptions
-  subscriptions:
-    timeout: 30
-    reconnect: false
-  basePath: /
-  enabled: true
-  pageTitle: GraphiQL
-  cdn:
-    enabled: false
-    version: latest
-  props:
-    resources:
-      query: query.graphql
-      defaultQuery: defaultQuery.graphql
-      variables: variables.graphql
-    variables:
-      editorTheme: "solarized light"
-  headers:
-    Authorization: "Bearer <your-token>"
+rest:
+  api:
+    goods-endpoint: http://localhost:8081/goods/

+ 15 - 2
graphql-api/src/main/resources/goods.graphqls

@@ -1,5 +1,9 @@
 type Query{
-    goods(id: ID!): Goods!
+    goods(serialNo: String!): Goods!
+}
+
+type Mutation{
+    createGoods(input:GoodsInput): Goods!
 }
 
 type Goods {
@@ -9,6 +13,15 @@ type Goods {
     price: Float!
     itemCount: Int!
     img: String!
-    desc: String
+    description: String
+    detail: String
+}
+
+input GoodsInput{
+    name: String!
+    price: Float!
+    itemCount: Int!
+    img: String!
+    description: String
     detail: String
 }

+ 1 - 1
order-service/pom.xml

@@ -27,7 +27,7 @@
         </dependency>
         <dependency>
             <groupId>com.remy</groupId>
-            <artifactId>common-module</artifactId>
+            <artifactId>base-module</artifactId>
         </dependency>
     </dependencies>
 

+ 0 - 1
order-service/src/main/java/com/remy/order/entity/Order.java

@@ -19,5 +19,4 @@ public class Order extends BaseEntity {
 
     private String goodsSerialNo;
 
-
 }

+ 7 - 6
pom.xml

@@ -7,8 +7,9 @@
         <module>user-service</module>
         <module>order-service</module>
         <module>goods-service</module>
-        <module>common-module</module>
+        <module>base-module</module>
         <module>graphql-api</module>
+        <module>common-module</module>
     </modules>
     <groupId>com.remy</groupId>
     <artifactId>graphql-demo</artifactId>
@@ -26,11 +27,6 @@
     </properties>
 
     <dependencies>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-freemarker</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
@@ -51,6 +47,11 @@
 
     <dependencyManagement>
         <dependencies>
+            <dependency>
+                <groupId>com.remy</groupId>
+                <artifactId>base-module</artifactId>
+                <version>0.0.1-SNAPSHOT</version>
+            </dependency>
             <dependency>
                 <groupId>com.remy</groupId>
                 <artifactId>common-module</artifactId>

+ 1 - 1
user-service/pom.xml

@@ -27,7 +27,7 @@
         </dependency>
         <dependency>
             <groupId>com.remy</groupId>
-            <artifactId>common-module</artifactId>
+            <artifactId>base-module</artifactId>
         </dependency>
     </dependencies>