README.md 5.7 KB
Newer Older
1 2
# GraphQL Codegen Gradle plugin #

3
![Build](https://github.com/kobylynskyi/graphql-java-codegen/workflows/Build/badge.svg)
B
Bogdan Kobylynskyi 已提交
4
[![Gradle Plugins](https://img.shields.io/maven-metadata/v/https/plugins.gradle.org/m2/io/github/kobylynskyi/graphql-java-codegen-gradle-plugin/maven-metadata.xml.svg?label=gradle)](https://plugins.gradle.org/plugin/io.github.kobylynskyi.graphql.codegen)
5 6
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

7 8 9 10 11 12 13 14 15 16
* [Description](#description)
* [Plugin Setup](#plugin-setup)
* [Plugin Options](#plugin-options)
* [Sample Plugin Configuration](#sample-plugin-configuration)
* [Examples](#examples)
  * [GraphQL **server** code generation](#graphql-server-code-generation)
  * [GraphQL **client** code generation](#graphql-client-code-generation)
* [Different configurations for graphql schemas](#different-configurations-for-graphql-schemas)
* [Convert generated Java classes to Kotlin classes](#convert-generated-java-classes-to-kotlin-classes)

17 18 19 20 21 22

### Description

This Gradle plugin is able to generate the following classes based on your GraphQL schema:
* Interfaces for GraphQL queries, mutations and subscriptions
* Interfaces for GraphQL unions
23 24 25 26 27
* POJO classes for GraphQL types/inputs
* Enum classes for GraphQL enums
* Interface Resolvers for GraphQL type fields
* Client Request classes for GraphQL queries, mutations and subscriptions

28 29 30 31 32

### Plugin Setup

```groovy
plugins {
33
  id "io.github.kobylynskyi.graphql.codegen" version "2.1.0"
34 35 36 37 38 39 40 41 42 43 44 45 46
}
```

Using [legacy plugin application](https://docs.gradle.org/current/userguide/plugins.html#sec:old_plugin_application):

```groovy
buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
47
    classpath "io.github.kobylynskyi.graphql.codegen:graphql-codegen-gradle-plugin:2.1.0"
48 49 50 51 52 53
  }
}

apply plugin: "io.github.kobylynskyi.graphql.codegen"
```

54 55
### Plugin Options

56
Please refer to [Codegen Options](../../docs/codegen-options.md)
57 58

### Sample Plugin Configuration
59 60 61 62 63 64 65 66

#### build.gradle:

```groovy
graphqlCodegen {
    graphqlSchemaPaths = [
        "$projectDir/src/main/resources/schema.graphqls".toString()
    ]
67
    outputDir = new File("$buildDir/generated")
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
    packageName = "com.example.graphql.model"
    customTypesMapping = [
        DateTime: "org.joda.time.DateTime",
        Price.amount: "java.math.BigDecimal"
    ]
    customAnnotationsMapping = [
        DateTime: "com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.EpochMillisScalarDeserializer.class"
    ]
    modelNameSuffix = "TO"
}

// Automatically generate GraphQL code on project build:
compileJava.dependsOn 'graphqlCodegen'

// Add generated sources to your project source sets:
sourceSets.main.java.srcDir "$buildDir/generated"
```

86 87
You can also refer to build.gradle files in example projects: [example-client/build.gradle](example-client/build.gradle), [example-server/build.gradle](example-server/build.gradle)

88 89
#### build.gradle.kts:

90 91 92 93
```kotlin
tasks.named<GraphQLCodegenGradleTask>("graphqlCodegen") {
    graphqlSchemaPaths = listOf("$projectDir/src/main/resources/graphql/schema.graphqls")
    outputDir = File("$buildDir/generated")
94 95 96 97 98 99 100
    packageName = "com.example.graphql.model"
    customTypesMapping = mutableMapOf(Pair("EpochMillis", "java.time.LocalDateTime"))
    customAnnotationsMapping = mutableMapOf(Pair("EpochMillis", "com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.EpochMillisScalarDeserializer.class"))
}

// Automatically generate GraphQL code on project build:
sourceSets {
101
    getByName("main").java.srcDirs("$buildDir/generated")
102 103 104 105 106 107 108 109 110
}

// Add generated sources to your project source sets:
val check: DefaultTask by tasks
val graphqlCodegen: DefaultTask by tasks
check.dependsOn(graphqlCodegen)    
```


111 112
### Examples

113 114 115
#### GraphQL **server** code generation

[example-server](example-server):
116 117
  * [Plugin configuration in build.gradle](example-server/build.gradle)
  * [GraphQL Resolver classes that implement generated interfaces](example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers)
118 119 120 121

#### GraphQL **client** code generation 

[example-client](example-client):
122 123 124 125 126 127
  * [Plugin configuration in build.gradle](example-client/build.gradle)
  * [Building GraphQL request and parsing response using Spring RestTemplate](example-client/src/main/java/io/github/kobylynskyi/order/external/ProductServiceGraphQLClient.java)
  * [Building GraphQL request and parsing response using RestAssured](example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java)


### Different configurations for graphql schemas
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144

If you want to have different configuration for different `.graphqls` files (e.g.: different javaPackage, outputDir, etc.), then you will need to create separate gradle tasks for each set of schemas. E.g.:

```groovy
task graphqlCodegenService1(type: GraphqlCodegenGradleTask) {
    graphqlSchemaPaths = ["$projectDir/src/main/resources/schema1.graphqls".toString()]
    outputDir = new File("$buildDir/generated/example1")
}

task graphqlCodegenService2(type: GraphqlCodegenGradleTask) {
    graphqlSchemaPaths = ["$projectDir/src/main/resources/schema2.graphqls".toString()]
    outputDir = new File("$buildDir/generated/example2")
}
```

Later on you can call each task separately or together:

145 146 147
* `gradle clean graphqlCodegenService1 build`
* `gradle clean graphqlCodegenService2 build`
* `gradle clean graphqlCodegenService1 graphqlCodegenService2 build`
148 149 150 151


### Convert generated Java classes to Kotlin classes

152 153
1. Navigate in IntelliJ IDEA to the `./build/generated/graphql/` folder and press `Cmd+Alt+Shift+K`
2. Access generated classes as normal Kotlin classes.
154 155 156 157 158 159


### Inspired by

[swagger-codegen](https://github.com/swagger-api/swagger-codegen)