diff --git a/core/src/main/groovy/org/grails/gorm/graphql/fetcher/DefaultGormDataFetcher.groovy b/core/src/main/groovy/org/grails/gorm/graphql/fetcher/DefaultGormDataFetcher.groovy index 643aecc4..347f4428 100644 --- a/core/src/main/groovy/org/grails/gorm/graphql/fetcher/DefaultGormDataFetcher.groovy +++ b/core/src/main/groovy/org/grails/gorm/graphql/fetcher/DefaultGormDataFetcher.groovy @@ -2,7 +2,6 @@ package org.grails.gorm.graphql.fetcher import grails.gorm.DetachedCriteria import grails.gorm.multitenancy.Tenants -import grails.gorm.transactions.GrailsTransactionTemplate import grails.gorm.transactions.TransactionService import graphql.schema.DataFetcher import graphql.schema.DataFetchingEnvironment @@ -18,9 +17,6 @@ import org.grails.datastore.mapping.model.types.Association import org.grails.datastore.mapping.multitenancy.MultiTenantCapableDatastore import org.grails.datastore.mapping.transactions.CustomizableRollbackTransactionAttribute import org.grails.gorm.graphql.entity.EntityFetchOptions -import org.springframework.transaction.PlatformTransactionManager - -import java.lang.reflect.Method /** * A generic class to assist with querying entities with GraphQL @@ -37,8 +33,6 @@ abstract class DefaultGormDataFetcher implements DataFetcher { protected PersistentEntity entity protected String propertyName protected EntityFetchOptions entityFetchOptions - protected GormStaticApi staticApi - protected Datastore datastore DefaultGormDataFetcher(PersistentEntity entity) { this(entity, null) @@ -48,8 +42,6 @@ abstract class DefaultGormDataFetcher implements DataFetcher { this.entity = entity this.propertyName = projectionName this.entityFetchOptions = new EntityFetchOptions(entity, projectionName) - this.staticApi = GormEnhancer.findStaticApi(entity.javaClass) - this.datastore = staticApi.datastore initializeEntity(entity) } @@ -125,5 +117,13 @@ abstract class DefaultGormDataFetcher implements DataFetcher { txService.withTransaction(transactionAttribute, closure) } + protected Datastore getDatastore() { + staticApi.datastore + } + + protected GormStaticApi getStaticApi() { + GormEnhancer.findStaticApi(entity.javaClass) + } + abstract T get(DataFetchingEnvironment environment) } diff --git a/examples/grails-tenant-app/src/test/groovy/grails/tenant/app/GraphqlMultiTenantSpec.groovy b/examples/grails-tenant-app/src/test/groovy/grails/tenant/app/GraphqlMultiTenantSpec.groovy new file mode 100644 index 00000000..34c026a8 --- /dev/null +++ b/examples/grails-tenant-app/src/test/groovy/grails/tenant/app/GraphqlMultiTenantSpec.groovy @@ -0,0 +1,40 @@ +package grails.tenant.app + + +import org.grails.datastore.mapping.config.Settings +import org.grails.datastore.mapping.core.DatastoreUtils +import org.grails.datastore.mapping.multitenancy.MultiTenancySettings +import org.grails.datastore.mapping.multitenancy.web.SessionTenantResolver +import org.grails.gorm.graphql.plugin.GormGraphqlGrailsPlugin +import org.grails.orm.hibernate.HibernateDatastore +import org.grails.spring.beans.factory.InstanceFactoryBean +import org.grails.testing.GrailsUnitTest +import spock.lang.Specification + +class GraphqlMultiTenantSpec extends Specification implements GrailsUnitTest { + + void "test GraphQl with multi tenancy mode schema and session tenant resolver"() { + + given: + HibernateDatastore datastore = new HibernateDatastore( + DatastoreUtils.createPropertyResolver( + [(Settings.SETTING_MULTI_TENANCY_MODE) : MultiTenancySettings.MultiTenancyMode.SCHEMA, + (Settings.SETTING_MULTI_TENANT_RESOLVER_CLASS) : SessionTenantResolver.name, + (Settings.SETTING_DB_CREATE) : 'create-drop']), + [User] as Class[]) + + defineBeans { + hibernateDatastore(InstanceFactoryBean, datastore, HibernateDatastore) + grailsDomainClassMappingContext(hibernateDatastore: "getMappingContext") + } + + GormGraphqlGrailsPlugin graphqlGrailsPlugin = new GormGraphqlGrailsPlugin() + graphqlGrailsPlugin.grailsApplication = grailsApplication + this.defineBeans(graphqlGrailsPlugin) + + expect: + grailsApplication.mainContext.containsBean("graphQL") + + } + +}