@sologence/nestjs-redshift-migration
Version:
NestJS migration module for Redshift data migration
112 lines (105 loc) • 3.09 kB
text/typescript
import {
DynamicModule,
Module,
Type,
Provider,
ValidationPipe,
} from '@nestjs/common';
import { getDataSourceToken } from '@nestjs/typeorm';
import { DataSource } from 'typeorm';
import { MigrationExistingConnectionOptions } from './interfaces/migration-options.interface';
import { MigrationService } from './migration.service';
import { REDSHIFT_DATASOURCE } from './constants/conection-name';
import { MigrationController } from './migration.controller';
import { APP_PIPE } from '@nestjs/core';
interface MigrationExistingConnectionAsyncOptions {
imports?: any[];
inject?: any[];
connectionName: string;
useFactory: (
...args: any[]
) =>
| Promise<Omit<MigrationExistingConnectionOptions, 'connectionName'>>
| Omit<MigrationExistingConnectionOptions, 'connectionName'>;
isGlobal?: boolean;
exposeApi?: boolean; // Add this property
}
({})
export class MigrationModule {
static forExistingConnection(
options: MigrationExistingConnectionOptions
): DynamicModule {
const providers: Provider[] = [
{
provide: 'MIGRATION_OPTIONS',
useValue: options,
},
{
provide: REDSHIFT_DATASOURCE,
useFactory: (dataSource: DataSource) => dataSource,
inject: [getDataSourceToken(options.connectionName)],
},
MigrationService,
{
provide: APP_PIPE,
useValue: new ValidationPipe({
transform: true,
whitelist: true,
}),
},
];
return {
global: options.isGlobal,
module: MigrationModule,
providers,
exports: [MigrationService],
controllers: options.exposeApi ? [MigrationController] : [],
};
}
static async getConnectionToken(
options: MigrationExistingConnectionAsyncOptions
): Promise<string | Function | Type<DataSource>> {
const args = options.inject
? await Promise.all(options.inject.map((token) => token))
: [];
return getDataSourceToken(options.connectionName);
}
static forExistingConnectionAsync(
options: MigrationExistingConnectionAsyncOptions
): DynamicModule {
const providers: Provider[] = [
{
provide: 'MIGRATION_OPTIONS',
useFactory: async (...args: any[]) => {
const config = await options.useFactory(...args);
return {
...config,
connectionName: options.connectionName,
};
},
inject: options.inject || [],
},
{
provide: REDSHIFT_DATASOURCE,
useFactory: (dataSource: DataSource) => dataSource,
inject: [getDataSourceToken(options.connectionName)],
},
MigrationService,
{
provide: APP_PIPE,
useValue: new ValidationPipe({
transform: true,
whitelist: true,
}),
},
];
return {
global: options.isGlobal,
module: MigrationModule,
imports: [...(options.imports || [])],
providers,
exports: [MigrationService],
controllers: options.exposeApi ? [MigrationController] : [],
};
}
}