api.module.ts 3.5 KB

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