From e0546e38498e0c944a6c798753e71ae2aea2afe9 Mon Sep 17 00:00:00 2001 From: Bernardo Gomez Palacio Date: Mon, 7 Nov 2022 17:21:15 -0800 Subject: [PATCH] Have the ability to turn off the BigDecimal and BigInteger extended scalars. This commit enables developers to turn off the BigDecimal and/or BigInteger Extended Scalars. This is done via the * dgs.graphql.extensions.scalars.numbers.bigdecimal.enabled * dgs.graphql.extensions.scalars.numbers.biginteger.enabled --- .../DgsExtendedScalarsAutoConfiguration.kt | 74 ++++++++++++++++++- ...itional-spring-configuration-metadata.json | 12 ++- ...gsExtendedScalarsAutoConfigurationTests.kt | 32 ++++++++ 3 files changed, 114 insertions(+), 4 deletions(-) diff --git a/graphql-dgs-extended-scalars/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsExtendedScalarsAutoConfiguration.kt b/graphql-dgs-extended-scalars/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsExtendedScalarsAutoConfiguration.kt index 600002c630..5fd9d0435d 100644 --- a/graphql-dgs-extended-scalars/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsExtendedScalarsAutoConfiguration.kt +++ b/graphql-dgs-extended-scalars/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsExtendedScalarsAutoConfiguration.kt @@ -21,10 +21,13 @@ import com.netflix.graphql.dgs.DgsRuntimeWiring import graphql.scalars.ExtendedScalars import graphql.schema.GraphQLScalarType import graphql.schema.idl.RuntimeWiring +import org.springframework.boot.autoconfigure.condition.AllNestedConditions import org.springframework.boot.autoconfigure.condition.ConditionalOnClass import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Conditional import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.ConfigurationCondition @ConditionalOnClass(graphql.scalars.ExtendedScalars::class) @ConditionalOnProperty( @@ -108,13 +111,78 @@ open class DgsExtendedScalarsAutoConfiguration { // Others ExtendedScalars.GraphQLLong, ExtendedScalars.GraphQLShort, - ExtendedScalars.GraphQLByte, - ExtendedScalars.GraphQLBigDecimal, - ExtendedScalars.GraphQLBigInteger + ExtendedScalars.GraphQLByte ) } } } + + @Conditional(OnBigDecimalAndNumbers::class) + @Configuration(proxyBeanMethods = false) + open class BigDecimalAutoConfiguration { + @Bean + open fun bigDecimalExtendedScalarsRegistrar(): ExtendedScalarRegistrar { + return object : AbstractExtendedScalarRegistrar() { + override fun getScalars(): List { + return listOf( + // Others + ExtendedScalars.GraphQLBigDecimal + ) + } + } + } + } + + open class OnBigDecimalAndNumbers : + AllNestedConditions(ConfigurationCondition.ConfigurationPhase.PARSE_CONFIGURATION) { + @ConditionalOnProperty( + prefix = "dgs.graphql.extensions.scalars.numbers.", + name = ["enabled"], + havingValue = "true", + matchIfMissing = true + ) + open class OnNumbers + + @ConditionalOnProperty( + prefix = "dgs.graphql.extensions.scalars.numbers.bigdecimal", + name = ["enabled"], + havingValue = "true", + matchIfMissing = true + ) + open class OnBigDecimal + } + + @Conditional(OnBigIntegerAndNumbers::class) + @Configuration(proxyBeanMethods = false) + open class BigIntegerAutoConfiguration { + @Bean + open fun bigIntegerExtendedScalarsRegistrar(): ExtendedScalarRegistrar { + return object : AbstractExtendedScalarRegistrar() { + override fun getScalars(): List { + return listOf(ExtendedScalars.GraphQLBigInteger) + } + } + } + } + + open class OnBigIntegerAndNumbers : + AllNestedConditions(ConfigurationCondition.ConfigurationPhase.PARSE_CONFIGURATION) { + @ConditionalOnProperty( + prefix = "dgs.graphql.extensions.scalars.numbers.", + name = ["enabled"], + havingValue = "true", + matchIfMissing = true + ) + open class OnNumbers + + @ConditionalOnProperty( + prefix = "dgs.graphql.extensions.scalars.numbers.biginteger", + name = ["enabled"], + havingValue = "true", + matchIfMissing = true + ) + open class OnBigInteger + } } @ConditionalOnProperty( diff --git a/graphql-dgs-extended-scalars/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/graphql-dgs-extended-scalars/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 69f82ea23d..5872954429 100644 --- a/graphql-dgs-extended-scalars/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/graphql-dgs-extended-scalars/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -19,7 +19,17 @@ { "name": "dgs.graphql.extensions.scalars.numbers.enabled", "type": "java.lang.Boolean", - "description": "Enabled by default, if dgs.graphql.extensions.scalars.enabled is enabled, will register all numeric scalar extensions such as PositiveInt, NegativeInt, etc." + "description": "Enabled by default, will register all numeric scalar extensions such as PositiveInt, NegativeInt, etc." + }, + { + "name": "dgs.graphql.extensions.scalars.numbers.bigdecimal.enabled", + "type": "java.lang.Boolean", + "description": "Enabled by default, can be used to disable the BigDecimal scalar; it requires dgs.graphql.extensions.scalars.numbers.enabled to be enabled as well." + }, + { + "name": "dgs.graphql.extensions.scalars.numbers.biginteger.enabled", + "type": "java.lang.Boolean", + "description": "Enabled by default, can be used to disable the BigInteger scalar; it requires dgs.graphql.extensions.scalars.numbers.enabled to be enabled as well." }, { "name": "dgs.graphql.extensions.scalars.chars.enabled", diff --git a/graphql-dgs-extended-scalars/src/test/kotlin/com/netflix/graphql/dgs/autoconfig/DgsExtendedScalarsAutoConfigurationTests.kt b/graphql-dgs-extended-scalars/src/test/kotlin/com/netflix/graphql/dgs/autoconfig/DgsExtendedScalarsAutoConfigurationTests.kt index a790742b3d..c53c009cbe 100644 --- a/graphql-dgs-extended-scalars/src/test/kotlin/com/netflix/graphql/dgs/autoconfig/DgsExtendedScalarsAutoConfigurationTests.kt +++ b/graphql-dgs-extended-scalars/src/test/kotlin/com/netflix/graphql/dgs/autoconfig/DgsExtendedScalarsAutoConfigurationTests.kt @@ -35,6 +35,8 @@ internal class DgsExtendedScalarsAutoConfigurationTests { .hasSingleBean(DgsExtendedScalarsAutoConfiguration::class.java) .hasSingleBean(DgsExtendedScalarsAutoConfiguration.CharsExtendedScalarsAutoConfiguration::class.java) .hasSingleBean(DgsExtendedScalarsAutoConfiguration.NumbersExtendedScalarsAutoConfiguration::class.java) + .hasSingleBean(DgsExtendedScalarsAutoConfiguration.NumbersExtendedScalarsAutoConfiguration.BigDecimalAutoConfiguration::class.java) + .hasSingleBean(DgsExtendedScalarsAutoConfiguration.NumbersExtendedScalarsAutoConfiguration.BigIntegerAutoConfiguration::class.java) .hasSingleBean(DgsExtendedScalarsAutoConfiguration.ObjectsExtendedScalarsAutoConfiguration::class.java) .hasSingleBean(DgsExtendedScalarsAutoConfiguration.TimeExtendedScalarsAutoConfiguration::class.java) .hasSingleBean(DgsExtendedScalarsAutoConfiguration.IDsExtendedScalarsAutoConfiguration::class.java) @@ -84,6 +86,36 @@ internal class DgsExtendedScalarsAutoConfigurationTests { .hasSingleBean(DgsExtendedScalarsAutoConfiguration::class.java) assertThat(context) .doesNotHaveBean(DgsExtendedScalarsAutoConfiguration.NumbersExtendedScalarsAutoConfiguration::class.java) + .doesNotHaveBean(DgsExtendedScalarsAutoConfiguration.NumbersExtendedScalarsAutoConfiguration.BigDecimalAutoConfiguration::class.java) + .doesNotHaveBean(DgsExtendedScalarsAutoConfiguration.NumbersExtendedScalarsAutoConfiguration.BigIntegerAutoConfiguration::class.java) + } + } + + @Test + fun `The BigDecimal scalar can be disabled`() { + context.withPropertyValues( + "dgs.graphql.extensions.scalars.numbers.bigdecimal.enabled=false" + ).run { context -> + assertThat(context) + .hasSingleBean(DgsExtendedScalarsAutoConfiguration::class.java) + .hasSingleBean(DgsExtendedScalarsAutoConfiguration.NumbersExtendedScalarsAutoConfiguration::class.java) + .hasSingleBean(DgsExtendedScalarsAutoConfiguration.NumbersExtendedScalarsAutoConfiguration.BigIntegerAutoConfiguration::class.java) + assertThat(context) + .doesNotHaveBean(DgsExtendedScalarsAutoConfiguration.NumbersExtendedScalarsAutoConfiguration.BigDecimalAutoConfiguration::class.java) + } + } + + @Test + fun `The BigInteger scalar can be disabled`() { + context.withPropertyValues( + "dgs.graphql.extensions.scalars.numbers.biginteger.enabled=false" + ).run { context -> + assertThat(context) + .hasSingleBean(DgsExtendedScalarsAutoConfiguration::class.java) + .hasSingleBean(DgsExtendedScalarsAutoConfiguration.NumbersExtendedScalarsAutoConfiguration::class.java) + .hasSingleBean(DgsExtendedScalarsAutoConfiguration.NumbersExtendedScalarsAutoConfiguration.BigDecimalAutoConfiguration::class.java) + assertThat(context) + .doesNotHaveBean(DgsExtendedScalarsAutoConfiguration.NumbersExtendedScalarsAutoConfiguration.BigIntegerAutoConfiguration::class.java) } }