Add exceptions for metadata modules (#6070)

Class exception for each metadata module + handler to map on graphql
error

TODO left :
- find a way to call handler on auto-resolvers nestjs query (probably
interceptors)
- discuss what should be done for pre-hooks errors
- discuss what should be done for Unauthorized exception
This commit is contained in:
Thomas Trompette
2024-07-01 13:49:17 +02:00
committed by GitHub
parent 4599f43b6c
commit a15884ea0a
48 changed files with 815 additions and 199 deletions

View File

@ -13,6 +13,10 @@ import { serializeDefaultValue } from 'src/engine/metadata-modules/field-metadat
import { fieldMetadataTypeToColumnType } from 'src/engine/metadata-modules/workspace-migration/utils/field-metadata-type-to-column-type.util';
import { ColumnActionAbstractFactory } from 'src/engine/metadata-modules/workspace-migration/factories/column-action-abstract.factory';
import { computeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util';
import {
WorkspaceMigrationException,
WorkspaceMigrationExceptionCode,
} from 'src/engine/metadata-modules/workspace-migration/workspace-migration.exception';
export type BasicFieldMetadataType =
| FieldMetadataType.UUID
@ -66,8 +70,9 @@ export class BasicColumnActionFactory extends ColumnActionAbstractFactory<BasicF
this.logger.error(
`Column name not found for current or altered field metadata, can be due to a missing or an invalid target column map. Current column name: ${currentColumnName}, Altered column name: ${alteredColumnName}.`,
);
throw new Error(
throw new WorkspaceMigrationException(
`Column name not found for current or altered field metadata`,
WorkspaceMigrationExceptionCode.INVALID_FIELD_METADATA,
);
}

View File

@ -12,6 +12,10 @@ import {
WorkspaceMigrationColumnAlter,
} from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity';
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import {
WorkspaceMigrationException,
WorkspaceMigrationExceptionCode,
} from 'src/engine/metadata-modules/workspace-migration/workspace-migration.exception';
export class ColumnActionAbstractFactory<
T extends FieldMetadataType | 'default',
@ -32,7 +36,10 @@ export class ColumnActionAbstractFactory<
return this.handleCreateAction(alteredFieldMetadata, options);
case WorkspaceMigrationColumnActionType.ALTER: {
if (!currentFieldMetadata) {
throw new Error('current field metadata is required for alter');
throw new WorkspaceMigrationException(
'current field metadata is required for alter',
WorkspaceMigrationExceptionCode.INVALID_FIELD_METADATA,
);
}
return this.handleAlterAction(
@ -43,8 +50,10 @@ export class ColumnActionAbstractFactory<
}
default: {
this.logger.error(`Invalid action: ${action}`);
throw new Error('[AbstractFactory]: invalid action');
throw new WorkspaceMigrationException(
'[AbstractFactory]: invalid action',
WorkspaceMigrationExceptionCode.INVALID_ACTION,
);
}
}
}
@ -53,7 +62,10 @@ export class ColumnActionAbstractFactory<
_fieldMetadata: FieldMetadataInterface<T>,
_options?: WorkspaceColumnActionOptions,
): WorkspaceMigrationColumnCreate[] {
throw new Error('handleCreateAction method not implemented.');
throw new WorkspaceMigrationException(
'handleCreateAction method not implemented.',
WorkspaceMigrationExceptionCode.INVALID_ACTION,
);
}
protected handleAlterAction(
@ -61,6 +73,9 @@ export class ColumnActionAbstractFactory<
_alteredFieldMetadata: FieldMetadataInterface<T>,
_options?: WorkspaceColumnActionOptions,
): WorkspaceMigrationColumnAlter[] {
throw new Error('handleAlterAction method not implemented.');
throw new WorkspaceMigrationException(
'handleAlterAction method not implemented.',
WorkspaceMigrationExceptionCode.INVALID_ACTION,
);
}
}

View File

@ -13,6 +13,10 @@ import { fieldMetadataTypeToColumnType } from 'src/engine/metadata-modules/works
import { ColumnActionAbstractFactory } from 'src/engine/metadata-modules/workspace-migration/factories/column-action-abstract.factory';
import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util';
import { compositeTypeDefintions } from 'src/engine/metadata-modules/field-metadata/composite-types';
import {
WorkspaceMigrationException,
WorkspaceMigrationExceptionCode,
} from 'src/engine/metadata-modules/workspace-migration/workspace-migration.exception';
export type CompositeFieldMetadataType =
| FieldMetadataType.ADDRESS
@ -34,8 +38,9 @@ export class CompositeColumnActionFactory extends ColumnActionAbstractFactory<Co
this.logger.error(
`Composite type not found for field metadata type: ${fieldMetadata.type}`,
);
throw new Error(
throw new WorkspaceMigrationException(
`Composite type not found for field metadata type: ${fieldMetadata.type}`,
WorkspaceMigrationExceptionCode.INVALID_FIELD_METADATA,
);
}
@ -74,8 +79,9 @@ export class CompositeColumnActionFactory extends ColumnActionAbstractFactory<Co
this.logger.error(
`Composite type not found for field metadata type: ${currentFieldMetadata.type} or ${alteredFieldMetadata.type}`,
);
throw new Error(
throw new WorkspaceMigrationException(
`Composite type not found for field metadata type: ${currentFieldMetadata.type} or ${alteredFieldMetadata.type}`,
WorkspaceMigrationExceptionCode.INVALID_FIELD_METADATA,
);
}
@ -91,8 +97,9 @@ export class CompositeColumnActionFactory extends ColumnActionAbstractFactory<Co
this.logger.error(
`Current property not found for altered property: ${alteredProperty.name}`,
);
throw new Error(
throw new WorkspaceMigrationException(
`Current property not found for altered property: ${alteredProperty.name}`,
WorkspaceMigrationExceptionCode.INVALID_FIELD_METADATA,
);
}

View File

@ -13,6 +13,10 @@ import { serializeDefaultValue } from 'src/engine/metadata-modules/field-metadat
import { fieldMetadataTypeToColumnType } from 'src/engine/metadata-modules/workspace-migration/utils/field-metadata-type-to-column-type.util';
import { ColumnActionAbstractFactory } from 'src/engine/metadata-modules/workspace-migration/factories/column-action-abstract.factory';
import { computeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util';
import {
WorkspaceMigrationException,
WorkspaceMigrationExceptionCode,
} from 'src/engine/metadata-modules/workspace-migration/workspace-migration.exception';
export type EnumFieldMetadataType =
| FieldMetadataType.RATING
@ -82,8 +86,9 @@ export class EnumColumnActionFactory extends ColumnActionAbstractFactory<EnumFie
this.logger.error(
`Column name not found for current or altered field metadata, can be due to a missing or an invalid target column map. Current column name: ${currentColumnName}, Altered column name: ${alteredColumnName}.`,
);
throw new Error(
throw new WorkspaceMigrationException(
`Column name not found for current or altered field metadata`,
WorkspaceMigrationExceptionCode.INVALID_FIELD_METADATA,
);
}

View File

@ -1,4 +1,8 @@
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import {
WorkspaceMigrationException,
WorkspaceMigrationExceptionCode,
} from 'src/engine/metadata-modules/workspace-migration/workspace-migration.exception';
export const fieldMetadataTypeToColumnType = <Type extends FieldMetadataType>(
fieldMetadataType: Type,
@ -34,6 +38,9 @@ export const fieldMetadataTypeToColumnType = <Type extends FieldMetadataType>(
case FieldMetadataType.RAW_JSON:
return 'jsonb';
default:
throw new Error(`Cannot convert ${fieldMetadataType} to column type.`);
throw new WorkspaceMigrationException(
`Cannot convert ${fieldMetadataType} to column type.`,
WorkspaceMigrationExceptionCode.INVALID_FIELD_METADATA,
);
}
};

View File

@ -0,0 +1,14 @@
import { CustomException } from 'src/utils/custom-exception';
export class WorkspaceMigrationException extends CustomException {
code: WorkspaceMigrationExceptionCode;
constructor(message: string, code: WorkspaceMigrationExceptionCode) {
super(message, code);
}
}
export enum WorkspaceMigrationExceptionCode {
NO_FACTORY_FOUND = 'NO_FACTORY_FOUND',
INVALID_ACTION = 'INVALID_ACTION',
INVALID_FIELD_METADATA = 'INVALID_FIELD_METADATA',
}

View File

@ -12,6 +12,10 @@ import {
import { BasicColumnActionFactory } from 'src/engine/metadata-modules/workspace-migration/factories/basic-column-action.factory';
import { EnumColumnActionFactory } from 'src/engine/metadata-modules/workspace-migration/factories/enum-column-action.factory';
import { CompositeColumnActionFactory } from 'src/engine/metadata-modules/workspace-migration/factories/composite-column-action.factory';
import {
WorkspaceMigrationException,
WorkspaceMigrationExceptionCode,
} from 'src/engine/metadata-modules/workspace-migration/workspace-migration.exception';
@Injectable()
export class WorkspaceMigrationFactory {
@ -131,7 +135,10 @@ export class WorkspaceMigrationFactory {
undefinedOrAlteredFieldMetadata,
);
throw new Error(`No field metadata provided for action ${action}`);
throw new WorkspaceMigrationException(
`No field metadata provided for action ${action}`,
WorkspaceMigrationExceptionCode.INVALID_ACTION,
);
}
const columnActions = this.createColumnAction(
@ -161,7 +168,10 @@ export class WorkspaceMigrationFactory {
},
);
throw new Error(`No factory found for type ${alteredFieldMetadata.type}`);
throw new WorkspaceMigrationException(
`No factory found for type ${alteredFieldMetadata.type}`,
WorkspaceMigrationExceptionCode.NO_FACTORY_FOUND,
);
}
return factory.create(