Browse Source

refactor(server): Plugins specify GraphQL types and resolvers separately

Michael Bromley 7 years ago
parent
commit
edcada1e2d

+ 4 - 2
server/src/api/api.module.ts

@@ -32,6 +32,7 @@ import { ProductOptionResolver } from './resolvers/product-option.resolver';
 import { ProductResolver } from './resolvers/product.resolver';
 import { PromotionResolver } from './resolvers/promotion.resolver';
 import { RoleResolver } from './resolvers/role.resolver';
+import { SearchResolver } from './resolvers/search.resolver';
 import { ShippingMethodResolver } from './resolvers/shipping-method.resolver';
 import { TaxCategoryResolver } from './resolvers/tax-category.resolver';
 import { TaxRateResolver } from './resolvers/tax-rate.resolver';
@@ -55,6 +56,7 @@ const exportedProviders = [
     ProductResolver,
     ProductCategoryResolver,
     RoleResolver,
+    SearchResolver,
     ShippingMethodResolver,
     TaxCategoryResolver,
     TaxRateResolver,
@@ -64,9 +66,9 @@ const exportedProviders = [
 // Plugins may define resolver classes which must also be registered with this module
 // alongside the build-in resolvers.
 const pluginResolvers = getConfig()
-    .plugins.map(p => (p.defineGraphQlTypes ? p.defineGraphQlTypes() : undefined))
+    .plugins.map(p => (p.defineResolvers ? p.defineResolvers() : undefined))
     .filter(notNullOrUndefined)
-    .map(types => types.resolver);
+    .reduce((flattened, resolvers) => flattened.concat(resolvers), []);
 
 /**
  * The ApiModule is responsible for the public API of the application. This is where requests

+ 1 - 1
server/src/api/config/graphql-config.service.ts

@@ -67,7 +67,7 @@ export class GraphqlConfigService implements GqlOptionsFactory {
         const pluginTypes = this.configService.plugins
             .map(p => (p.defineGraphQlTypes ? p.defineGraphQlTypes() : undefined))
             .filter(notNullOrUndefined);
-        for (const { types } of pluginTypes) {
+        for (const types of pluginTypes) {
             schema = extendSchema(schema, types);
         }
         return printSchema(schema);

+ 7 - 5
server/src/config/vendure-plugin/vendure-plugin.ts

@@ -3,8 +3,6 @@ import { DocumentNode } from 'graphql';
 import { Type } from '../../../../shared/shared-types';
 import { VendureConfig } from '../vendure-config';
 
-export type PluginGraphQLExtension = { types: DocumentNode; resolver: Type<any> };
-
 /**
  * A VendurePlugin is a means of configuring and/or extending the functionality of the Vendure server. In its simplest form,
  * a plugin simply modifies the VendureConfig object. Although such configuration can be directly supplied to the bootstrap
@@ -28,10 +26,14 @@ export interface VendurePlugin {
     onBootstrap?(inject: <T>(type: Type<T>) => T): void | Promise<void>;
 
     /**
-     * The plugin may extend the default Vendure GraphQL schema by implementing this method. For any type extension
-     * such as a new Query or Mutation field, a corresponding resolver must be supplied.
+     * The plugin may extend the default Vendure GraphQL schema by implementing this method.
+     */
+    defineGraphQlTypes?(): DocumentNode;
+
+    /**
+     * The plugin may define custom GraphQL resolvers.
      */
-    defineGraphQlTypes?(): PluginGraphQLExtension;
+    defineResolvers?(): Array<Type<any>>;
 
     /**
      * The plugin may define custom database entities, which should be defined as classes annotated as per the