app.module.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
  2. import { GraphQLFactory, GraphQLModule } from '@nestjs/graphql';
  3. import { TypeOrmModule } from '@nestjs/typeorm';
  4. import { graphiqlExpress, graphqlExpress } from 'apollo-server-express';
  5. import { GraphQLDateTime } from 'graphql-iso-date';
  6. import * as GraphQLJSON from 'graphql-type-json';
  7. import { CustomFields } from '../../shared/shared-types';
  8. import { AdministratorResolver } from './api/administrator/administrator.resolver';
  9. import { AuthController } from './api/auth/auth.controller';
  10. import { ConfigResolver } from './api/config/config.resolver';
  11. import { CustomerResolver } from './api/customer/customer.resolver';
  12. import { FacetResolver } from './api/facet/facet.resolver';
  13. import { ProductOptionResolver } from './api/product-option/product-option.resolver';
  14. import { ProductResolver } from './api/product/product.resolver';
  15. import { AuthService } from './auth/auth.service';
  16. import { JwtStrategy } from './auth/jwt.strategy';
  17. import { PasswordService } from './auth/password.service';
  18. import { getConfig } from './config/vendure-config';
  19. import { validateCustomFieldsConfig } from './entity/custom-entity-fields';
  20. import { addGraphQLCustomFields } from './entity/graphql-custom-fields';
  21. import { I18nService } from './i18n/i18n.service';
  22. import { TranslationUpdaterService } from './locale/translation-updater.service';
  23. import { AdministratorService } from './service/administrator.service';
  24. import { ConfigService } from './service/config.service';
  25. import { CustomerService } from './service/customer.service';
  26. import { FacetValueService } from './service/facet-value.service';
  27. import { FacetService } from './service/facet.service';
  28. import { ProductOptionGroupService } from './service/product-option-group.service';
  29. import { ProductOptionService } from './service/product-option.service';
  30. import { ProductVariantService } from './service/product-variant.service';
  31. import { ProductService } from './service/product.service';
  32. @Module({
  33. imports: [GraphQLModule, TypeOrmModule.forRoot(getConfig().dbConnectionOptions)],
  34. controllers: [AuthController],
  35. providers: [
  36. AdministratorResolver,
  37. AdministratorService,
  38. AuthService,
  39. ConfigResolver,
  40. ConfigService,
  41. FacetResolver,
  42. FacetService,
  43. FacetValueService,
  44. JwtStrategy,
  45. I18nService,
  46. PasswordService,
  47. CustomerService,
  48. CustomerResolver,
  49. ProductService,
  50. ProductOptionResolver,
  51. ProductOptionService,
  52. ProductOptionGroupService,
  53. ProductVariantService,
  54. ProductResolver,
  55. PasswordService,
  56. TranslationUpdaterService,
  57. ],
  58. })
  59. export class AppModule implements NestModule {
  60. constructor(
  61. private readonly graphQLFactory: GraphQLFactory,
  62. private configService: ConfigService,
  63. private i18nService: I18nService,
  64. ) {}
  65. configure(consumer: MiddlewareConsumer) {
  66. validateCustomFieldsConfig(this.configService.customFields);
  67. const schema = this.createSchema(this.configService.customFields);
  68. consumer
  69. .apply(
  70. graphiqlExpress({
  71. endpointURL: this.configService.apiPath,
  72. subscriptionsEndpoint: `ws://localhost:3001/subscriptions`,
  73. }),
  74. )
  75. .forRoutes('/graphiql')
  76. .apply([
  77. this.i18nService.handle(),
  78. graphqlExpress(req => ({
  79. schema,
  80. context: req,
  81. formatError: this.i18nService.translateError(req),
  82. })),
  83. ] as any)
  84. .forRoutes(this.configService.apiPath);
  85. }
  86. private createSchema(customFields: CustomFields) {
  87. const typeDefs = this.graphQLFactory.mergeTypesByPaths(__dirname + '/**/*.graphql');
  88. const extendedTypeDefs = addGraphQLCustomFields(typeDefs, customFields);
  89. return this.graphQLFactory.createSchema({
  90. typeDefs: extendedTypeDefs,
  91. resolverValidationOptions: {
  92. requireResolversForResolveType: false,
  93. },
  94. resolvers: {
  95. JSON: GraphQLJSON,
  96. DateTime: GraphQLDateTime,
  97. },
  98. });
  99. }
  100. }