From d35b05c106a80cfc164ef9afe5f0a7c21572b2b7 Mon Sep 17 00:00:00 2001 From: Bernardo Gomez Palacio Date: Wed, 27 Apr 2022 14:42:13 -0700 Subject: [PATCH] Recover the DgsContext as the, now deprecated, context for backwards compatibility --- .../dgs/client/WebClientGraphQLClient.kt | 8 ++++-- .../dgs/autoconfig/DgsAutoConfiguration.kt | 26 ++++++++--------- .../netflix/graphql/dgs/context/DgsContext.kt | 28 +++++++++++++------ .../dgs/internal/BaseDgsQueryExecutor.kt | 1 + .../DefaultDgsGraphQLContextBuilder.kt | 4 +-- 5 files changed, 39 insertions(+), 28 deletions(-) diff --git a/graphql-dgs-client/src/main/kotlin/com/netflix/graphql/dgs/client/WebClientGraphQLClient.kt b/graphql-dgs-client/src/main/kotlin/com/netflix/graphql/dgs/client/WebClientGraphQLClient.kt index db5285af0b..b3f60e95cf 100644 --- a/graphql-dgs-client/src/main/kotlin/com/netflix/graphql/dgs/client/WebClientGraphQLClient.kt +++ b/graphql-dgs-client/src/main/kotlin/com/netflix/graphql/dgs/client/WebClientGraphQLClient.kt @@ -29,9 +29,13 @@ import java.util.function.Consumer * A WebClient instance configured for the graphql endpoint (at least an url) must be provided. * * Example: - * WebClientGraphQLClient webClientGraphQLClient = new WebClientGraphQLClient(WebClient.create("http://localhost:8080/graphql")); - * GraphQLResponse message = webClientGraphQLClient.reactiveExecuteQuery("{hello}").map(r -> r.extractValue("hello")); + * ```java + * WebClientGraphQLClient webClientGraphQLClient = + * new WebClientGraphQLClient(WebClient.create("http://localhost:8080/graphql")); + * GraphQLResponse message = webClientGraphQLClient.reactiveExecuteQuery("{hello}") + * .map(r -> r.extractValue("hello")); * message.subscribe(); + * ``` */ class WebClientGraphQLClient( private val webclient: WebClient, diff --git a/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt b/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt index 94a7429119..46f85dbebe 100644 --- a/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt +++ b/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt @@ -63,9 +63,7 @@ import kotlin.streams.toList @Configuration @EnableConfigurationProperties(value = [DgsConfigurationProperties::class, DgsIntrospectionConfigurationProperties::class]) @ImportAutoConfiguration(classes = [JacksonAutoConfiguration::class]) -open class DgsAutoConfiguration( - private val configProps: DgsConfigurationProperties -) { +open class DgsAutoConfiguration(private val configProps: DgsConfigurationProperties) { companion object { const val AUTO_CONF_PREFIX = "dgs.graphql" @@ -163,17 +161,17 @@ open class DgsAutoConfiguration( defaultDataFetcherFactory: Optional> = Optional.empty() ): DgsSchemaProvider { return DgsSchemaProvider( - applicationContext, - federationResolver, - existingTypeDefinitionFactory, - mockProviders, - configProps.schemaLocations, - dataFetcherResultProcessors, - dataFetcherExceptionHandler, - cookieValueResolver, - inputObjectMapper.orElse(DefaultInputObjectMapper()), - entityFetcherRegistry, - defaultDataFetcherFactory + applicationContext = applicationContext, + federationResolver = federationResolver, + existingTypeDefinitionRegistry = existingTypeDefinitionFactory, + mockProviders = mockProviders, + schemaLocations = configProps.schemaLocations, + dataFetcherResultProcessors = dataFetcherResultProcessors, + dataFetcherExceptionHandler = dataFetcherExceptionHandler, + cookieValueResolver = cookieValueResolver, + inputObjectMapper = inputObjectMapper.orElse(DefaultInputObjectMapper()), + entityFetcherRegistry = entityFetcherRegistry, + defaultDataFetcherFactory = defaultDataFetcherFactory ) } diff --git a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/context/DgsContext.kt b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/context/DgsContext.kt index 410a21d93d..f18e70ab52 100644 --- a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/context/DgsContext.kt +++ b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/context/DgsContext.kt @@ -17,6 +17,7 @@ package com.netflix.graphql.dgs.context import com.netflix.graphql.dgs.internal.DgsRequestData +import graphql.ExecutionInput import graphql.GraphQLContext import graphql.schema.DataFetchingEnvironment import org.dataloader.BatchLoaderEnvironment @@ -28,22 +29,31 @@ import java.util.function.Consumer */ open class DgsContext(val customContext: Any? = null, val requestData: DgsRequestData?) : Consumer { - companion object { + private enum class GraphQLContextKey { DGS_CONTEXT_KEY } - private const val GRAPHQL_CONTEXT_NAMESPACE_KEY = "netflix.graphql.dgs" - private const val CONTEXT_KEY = "$GRAPHQL_CONTEXT_NAMESPACE_KEY.context" + companion object { + @JvmStatic + fun from(graphQLContext: GraphQLContext): DgsContext { + return graphQLContext[GraphQLContextKey.DGS_CONTEXT_KEY] + } @JvmStatic fun from(dfe: DataFetchingEnvironment): DgsContext { - return dfe.graphQlContext[CONTEXT_KEY] + return from(dfe.graphQlContext) + } + + @JvmStatic + fun from(ei: ExecutionInput): DgsContext { + return from(ei.graphQLContext) } @JvmStatic - fun getCustomContext(dgsContext: Any): T { + fun getCustomContext(context: Any): T { @Suppress("UNCHECKED_CAST") - return when (dgsContext) { - is DgsContext -> dgsContext.customContext as T - else -> throw RuntimeException("The context object passed to getCustomContext is not a DgsContext. It is a ${dgsContext::class.java.name} instead.") + return when (context) { + is DgsContext -> context.customContext as T + is GraphQLContext -> getCustomContext(from(context)) + else -> throw RuntimeException("The context object passed to getCustomContext is not a DgsContext. It is a ${context::class.java.name} instead.") } } @@ -73,6 +83,6 @@ open class DgsContext(val customContext: Any? = null, val requestData: DgsReques } override fun accept(contextBuilder: GraphQLContext.Builder) { - contextBuilder.put(CONTEXT_KEY, this) + contextBuilder.put(GraphQLContextKey.DGS_CONTEXT_KEY, this) } } diff --git a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/BaseDgsQueryExecutor.kt b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/BaseDgsQueryExecutor.kt index d9953307cd..d0b48c55b8 100644 --- a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/BaseDgsQueryExecutor.kt +++ b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/BaseDgsQueryExecutor.kt @@ -107,6 +107,7 @@ object BaseDgsQueryExecutor { .operationName(operationName) .variables(variables) .dataLoaderRegistry(dataLoaderRegistry) + .context(dgsContext) .graphQLContext(dgsContext) .extensions(extensions.orEmpty()) diff --git a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DefaultDgsGraphQLContextBuilder.kt b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DefaultDgsGraphQLContextBuilder.kt index 0624a6a840..bc2ee23ffa 100644 --- a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DefaultDgsGraphQLContextBuilder.kt +++ b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DefaultDgsGraphQLContextBuilder.kt @@ -23,7 +23,6 @@ import com.netflix.graphql.dgs.internal.utils.TimeTracer import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.http.HttpHeaders -import org.springframework.http.server.reactive.ServerHttpRequest import org.springframework.web.context.request.WebRequest import java.util.* @@ -77,8 +76,7 @@ interface DgsRequestData { /** * @param extensions Optional map of extensions - useful for customized GraphQL interactions between for example a gateway and dgs. * @param headers Http Headers - * @param webRequest Spring [WebRequest]. This will only be available when deployed in a WebMVC (Servlet based) environment. See [serverRequest] for the WebFlux version. - * @param serverRequest Spring reactive [ServerHttpRequest]. This will only be available when deployed in a WebFlux (non-Servlet) environment. See [webRequest] for the WebMVC version. + * @param webRequest Spring [WebRequest]. This will only be available when deployed in a WebMVC (Servlet based) environment. */ data class DgsWebMvcRequestData( override val extensions: Map? = null,