blob: 246b4f2e94973631bdd5ec0ba6a122b743c9bc2b [file] [log] [blame]
package grails.test.app
import grails.test.app.pogo.Painting
import graphql.schema.GraphQLObjectType
import graphql.schema.GraphQLOutputType
import org.grails.gorm.graphql.binding.manager.GraphQLDataBinderManager
import org.grails.gorm.graphql.fetcher.GraphQLDataFetcherType
import org.grails.gorm.graphql.interceptor.impl.BaseGraphQLFetcherInterceptor
import org.grails.gorm.graphql.interceptor.manager.GraphQLInterceptorManager
import org.grails.gorm.graphql.plugin.GraphQLPostProcessor
import grails.gorm.DetachedCriteria
import graphql.schema.DataFetchingEnvironment
import groovy.transform.CompileStatic
import org.grails.datastore.mapping.model.PersistentEntity
import org.grails.gorm.graphql.fetcher.DeletingGormDataFetcher
import org.grails.gorm.graphql.fetcher.impl.EntityDataFetcher
import org.grails.gorm.graphql.fetcher.impl.SingleEntityDataFetcher
import org.grails.gorm.graphql.fetcher.impl.SoftDeleteEntityDataFetcher
import org.grails.gorm.graphql.fetcher.manager.GraphQLDataFetcherManager
import org.grails.gorm.graphql.types.GraphQLTypeManager
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition
@CompileStatic
class GraphQLCustomizer extends GraphQLPostProcessor {
@Override
void doWith(GraphQLDataFetcherManager fetcherManager) {
PersistentEntity entity = SoftDelete.gormPersistentEntity
DeletingGormDataFetcher softDelete = new SoftDeleteEntityDataFetcher(entity, 'active', false)
fetcherManager.registerDeletingDataFetcher(SoftDelete, softDelete)
fetcherManager.registerReadingDataFetcher(SoftDelete, new SingleEntityDataFetcher(entity) {
@Override
protected DetachedCriteria buildCriteria(DataFetchingEnvironment environment) {
super.buildCriteria(environment).where {
eq('active', true)
}
}
})
fetcherManager.registerReadingDataFetcher(SoftDelete, new EntityDataFetcher(entity) {
@Override
protected DetachedCriteria buildCriteria(DataFetchingEnvironment environment) {
super.buildCriteria(environment).where {
eq('active', true)
}
}
})
}
@Override
void doWith(GraphQLInterceptorManager interceptorManager) {
//The restricted domain cannot be edited or deleted
interceptorManager.registerInterceptor(Restricted, new BaseGraphQLFetcherInterceptor() {
boolean onMutation(DataFetchingEnvironment environment, GraphQLDataFetcherType type) {
type == GraphQLDataFetcherType.CREATE
}
})
}
@Override
void doWith(GraphQLDataBinderManager binderManager) {
binderManager.registerDataBinder(User, new UserDataBinder())
binderManager.registerDataBinder(Role, new RoleDataBinder())
}
@Override
void doWith(GraphQLTypeManager typeManager) {
GraphQLOutputType stringType = (GraphQLOutputType)typeManager.getType(String)
GraphQLOutputType intType = (GraphQLOutputType)typeManager.getType(Integer)
GraphQLObjectType.Builder builder = GraphQLObjectType.newObject()
.name('Painting')
.field(newFieldDefinition()
.name('name')
.type(stringType))
.field(newFieldDefinition()
.name('artistName')
.type(stringType))
.field(newFieldDefinition()
.name('heightCm')
.type(intType))
.field(newFieldDefinition()
.name('widthCm')
.type(intType))
typeManager.registerType(Painting, builder.build())
}
}