diff --git a/generator/graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/annotations/GraphQLSkipInputSuffix.kt b/generator/graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/annotations/GraphQLSkipInputSuffix.kt new file mode 100644 index 0000000000..ade0d67ff6 --- /dev/null +++ b/generator/graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/annotations/GraphQLSkipInputSuffix.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2024 Expedia, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.expediagroup.graphql.generator.annotations + +/** + * Do not add "Input" Suffix for input types. + */ +@Target(AnnotationTarget.CLASS) +annotation class GraphQLSkipInputSuffix diff --git a/generator/graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/internal/extensions/kClassExtensions.kt b/generator/graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/internal/extensions/kClassExtensions.kt index e8280831da..824dfce4a7 100644 --- a/generator/graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/internal/extensions/kClassExtensions.kt +++ b/generator/graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/internal/extensions/kClassExtensions.kt @@ -16,6 +16,7 @@ package com.expediagroup.graphql.generator.internal.extensions +import com.expediagroup.graphql.generator.annotations.GraphQLSkipInputSuffix import com.expediagroup.graphql.generator.exceptions.CouldNotGetNameOfKClassException import com.expediagroup.graphql.generator.hooks.SchemaGeneratorHooks import com.expediagroup.graphql.generator.internal.filters.functionFilters @@ -28,6 +29,7 @@ import kotlin.reflect.KProperty import kotlin.reflect.KVisibility import kotlin.reflect.full.declaredMemberFunctions import kotlin.reflect.full.declaredMemberProperties +import kotlin.reflect.full.findAnnotation import kotlin.reflect.full.findParameterByName import kotlin.reflect.full.isSubclassOf import kotlin.reflect.full.memberFunctions @@ -84,12 +86,13 @@ internal fun KClass<*>.isListType(isDirective: Boolean = false): Boolean = this. @Throws(CouldNotGetNameOfKClassException::class) internal fun KClass<*>.getSimpleName(isInputClass: Boolean = false): String { + val skipSuffix = this.findAnnotation() != null val name = this.getGraphQLName() ?: this.simpleName ?: throw CouldNotGetNameOfKClassException(this) return when { - isInputClass -> if (name.endsWith(INPUT_SUFFIX, true)) name else "$name$INPUT_SUFFIX" + isInputClass && !skipSuffix -> if (name.endsWith(INPUT_SUFFIX, true)) name else "$name$INPUT_SUFFIX" else -> name } } diff --git a/generator/graphql-kotlin-schema-generator/src/test/kotlin/com/expediagroup/graphql/generator/internal/extensions/KClassExtensionsTest.kt b/generator/graphql-kotlin-schema-generator/src/test/kotlin/com/expediagroup/graphql/generator/internal/extensions/KClassExtensionsTest.kt index d1b70be74c..5af571c180 100644 --- a/generator/graphql-kotlin-schema-generator/src/test/kotlin/com/expediagroup/graphql/generator/internal/extensions/KClassExtensionsTest.kt +++ b/generator/graphql-kotlin-schema-generator/src/test/kotlin/com/expediagroup/graphql/generator/internal/extensions/KClassExtensionsTest.kt @@ -18,6 +18,7 @@ package com.expediagroup.graphql.generator.internal.extensions import com.expediagroup.graphql.generator.annotations.GraphQLIgnore import com.expediagroup.graphql.generator.annotations.GraphQLName +import com.expediagroup.graphql.generator.annotations.GraphQLSkipInputSuffix import com.expediagroup.graphql.generator.annotations.GraphQLUnion import com.expediagroup.graphql.generator.exceptions.CouldNotGetNameOfKClassException import com.expediagroup.graphql.generator.hooks.NoopSchemaGeneratorHooks @@ -74,6 +75,9 @@ open class KClassExtensionsTest { class MyClassInput + @GraphQLSkipInputSuffix + class MyTestClassSkipSuffix + @GraphQLName("MyClassRenamedInput") class MyClassCustomNameInput @@ -330,6 +334,11 @@ open class KClassExtensionsTest { assertEquals("MyClassInput", MyClassInput::class.getSimpleName(true)) } + @Test + fun `test input class name with skipped suffix`() { + assertEquals("MyTestClassSkipSuffix", MyTestClassSkipSuffix::class.getSimpleName(true)) + } + @Test fun `test input class name with GraphQLName`() { assertEquals("MyTestClassRenamedInput", MyTestClassCustomName::class.getSimpleName(true)) diff --git a/website/versioned_docs/version-8.x.x/schema-generator/writing-schemas/arguments.md b/website/versioned_docs/version-8.x.x/schema-generator/writing-schemas/arguments.md index 175eb5f744..83ca4456fa 100644 --- a/website/versioned_docs/version-8.x.x/schema-generator/writing-schemas/arguments.md +++ b/website/versioned_docs/version-8.x.x/schema-generator/writing-schemas/arguments.md @@ -61,6 +61,8 @@ input WidgetInput { } ``` +If you want to disable this behaviour for one of your types, you can add `@GraphQLSkipInputSuffix` to your type. + Note that only fields are exposed in the input objects. Functions will only be available on the GraphQL output types. :::caution