|
|
@@ -17,72 +17,87 @@ export interface MediaManagerModuleOptions {
|
|
|
aws?: MediaManagerAwsOptions;
|
|
|
}
|
|
|
|
|
|
+export interface MediaManagerModuleAsyncOptions {
|
|
|
+ imports?: any[];
|
|
|
+ inject?: any[];
|
|
|
+ useFactory: (...args: any[]) => Promise<MediaManagerModuleOptions> | MediaManagerModuleOptions;
|
|
|
+}
|
|
|
+
|
|
|
const S3_CLIENT = 'MEDIA_MANAGER_S3_CLIENT';
|
|
|
+const MEDIA_MANAGER_OPTIONS = 'MEDIA_MANAGER_OPTIONS';
|
|
|
|
|
|
@Module({})
|
|
|
export class MediaManagerModule {
|
|
|
static register(options?: MediaManagerModuleOptions): DynamicModule {
|
|
|
- const localRoot =
|
|
|
- options?.localRoot ||
|
|
|
- process.env.MEDIA_MANAGER_LOCAL_ROOT ||
|
|
|
- '/data/media';
|
|
|
+ return this.registerAsync({
|
|
|
+ useFactory: () => options ?? {},
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
- const awsOptions: MediaManagerAwsOptions = {
|
|
|
- region:
|
|
|
- options?.aws?.region || process.env.MEDIA_MANAGER_AWS_REGION,
|
|
|
- endpoint:
|
|
|
- options?.aws?.endpoint ||
|
|
|
- process.env.MEDIA_MANAGER_AWS_ENDPOINT_URL,
|
|
|
- accessKeyId:
|
|
|
- options?.aws?.accessKeyId ||
|
|
|
- process.env.MEDIA_MANAGER_AWS_ACCESS_KEY_ID,
|
|
|
- secretAccessKey:
|
|
|
- options?.aws?.secretAccessKey ||
|
|
|
- process.env.MEDIA_MANAGER_AWS_SECRET_ACCESS_KEY,
|
|
|
- bucket:
|
|
|
- options?.aws?.bucket || process.env.MEDIA_MANAGER_AWS_BUCKET,
|
|
|
+ static registerAsync(
|
|
|
+ asyncOptions: MediaManagerModuleAsyncOptions,
|
|
|
+ ): DynamicModule {
|
|
|
+ const providers: Provider[] = this.createProviders();
|
|
|
+ const optionProvider: Provider = {
|
|
|
+ provide: MEDIA_MANAGER_OPTIONS,
|
|
|
+ useFactory: asyncOptions.useFactory,
|
|
|
+ inject: asyncOptions.inject || [],
|
|
|
};
|
|
|
|
|
|
- const providers: Provider[] = [
|
|
|
- {
|
|
|
- provide: LocalStorageAdapter,
|
|
|
- useFactory: () => new LocalStorageAdapter(localRoot),
|
|
|
- },
|
|
|
- {
|
|
|
- provide: S3_CLIENT,
|
|
|
- useFactory: () =>
|
|
|
- new S3Client({
|
|
|
- region: awsOptions.region,
|
|
|
- endpoint: awsOptions.endpoint,
|
|
|
- credentials:
|
|
|
- awsOptions.accessKeyId && awsOptions.secretAccessKey
|
|
|
- ? {
|
|
|
- accessKeyId: awsOptions.accessKeyId,
|
|
|
- secretAccessKey: awsOptions.secretAccessKey,
|
|
|
- }
|
|
|
- : undefined,
|
|
|
- }),
|
|
|
- },
|
|
|
- {
|
|
|
- provide: S3StorageAdapter,
|
|
|
- useFactory: (client: S3Client) =>
|
|
|
- new S3StorageAdapter(client, awsOptions.bucket ?? ''),
|
|
|
- inject: [S3_CLIENT],
|
|
|
- },
|
|
|
- {
|
|
|
- provide: MediaManagerService,
|
|
|
- useFactory: (
|
|
|
- localAdapter: LocalStorageAdapter,
|
|
|
- s3Adapter: S3StorageAdapter,
|
|
|
- ) => new MediaManagerService(localAdapter, s3Adapter),
|
|
|
- inject: [LocalStorageAdapter, S3StorageAdapter],
|
|
|
- },
|
|
|
- ];
|
|
|
-
|
|
|
return {
|
|
|
module: MediaManagerModule,
|
|
|
- providers,
|
|
|
+ imports: asyncOptions.imports || [],
|
|
|
+ providers: [optionProvider, ...providers],
|
|
|
exports: [MediaManagerService],
|
|
|
};
|
|
|
}
|
|
|
+
|
|
|
+ private static createProviders(): Provider[] {
|
|
|
+ const localStorageProvider: Provider = {
|
|
|
+ provide: LocalStorageAdapter,
|
|
|
+ useFactory: (options: MediaManagerModuleOptions) =>
|
|
|
+ new LocalStorageAdapter(options.localRoot),
|
|
|
+ inject: [MEDIA_MANAGER_OPTIONS],
|
|
|
+ };
|
|
|
+
|
|
|
+ const s3ClientProvider: Provider = {
|
|
|
+ provide: S3_CLIENT,
|
|
|
+ useFactory: (options: MediaManagerModuleOptions) =>
|
|
|
+ new S3Client({
|
|
|
+ region: options.aws?.region,
|
|
|
+ endpoint: options.aws?.endpoint,
|
|
|
+ credentials:
|
|
|
+ options.aws?.accessKeyId && options.aws?.secretAccessKey
|
|
|
+ ? {
|
|
|
+ accessKeyId: options.aws.accessKeyId,
|
|
|
+ secretAccessKey: options.aws.secretAccessKey,
|
|
|
+ }
|
|
|
+ : undefined,
|
|
|
+ }),
|
|
|
+ inject: [MEDIA_MANAGER_OPTIONS],
|
|
|
+ };
|
|
|
+
|
|
|
+ const s3StorageAdapterProvider: Provider = {
|
|
|
+ provide: S3StorageAdapter,
|
|
|
+ useFactory: (client: S3Client, options: MediaManagerModuleOptions) =>
|
|
|
+ new S3StorageAdapter(client, options.aws?.bucket ?? ''),
|
|
|
+ inject: [S3_CLIENT, MEDIA_MANAGER_OPTIONS],
|
|
|
+ };
|
|
|
+
|
|
|
+ const serviceProvider: Provider = {
|
|
|
+ provide: MediaManagerService,
|
|
|
+ useFactory: (
|
|
|
+ localAdapter: LocalStorageAdapter,
|
|
|
+ s3Adapter: S3StorageAdapter,
|
|
|
+ ) => new MediaManagerService(localAdapter, s3Adapter),
|
|
|
+ inject: [LocalStorageAdapter, S3StorageAdapter],
|
|
|
+ };
|
|
|
+
|
|
|
+ return [
|
|
|
+ localStorageProvider,
|
|
|
+ s3ClientProvider,
|
|
|
+ s3StorageAdapterProvider,
|
|
|
+ serviceProvider,
|
|
|
+ ];
|
|
|
+ }
|
|
|
}
|