blob: ad918d728bb1e83b060b2b781485f51473b3ec92 [file] [log] [blame]
package myapp
import graphql.language.StringValue
import graphql.schema.Coercing
import graphql.schema.CoercingParseValueException
import graphql.schema.CoercingSerializeException
import graphql.schema.GraphQLScalarType
import org.bson.types.ObjectId
import org.grails.gorm.graphql.plugin.GraphQLPostProcessor
import org.grails.gorm.graphql.types.GraphQLTypeManager
class MyGraphQLCustomizer extends GraphQLPostProcessor {
@Override
void doWith(GraphQLTypeManager typeManager) {
typeManager.registerType(ObjectId, GraphQLScalarType.newScalar()
.name("ObjectId").description("Hex representation of a Mongo object id").coercing(new Coercing<ObjectId, ObjectId>() {
protected Optional<ObjectId> convert(Object input) {
if (input instanceof ObjectId) {
Optional.of((ObjectId) input)
} else if (input instanceof String) {
parseObjectId((String) input)
} else {
Optional.empty()
}
}
@Override
ObjectId serialize(Object input) {
convert(input).orElseThrow({
throw new CoercingSerializeException("Could not convert ${input.class.name} to an ObjectId")
})
}
@Override
ObjectId parseValue(Object input) {
convert(input).orElseThrow({
throw new CoercingParseValueException("Could not convert ${input.class.name} to an ObjectId")
})
}
@Override
ObjectId parseLiteral(Object input) {
if (input instanceof StringValue) {
parseObjectId(((StringValue) input).value).orElse(null)
} else {
null
}
}
protected Optional<ObjectId> parseObjectId(String input) {
if (ObjectId.isValid(input)) {
Optional.of(new ObjectId(input))
} else {
Optional.empty()
}
}
}).build())
}
}