api.module.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
  2. import { APP_FILTER, APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
  3. import { ConfigService } from '../config/config.service';
  4. import { ConnectionModule } from '../connection/connection.module';
  5. import { DataImportModule } from '../data-import/data-import.module';
  6. import { I18nModule } from '../i18n/i18n.module';
  7. import { ServiceModule } from '../service/service.module';
  8. import { AdminApiModule, ApiSharedModule, ShopApiModule } from './api-internal-modules';
  9. import { configureGraphQLModule } from './config/configure-graphql-module';
  10. import { VENDURE_ADMIN_API_TYPE_PATHS, VENDURE_SHOP_API_TYPE_PATHS } from './constants';
  11. import { AuthGuard } from './middleware/auth-guard';
  12. import { CustomFieldProcessingInterceptor } from './middleware/custom-field-processing-interceptor';
  13. import { ExceptionLoggerFilter } from './middleware/exception-logger.filter';
  14. import { IdInterceptor } from './middleware/id-interceptor';
  15. import { TranslateErrorResultInterceptor } from './middleware/translate-error-result-interceptor';
  16. /**
  17. * The ApiModule is responsible for the public API of the application. This is where requests
  18. * come in, are parsed and then handed over to the ServiceModule classes which take care
  19. * of the business logic.
  20. */
  21. @Module({
  22. imports: [
  23. ServiceModule,
  24. ConnectionModule.forRoot(),
  25. DataImportModule,
  26. I18nModule,
  27. ApiSharedModule,
  28. AdminApiModule,
  29. ShopApiModule,
  30. configureGraphQLModule(configService => ({
  31. apiType: 'shop',
  32. apiPath: configService.apiOptions.shopApiPath,
  33. playground: configService.apiOptions.shopApiPlayground,
  34. debug: configService.apiOptions.shopApiDebug,
  35. typePaths: VENDURE_SHOP_API_TYPE_PATHS,
  36. resolverModule: ShopApiModule,
  37. validationRules: configService.apiOptions.shopApiValidationRules,
  38. })),
  39. configureGraphQLModule(configService => ({
  40. apiType: 'admin',
  41. apiPath: configService.apiOptions.adminApiPath,
  42. playground: configService.apiOptions.adminApiPlayground,
  43. debug: configService.apiOptions.adminApiDebug,
  44. typePaths: VENDURE_ADMIN_API_TYPE_PATHS,
  45. resolverModule: AdminApiModule,
  46. validationRules: configService.apiOptions.adminApiValidationRules,
  47. })),
  48. ],
  49. providers: [
  50. {
  51. provide: APP_GUARD,
  52. useClass: AuthGuard,
  53. },
  54. {
  55. provide: APP_INTERCEPTOR,
  56. useClass: IdInterceptor,
  57. },
  58. {
  59. provide: APP_INTERCEPTOR,
  60. useClass: CustomFieldProcessingInterceptor,
  61. },
  62. {
  63. provide: APP_INTERCEPTOR,
  64. useClass: TranslateErrorResultInterceptor,
  65. },
  66. {
  67. provide: APP_FILTER,
  68. useClass: ExceptionLoggerFilter,
  69. },
  70. ],
  71. })
  72. export class ApiModule implements NestModule {
  73. constructor(private configService: ConfigService) {}
  74. async configure(consumer: MiddlewareConsumer) {
  75. const { adminApiPath, shopApiPath } = this.configService.apiOptions;
  76. const { uploadMaxFileSize } = this.configService.assetOptions;
  77. // @ts-ignore
  78. const { default: graphqlUploadExpress } = await import('graphql-upload/graphqlUploadExpress.mjs');
  79. consumer
  80. .apply(graphqlUploadExpress({ maxFileSize: uploadMaxFileSize }))
  81. .forRoutes(adminApiPath, shopApiPath);
  82. }
  83. }