feat: Adding support for new FieldMetadataType with Postgres enums (#2674)
* feat: add enum type (RATING, SELECT, MULTI_SELECT) feat: wip enum type feat: try to alter enum feat: wip enum feat: wip enum feat: schema-builder can handle enum fix: return default value in field metadata response * fix: create fieldMedata with options * fix: lint issues * fix: rename abstract factory * feat: drop `PHONE` and `EMAIL` fieldMetadata types * feat: drop `VARCHAR` fieldMetadata type and rely on `TEXT` * Revert "feat: drop `PHONE` and `EMAIL` fieldMetadata types" This reverts commit 3857539f7d42f17c81f6ab92a6db950140b3c8e5.
This commit is contained in:
@ -0,0 +1,65 @@
|
||||
import { Injectable, Logger } from '@nestjs/common';
|
||||
|
||||
import { WorkspaceColumnActionOptions } from 'src/metadata/workspace-migration/interfaces/workspace-column-action-options.interface';
|
||||
import { FieldMetadataInterface } from 'src/metadata/field-metadata/interfaces/field-metadata.interface';
|
||||
|
||||
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
|
||||
import {
|
||||
WorkspaceMigrationColumnActionType,
|
||||
WorkspaceMigrationColumnAlter,
|
||||
WorkspaceMigrationColumnCreate,
|
||||
} from 'src/metadata/workspace-migration/workspace-migration.entity';
|
||||
import { serializeDefaultValue } from 'src/metadata/field-metadata/utils/serialize-default-value';
|
||||
import { fieldMetadataTypeToColumnType } from 'src/metadata/workspace-migration/utils/field-metadata-type-to-column-type.util';
|
||||
import { ColumnActionAbstractFactory } from 'src/metadata/workspace-migration/factories/column-action-abstract.factory';
|
||||
|
||||
export type BasicFieldMetadataType =
|
||||
| FieldMetadataType.UUID
|
||||
| FieldMetadataType.TEXT
|
||||
| FieldMetadataType.PHONE
|
||||
| FieldMetadataType.EMAIL
|
||||
| FieldMetadataType.NUMERIC
|
||||
| FieldMetadataType.NUMBER
|
||||
| FieldMetadataType.PROBABILITY
|
||||
| FieldMetadataType.BOOLEAN
|
||||
| FieldMetadataType.DATE_TIME;
|
||||
|
||||
@Injectable()
|
||||
export class BasicColumnActionFactory extends ColumnActionAbstractFactory<BasicFieldMetadataType> {
|
||||
protected readonly logger = new Logger(BasicColumnActionFactory.name);
|
||||
|
||||
protected handleCreateAction(
|
||||
fieldMetadata: FieldMetadataInterface<BasicFieldMetadataType>,
|
||||
options?: WorkspaceColumnActionOptions,
|
||||
): WorkspaceMigrationColumnCreate {
|
||||
const defaultValue =
|
||||
fieldMetadata.defaultValue?.value ?? options?.defaultValue;
|
||||
const serializedDefaultValue = serializeDefaultValue(defaultValue);
|
||||
|
||||
return {
|
||||
action: WorkspaceMigrationColumnActionType.CREATE,
|
||||
columnName: fieldMetadata.targetColumnMap.value,
|
||||
columnType: fieldMetadataTypeToColumnType(fieldMetadata.type),
|
||||
isNullable: fieldMetadata.isNullable,
|
||||
defaultValue: serializedDefaultValue,
|
||||
};
|
||||
}
|
||||
|
||||
protected handleAlterAction(
|
||||
previousFieldMetadata: FieldMetadataInterface<BasicFieldMetadataType>,
|
||||
nextFieldMetadata: FieldMetadataInterface<BasicFieldMetadataType>,
|
||||
options?: WorkspaceColumnActionOptions,
|
||||
): WorkspaceMigrationColumnAlter {
|
||||
const defaultValue =
|
||||
nextFieldMetadata.defaultValue?.value ?? options?.defaultValue;
|
||||
const serializedDefaultValue = serializeDefaultValue(defaultValue);
|
||||
|
||||
return {
|
||||
action: WorkspaceMigrationColumnActionType.ALTER,
|
||||
columnName: nextFieldMetadata.targetColumnMap.value,
|
||||
columnType: fieldMetadataTypeToColumnType(nextFieldMetadata.type),
|
||||
isNullable: nextFieldMetadata.isNullable,
|
||||
defaultValue: serializedDefaultValue,
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,66 @@
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import { Logger } from '@nestjs/common';
|
||||
|
||||
import { FieldMetadataInterface } from 'src/metadata/field-metadata/interfaces/field-metadata.interface';
|
||||
import { WorkspaceColumnActionOptions } from 'src/metadata/workspace-migration/interfaces/workspace-column-action-options.interface';
|
||||
import { WorkspaceColumnActionFactory } from 'src/metadata/workspace-migration/interfaces/workspace-column-action-factory.interface';
|
||||
|
||||
import {
|
||||
WorkspaceMigrationColumnActionType,
|
||||
WorkspaceMigrationColumnAction,
|
||||
WorkspaceMigrationColumnCreate,
|
||||
WorkspaceMigrationColumnAlter,
|
||||
} from 'src/metadata/workspace-migration/workspace-migration.entity';
|
||||
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
|
||||
|
||||
export class ColumnActionAbstractFactory<
|
||||
T extends FieldMetadataType | 'default',
|
||||
> implements WorkspaceColumnActionFactory<T>
|
||||
{
|
||||
protected readonly logger = new Logger(ColumnActionAbstractFactory.name);
|
||||
|
||||
create(
|
||||
action:
|
||||
| WorkspaceMigrationColumnActionType.CREATE
|
||||
| WorkspaceMigrationColumnActionType.ALTER,
|
||||
previousFieldMetadata: FieldMetadataInterface<T> | undefined,
|
||||
nextFieldMetadata: FieldMetadataInterface<T>,
|
||||
options?: WorkspaceColumnActionOptions,
|
||||
): WorkspaceMigrationColumnAction {
|
||||
switch (action) {
|
||||
case WorkspaceMigrationColumnActionType.CREATE:
|
||||
return this.handleCreateAction(nextFieldMetadata, options);
|
||||
case WorkspaceMigrationColumnActionType.ALTER: {
|
||||
if (!previousFieldMetadata) {
|
||||
throw new Error('Previous field metadata is required for alter');
|
||||
}
|
||||
|
||||
return this.handleAlterAction(
|
||||
previousFieldMetadata,
|
||||
nextFieldMetadata,
|
||||
options,
|
||||
);
|
||||
}
|
||||
default: {
|
||||
this.logger.error(`Invalid action: ${action}`);
|
||||
|
||||
throw new Error('[AbstractFactory]: invalid action');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected handleCreateAction(
|
||||
_fieldMetadata: FieldMetadataInterface<T>,
|
||||
_options?: WorkspaceColumnActionOptions,
|
||||
): WorkspaceMigrationColumnCreate {
|
||||
throw new Error('handleCreateAction method not implemented.');
|
||||
}
|
||||
|
||||
protected handleAlterAction(
|
||||
_previousFieldMetadata: FieldMetadataInterface<T>,
|
||||
_nextFieldMetadata: FieldMetadataInterface<T>,
|
||||
_options?: WorkspaceColumnActionOptions,
|
||||
): WorkspaceMigrationColumnAlter {
|
||||
throw new Error('handleAlterAction method not implemented.');
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,85 @@
|
||||
import { Injectable, Logger } from '@nestjs/common';
|
||||
|
||||
import { WorkspaceColumnActionOptions } from 'src/metadata/workspace-migration/interfaces/workspace-column-action-options.interface';
|
||||
import { FieldMetadataInterface } from 'src/metadata/field-metadata/interfaces/field-metadata.interface';
|
||||
|
||||
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
|
||||
import {
|
||||
WorkspaceMigrationColumnActionType,
|
||||
WorkspaceMigrationColumnAlter,
|
||||
WorkspaceMigrationColumnCreate,
|
||||
} from 'src/metadata/workspace-migration/workspace-migration.entity';
|
||||
import { serializeDefaultValue } from 'src/metadata/field-metadata/utils/serialize-default-value';
|
||||
import { fieldMetadataTypeToColumnType } from 'src/metadata/workspace-migration/utils/field-metadata-type-to-column-type.util';
|
||||
import { ColumnActionAbstractFactory } from 'src/metadata/workspace-migration/factories/column-action-abstract.factory';
|
||||
|
||||
export type EnumFieldMetadataType =
|
||||
| FieldMetadataType.RATING
|
||||
| FieldMetadataType.SELECT
|
||||
| FieldMetadataType.MULTI_SELECT;
|
||||
|
||||
@Injectable()
|
||||
export class EnumColumnActionFactory extends ColumnActionAbstractFactory<EnumFieldMetadataType> {
|
||||
protected readonly logger = new Logger(EnumColumnActionFactory.name);
|
||||
|
||||
protected handleCreateAction(
|
||||
fieldMetadata: FieldMetadataInterface<EnumFieldMetadataType>,
|
||||
options: WorkspaceColumnActionOptions,
|
||||
): WorkspaceMigrationColumnCreate {
|
||||
const defaultValue =
|
||||
fieldMetadata.defaultValue?.value ?? options?.defaultValue;
|
||||
const serializedDefaultValue = serializeDefaultValue(defaultValue);
|
||||
const enumOptions = fieldMetadata.options
|
||||
? [...fieldMetadata.options.map((option) => option.value)]
|
||||
: undefined;
|
||||
|
||||
return {
|
||||
action: WorkspaceMigrationColumnActionType.CREATE,
|
||||
columnName: fieldMetadata.targetColumnMap.value,
|
||||
columnType: fieldMetadataTypeToColumnType(fieldMetadata.type),
|
||||
enum: enumOptions,
|
||||
isArray: fieldMetadata.type === FieldMetadataType.MULTI_SELECT,
|
||||
isNullable: fieldMetadata.isNullable,
|
||||
defaultValue: serializedDefaultValue,
|
||||
};
|
||||
}
|
||||
|
||||
protected handleAlterAction(
|
||||
previousFieldMetadata: FieldMetadataInterface<EnumFieldMetadataType>,
|
||||
nextFieldMetadata: FieldMetadataInterface<EnumFieldMetadataType>,
|
||||
options: WorkspaceColumnActionOptions,
|
||||
): WorkspaceMigrationColumnAlter {
|
||||
const defaultValue =
|
||||
nextFieldMetadata.defaultValue?.value ?? options?.defaultValue;
|
||||
const serializedDefaultValue = serializeDefaultValue(defaultValue);
|
||||
const enumOptions = nextFieldMetadata.options
|
||||
? [
|
||||
...nextFieldMetadata.options.map((option) => {
|
||||
const previousOption = previousFieldMetadata.options?.find(
|
||||
(previousOption) => previousOption.id === option.id,
|
||||
);
|
||||
|
||||
// The id is the same, but the value is different, so we need to alter the enum
|
||||
if (previousOption && previousOption.value !== option.value) {
|
||||
return {
|
||||
from: previousOption.value,
|
||||
to: option.value,
|
||||
};
|
||||
}
|
||||
|
||||
return option.value;
|
||||
}),
|
||||
]
|
||||
: undefined;
|
||||
|
||||
return {
|
||||
action: WorkspaceMigrationColumnActionType.ALTER,
|
||||
columnName: nextFieldMetadata.targetColumnMap.value,
|
||||
columnType: fieldMetadataTypeToColumnType(nextFieldMetadata.type),
|
||||
enum: enumOptions,
|
||||
isArray: nextFieldMetadata.type === FieldMetadataType.MULTI_SELECT,
|
||||
isNullable: nextFieldMetadata.isNullable,
|
||||
defaultValue: serializedDefaultValue,
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
import { BasicColumnActionFactory } from 'src/metadata/workspace-migration/factories/basic-column-action.factory';
|
||||
import { EnumColumnActionFactory } from 'src/metadata/workspace-migration/factories/enum-column-action.factory';
|
||||
|
||||
export const workspaceColumnActionFactories = [
|
||||
BasicColumnActionFactory,
|
||||
EnumColumnActionFactory,
|
||||
];
|
||||
@ -0,0 +1,21 @@
|
||||
import { WorkspaceColumnActionOptions } from 'src/metadata/workspace-migration/interfaces/workspace-column-action-options.interface';
|
||||
import { FieldMetadataInterface } from 'src/metadata/field-metadata/interfaces/field-metadata.interface';
|
||||
|
||||
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
|
||||
import {
|
||||
WorkspaceMigrationColumnActionType,
|
||||
WorkspaceMigrationColumnAction,
|
||||
} from 'src/metadata/workspace-migration/workspace-migration.entity';
|
||||
|
||||
export interface WorkspaceColumnActionFactory<
|
||||
T extends FieldMetadataType | 'default',
|
||||
> {
|
||||
create(
|
||||
action:
|
||||
| WorkspaceMigrationColumnActionType.CREATE
|
||||
| WorkspaceMigrationColumnActionType.ALTER,
|
||||
previousFieldMetadata: FieldMetadataInterface<T> | undefined,
|
||||
nextFieldMetadata: FieldMetadataInterface<T>,
|
||||
options?: WorkspaceColumnActionOptions,
|
||||
): WorkspaceMigrationColumnAction;
|
||||
}
|
||||
@ -0,0 +1,3 @@
|
||||
export interface WorkspaceColumnActionOptions {
|
||||
defaultValue?: string;
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
|
||||
|
||||
export const fieldMetadataTypeToColumnType = <Type extends FieldMetadataType>(
|
||||
fieldMetadataType: Type,
|
||||
): string => {
|
||||
/**
|
||||
* Composite types are not implemented here, as they are flattened by their composite definitions.
|
||||
* See src/metadata/field-metadata/composite-types for more information.
|
||||
*/
|
||||
switch (fieldMetadataType) {
|
||||
case FieldMetadataType.UUID:
|
||||
return 'uuid';
|
||||
case FieldMetadataType.TEXT:
|
||||
return 'text';
|
||||
case FieldMetadataType.PHONE:
|
||||
case FieldMetadataType.EMAIL:
|
||||
return 'varchar';
|
||||
case FieldMetadataType.NUMERIC:
|
||||
return 'numeric';
|
||||
case FieldMetadataType.NUMBER:
|
||||
case FieldMetadataType.PROBABILITY:
|
||||
return 'float';
|
||||
case FieldMetadataType.BOOLEAN:
|
||||
return 'boolean';
|
||||
case FieldMetadataType.DATE_TIME:
|
||||
return 'timestamp';
|
||||
case FieldMetadataType.RATING:
|
||||
case FieldMetadataType.SELECT:
|
||||
case FieldMetadataType.MULTI_SELECT:
|
||||
return 'enum';
|
||||
default:
|
||||
throw new Error(`Cannot convert ${fieldMetadataType} to column type.`);
|
||||
}
|
||||
};
|
||||
@ -7,13 +7,29 @@ import {
|
||||
|
||||
export enum WorkspaceMigrationColumnActionType {
|
||||
CREATE = 'CREATE',
|
||||
ALTER = 'ALTER',
|
||||
RELATION = 'RELATION',
|
||||
}
|
||||
|
||||
export type WorkspaceMigrationEnum = string | { from: string; to: string };
|
||||
|
||||
export type WorkspaceMigrationColumnCreate = {
|
||||
action: WorkspaceMigrationColumnActionType.CREATE;
|
||||
columnName: string;
|
||||
columnType: string;
|
||||
enum?: WorkspaceMigrationEnum[];
|
||||
isArray?: boolean;
|
||||
isNullable?: boolean;
|
||||
defaultValue?: any;
|
||||
};
|
||||
|
||||
export type WorkspaceMigrationColumnAlter = {
|
||||
action: WorkspaceMigrationColumnActionType.ALTER;
|
||||
columnName: string;
|
||||
columnType: string;
|
||||
enum?: WorkspaceMigrationEnum[];
|
||||
isArray?: boolean;
|
||||
isNullable?: boolean;
|
||||
defaultValue?: any;
|
||||
};
|
||||
|
||||
@ -27,7 +43,11 @@ export type WorkspaceMigrationColumnRelation = {
|
||||
|
||||
export type WorkspaceMigrationColumnAction = {
|
||||
action: WorkspaceMigrationColumnActionType;
|
||||
} & (WorkspaceMigrationColumnCreate | WorkspaceMigrationColumnRelation);
|
||||
} & (
|
||||
| WorkspaceMigrationColumnCreate
|
||||
| WorkspaceMigrationColumnAlter
|
||||
| WorkspaceMigrationColumnRelation
|
||||
);
|
||||
|
||||
export type WorkspaceMigrationTableAction = {
|
||||
name: string;
|
||||
|
||||
@ -0,0 +1,186 @@
|
||||
import { Injectable, Logger } from '@nestjs/common';
|
||||
|
||||
import { WorkspaceColumnActionFactory } from 'src/metadata/workspace-migration/interfaces/workspace-column-action-factory.interface';
|
||||
import { FieldMetadataInterface } from 'src/metadata/field-metadata/interfaces/field-metadata.interface';
|
||||
import { WorkspaceColumnActionOptions } from 'src/metadata/workspace-migration/interfaces/workspace-column-action-options.interface';
|
||||
|
||||
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
|
||||
import { BasicColumnActionFactory } from 'src/metadata/workspace-migration/factories/basic-column-action.factory';
|
||||
import { EnumColumnActionFactory } from 'src/metadata/workspace-migration/factories/enum-column-action.factory';
|
||||
import {
|
||||
WorkspaceMigrationColumnAction,
|
||||
WorkspaceMigrationColumnActionType,
|
||||
} from 'src/metadata/workspace-migration/workspace-migration.entity';
|
||||
import { isCompositeFieldMetadataType } from 'src/metadata/field-metadata/utils/is-composite-field-metadata-type.util';
|
||||
import { linkObjectDefinition } from 'src/metadata/field-metadata/composite-types/link.composite-type';
|
||||
import { currencyObjectDefinition } from 'src/metadata/field-metadata/composite-types/currency.composite-type';
|
||||
import { fullNameObjectDefinition } from 'src/metadata/field-metadata/composite-types/full-name.composite-type';
|
||||
|
||||
@Injectable()
|
||||
export class WorkspaceMigrationFactory {
|
||||
private readonly logger = new Logger(WorkspaceMigrationFactory.name);
|
||||
private factoriesMap: Map<
|
||||
FieldMetadataType,
|
||||
{
|
||||
factory: WorkspaceColumnActionFactory<any>;
|
||||
options?: WorkspaceColumnActionOptions;
|
||||
}
|
||||
>;
|
||||
private compositeDefinitions = new Map<string, FieldMetadataInterface[]>();
|
||||
|
||||
constructor(
|
||||
private readonly basicColumnActionFactory: BasicColumnActionFactory,
|
||||
private readonly enumColumnActionFactory: EnumColumnActionFactory,
|
||||
) {
|
||||
this.factoriesMap = new Map<
|
||||
FieldMetadataType,
|
||||
{
|
||||
factory: WorkspaceColumnActionFactory<any>;
|
||||
options?: WorkspaceColumnActionOptions;
|
||||
}
|
||||
>([
|
||||
[FieldMetadataType.UUID, { factory: this.basicColumnActionFactory }],
|
||||
[
|
||||
FieldMetadataType.TEXT,
|
||||
{
|
||||
factory: this.basicColumnActionFactory,
|
||||
options: {
|
||||
defaultValue: '',
|
||||
},
|
||||
},
|
||||
],
|
||||
[
|
||||
FieldMetadataType.PHONE,
|
||||
{
|
||||
factory: this.basicColumnActionFactory,
|
||||
options: {
|
||||
defaultValue: '',
|
||||
},
|
||||
},
|
||||
],
|
||||
[
|
||||
FieldMetadataType.EMAIL,
|
||||
{
|
||||
factory: this.basicColumnActionFactory,
|
||||
options: {
|
||||
defaultValue: '',
|
||||
},
|
||||
},
|
||||
],
|
||||
[FieldMetadataType.NUMERIC, { factory: this.basicColumnActionFactory }],
|
||||
[FieldMetadataType.NUMBER, { factory: this.basicColumnActionFactory }],
|
||||
[
|
||||
FieldMetadataType.PROBABILITY,
|
||||
{ factory: this.basicColumnActionFactory },
|
||||
],
|
||||
[FieldMetadataType.BOOLEAN, { factory: this.basicColumnActionFactory }],
|
||||
[FieldMetadataType.DATE_TIME, { factory: this.basicColumnActionFactory }],
|
||||
[FieldMetadataType.RATING, { factory: this.enumColumnActionFactory }],
|
||||
[FieldMetadataType.SELECT, { factory: this.enumColumnActionFactory }],
|
||||
[
|
||||
FieldMetadataType.MULTI_SELECT,
|
||||
{ factory: this.enumColumnActionFactory },
|
||||
],
|
||||
]);
|
||||
|
||||
this.compositeDefinitions = new Map<string, FieldMetadataInterface[]>([
|
||||
[FieldMetadataType.LINK, linkObjectDefinition.fields],
|
||||
[FieldMetadataType.CURRENCY, currencyObjectDefinition.fields],
|
||||
[FieldMetadataType.FULL_NAME, fullNameObjectDefinition.fields],
|
||||
]);
|
||||
}
|
||||
|
||||
createColumnActions(
|
||||
action: WorkspaceMigrationColumnActionType.CREATE,
|
||||
fieldMetadata: FieldMetadataInterface,
|
||||
): WorkspaceMigrationColumnAction[];
|
||||
createColumnActions(
|
||||
action: WorkspaceMigrationColumnActionType.ALTER,
|
||||
previousFieldMetadata: FieldMetadataInterface,
|
||||
nextFieldMetadata: FieldMetadataInterface,
|
||||
): WorkspaceMigrationColumnAction[];
|
||||
createColumnActions(
|
||||
action:
|
||||
| WorkspaceMigrationColumnActionType.CREATE
|
||||
| WorkspaceMigrationColumnActionType.ALTER,
|
||||
fieldMetadataOrPreviousFieldMetadata: FieldMetadataInterface,
|
||||
undefinedOrnextFieldMetadata?: FieldMetadataInterface,
|
||||
): WorkspaceMigrationColumnAction[] {
|
||||
const previousFieldMetadata =
|
||||
action === WorkspaceMigrationColumnActionType.ALTER
|
||||
? fieldMetadataOrPreviousFieldMetadata
|
||||
: undefined;
|
||||
const nextFieldMetadata =
|
||||
action === WorkspaceMigrationColumnActionType.CREATE
|
||||
? fieldMetadataOrPreviousFieldMetadata
|
||||
: undefinedOrnextFieldMetadata;
|
||||
|
||||
if (!nextFieldMetadata) {
|
||||
this.logger.error(
|
||||
`No field metadata provided for action ${action}`,
|
||||
fieldMetadataOrPreviousFieldMetadata,
|
||||
);
|
||||
|
||||
throw new Error(`No field metadata provided for action ${action}`);
|
||||
}
|
||||
|
||||
// If it's a composite field type, we need to create a column action for each of the fields
|
||||
if (isCompositeFieldMetadataType(nextFieldMetadata.type)) {
|
||||
const fieldMetadataCollection = this.compositeDefinitions.get(
|
||||
nextFieldMetadata.type,
|
||||
);
|
||||
|
||||
if (!fieldMetadataCollection) {
|
||||
this.logger.error(
|
||||
`No composite definition found for type ${nextFieldMetadata.type}`,
|
||||
{
|
||||
nextFieldMetadata,
|
||||
},
|
||||
);
|
||||
|
||||
throw new Error(
|
||||
`No composite definition found for type ${nextFieldMetadata.type}`,
|
||||
);
|
||||
}
|
||||
|
||||
return fieldMetadataCollection.map((fieldMetadata) =>
|
||||
this.createColumnAction(action, fieldMetadata, fieldMetadata),
|
||||
);
|
||||
}
|
||||
|
||||
// Otherwise, we create a single column action
|
||||
const columnAction = this.createColumnAction(
|
||||
action,
|
||||
previousFieldMetadata,
|
||||
nextFieldMetadata,
|
||||
);
|
||||
|
||||
return [columnAction];
|
||||
}
|
||||
|
||||
private createColumnAction(
|
||||
action:
|
||||
| WorkspaceMigrationColumnActionType.CREATE
|
||||
| WorkspaceMigrationColumnActionType.ALTER,
|
||||
previousFieldMetadata: FieldMetadataInterface | undefined,
|
||||
nextFieldMetadata: FieldMetadataInterface,
|
||||
): WorkspaceMigrationColumnAction {
|
||||
const { factory, options } =
|
||||
this.factoriesMap.get(nextFieldMetadata.type) ?? {};
|
||||
|
||||
if (!factory) {
|
||||
this.logger.error(`No factory found for type ${nextFieldMetadata.type}`, {
|
||||
nextFieldMetadata,
|
||||
});
|
||||
|
||||
throw new Error(`No factory found for type ${nextFieldMetadata.type}`);
|
||||
}
|
||||
|
||||
return factory.create(
|
||||
action,
|
||||
previousFieldMetadata,
|
||||
nextFieldMetadata,
|
||||
options,
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,12 +1,19 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
|
||||
import { workspaceColumnActionFactories } from 'src/metadata/workspace-migration/factories/factories';
|
||||
import { WorkspaceMigrationFactory } from 'src/metadata/workspace-migration/workspace-migration.factory';
|
||||
|
||||
import { WorkspaceMigrationService } from './workspace-migration.service';
|
||||
import { WorkspaceMigrationEntity } from './workspace-migration.entity';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([WorkspaceMigrationEntity], 'metadata')],
|
||||
exports: [WorkspaceMigrationService],
|
||||
providers: [WorkspaceMigrationService],
|
||||
providers: [
|
||||
...workspaceColumnActionFactories,
|
||||
WorkspaceMigrationFactory,
|
||||
WorkspaceMigrationService,
|
||||
],
|
||||
exports: [WorkspaceMigrationFactory, WorkspaceMigrationService],
|
||||
})
|
||||
export class WorkspaceMigrationModule {}
|
||||
|
||||
Reference in New Issue
Block a user