Skip to content

Commit bcd047b

Browse files
authored
[generator] support returning GraphQL ID scalar from functions (#669)
Our current logic was not checking whether function return type was annotated with `@GraphQLID` annotation so it was not possible to return `ID` scalar type. Resolves #668
1 parent 5eb137e commit bcd047b

File tree

4 files changed

+28
-3
lines changed

4 files changed

+28
-3
lines changed

docs/writing-schemas/scalars.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ data class Person(
3636
val name: String
3737
)
3838

39-
fun createPerson(@GraphQLID id: String) = Person(id, "Jane Doe")
39+
fun locatePerson(@GraphQLID id: String) = Person(id, "Jane Doe")
40+
41+
@GraphQLID
42+
fun generateRandomId() = UUID.randomUUID().toString()
4043
```
4144

4245
This would produce the following schema:
@@ -46,8 +49,10 @@ schema {
4649
query: Query
4750
}
4851

52+
4953
type Query {
50-
createPerson(id: ID!): Person!
54+
locatePerson(id: ID!): Person!
55+
generateRandomId: ID!
5156
}
5257

5358
type Person {

examples/spring/src/main/kotlin/com/expediagroup/graphql/examples/query/ScalarQuery.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ class ScalarQuery : Query {
3636
fun printUuids(uuids: List<UUID>) = "You sent $uuids"
3737

3838
fun findPersonById(@GraphQLID id: String) = Person(id, "Nelson")
39+
40+
@GraphQLDescription("generates random GraphQL ID")
41+
@GraphQLID
42+
fun generateRandomId() = UUID.randomUUID().toString()
3943
}
4044

4145
@Component

graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/types/generateFunction.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.expediagroup.graphql.generator.extensions.getDeprecationReason
2222
import com.expediagroup.graphql.generator.extensions.getFunctionName
2323
import com.expediagroup.graphql.generator.extensions.getGraphQLDescription
2424
import com.expediagroup.graphql.generator.extensions.getValidArguments
25+
import com.expediagroup.graphql.generator.extensions.isGraphQLID
2526
import com.expediagroup.graphql.generator.extensions.safeCast
2627
import com.expediagroup.graphql.generator.types.utils.getWrappedReturnType
2728
import graphql.schema.FieldCoordinates
@@ -50,7 +51,7 @@ internal fun generateFunction(generator: SchemaGenerator, fn: KFunction<*>, pare
5051

5152
val typeFromHooks = generator.config.hooks.willResolveMonad(fn.returnType)
5253
val returnType = getWrappedReturnType(typeFromHooks)
53-
val graphQLOutputType = generateGraphQLType(generator, returnType).safeCast<GraphQLOutputType>()
54+
val graphQLOutputType = generateGraphQLType(generator, returnType, annotatedAsID = fn.isGraphQLID()).safeCast<GraphQLOutputType>()
5455
val graphQLType = builder.type(graphQLOutputType).build()
5556
val coordinates = FieldCoordinates.coordinates(parentName, functionName)
5657

graphql-kotlin-schema-generator/src/test/kotlin/com/expediagroup/graphql/generator/types/GenerateFunctionTest.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ package com.expediagroup.graphql.generator.types
1818

1919
import com.expediagroup.graphql.annotations.GraphQLDescription
2020
import com.expediagroup.graphql.annotations.GraphQLDirective
21+
import com.expediagroup.graphql.annotations.GraphQLID
2122
import com.expediagroup.graphql.annotations.GraphQLIgnore
2223
import com.expediagroup.graphql.annotations.GraphQLName
2324
import com.expediagroup.graphql.exceptions.TypeNotSupportedException
2425
import com.expediagroup.graphql.execution.FunctionDataFetcher
2526
import com.expediagroup.graphql.execution.GraphQLContext
2627
import graphql.ExceptionWhileDataFetching
28+
import graphql.Scalars
2729
import graphql.Scalars.GraphQLInt
2830
import graphql.Scalars.GraphQLString
2931
import graphql.execution.DataFetcherResult
@@ -104,6 +106,9 @@ internal class GenerateFunctionTest : TypeTestHelper() {
104106
val dataFetcherResult = DataFetcherResult.newResult<String>().data("Hello").build()
105107
return CompletableFuture.completedFuture(dataFetcherResult)
106108
}
109+
110+
@GraphQLID
111+
fun randomId(): String = UUID.randomUUID().toString()
107112
}
108113

109114
@Test
@@ -292,4 +297,14 @@ internal class GenerateFunctionTest : TypeTestHelper() {
292297
assertTrue(implResult.type is GraphQLNonNull)
293298
assertEquals(kInterfaceResult.type, implResult.type)
294299
}
300+
301+
@Test
302+
fun `function can return GraphQL ID scalar`() {
303+
val kFunction = Happy::randomId
304+
val result = generateFunction(generator, kFunction, "Query", target = null, abstract = false)
305+
306+
assertEquals("randomId", result.name)
307+
val returnType = GraphQLTypeUtil.unwrapAll(result.type)
308+
assertEquals(Scalars.GraphQLID, returnType)
309+
}
295310
}

0 commit comments

Comments
 (0)