media-manager.module.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { DynamicModule, Module, Provider } from '@nestjs/common';
  2. import { S3Client } from '@aws-sdk/client-s3';
  3. import { MediaManagerService } from './media-manager.service';
  4. import { LocalStorageAdapter } from './adapters/local.adapter';
  5. import { S3StorageAdapter } from './adapters/s3.adapter';
  6. export interface MediaManagerAwsOptions {
  7. region?: string;
  8. endpoint?: string;
  9. accessKeyId?: string;
  10. secretAccessKey?: string;
  11. bucket?: string;
  12. }
  13. export interface MediaManagerModuleOptions {
  14. localRoot?: string;
  15. aws?: MediaManagerAwsOptions;
  16. }
  17. export interface MediaManagerModuleAsyncOptions {
  18. imports?: any[];
  19. inject?: any[];
  20. useFactory: (...args: any[]) => Promise<MediaManagerModuleOptions> | MediaManagerModuleOptions;
  21. }
  22. const S3_CLIENT = 'MEDIA_MANAGER_S3_CLIENT';
  23. const MEDIA_MANAGER_OPTIONS = 'MEDIA_MANAGER_OPTIONS';
  24. @Module({})
  25. export class MediaManagerModule {
  26. static register(options?: MediaManagerModuleOptions): DynamicModule {
  27. return this.registerAsync({
  28. useFactory: () => options ?? {},
  29. });
  30. }
  31. static registerAsync(
  32. asyncOptions: MediaManagerModuleAsyncOptions,
  33. ): DynamicModule {
  34. const providers: Provider[] = this.createProviders();
  35. const optionProvider: Provider = {
  36. provide: MEDIA_MANAGER_OPTIONS,
  37. useFactory: asyncOptions.useFactory,
  38. inject: asyncOptions.inject || [],
  39. };
  40. return {
  41. module: MediaManagerModule,
  42. imports: asyncOptions.imports || [],
  43. providers: [optionProvider, ...providers],
  44. exports: [MediaManagerService],
  45. };
  46. }
  47. private static createProviders(): Provider[] {
  48. const localStorageProvider: Provider = {
  49. provide: LocalStorageAdapter,
  50. useFactory: (options: MediaManagerModuleOptions) =>
  51. new LocalStorageAdapter(options.localRoot),
  52. inject: [MEDIA_MANAGER_OPTIONS],
  53. };
  54. const s3ClientProvider: Provider = {
  55. provide: S3_CLIENT,
  56. useFactory: (options: MediaManagerModuleOptions) =>
  57. new S3Client({
  58. region: options.aws?.region,
  59. endpoint: options.aws?.endpoint,
  60. credentials:
  61. options.aws?.accessKeyId && options.aws?.secretAccessKey
  62. ? {
  63. accessKeyId: options.aws.accessKeyId,
  64. secretAccessKey: options.aws.secretAccessKey,
  65. }
  66. : undefined,
  67. }),
  68. inject: [MEDIA_MANAGER_OPTIONS],
  69. };
  70. const s3StorageAdapterProvider: Provider = {
  71. provide: S3StorageAdapter,
  72. useFactory: (client: S3Client, options: MediaManagerModuleOptions) =>
  73. new S3StorageAdapter(client, options.aws?.bucket ?? ''),
  74. inject: [S3_CLIENT, MEDIA_MANAGER_OPTIONS],
  75. };
  76. const serviceProvider: Provider = {
  77. provide: MediaManagerService,
  78. useFactory: (
  79. localAdapter: LocalStorageAdapter,
  80. s3Adapter: S3StorageAdapter,
  81. ) => new MediaManagerService(localAdapter, s3Adapter),
  82. inject: [LocalStorageAdapter, S3StorageAdapter],
  83. };
  84. return [
  85. localStorageProvider,
  86. s3ClientProvider,
  87. s3StorageAdapterProvider,
  88. serviceProvider,
  89. ];
  90. }
  91. }