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

@ -1,10 +1,12 @@
import { BadRequestException } from '@nestjs/common';
import {
ForeignDataWrapperOptions,
RemoteServerEntity,
RemoteServerType,
} from 'src/engine/metadata-modules/remote-server/remote-server.entity';
import {
RemoteServerException,
RemoteServerExceptionCode,
} from 'src/engine/metadata-modules/remote-server/remote-server.exception';
import { UserMappingOptions } from 'src/engine/metadata-modules/remote-server/types/user-mapping-options';
export type DeepPartial<T> = {
@ -49,7 +51,10 @@ export const buildUpdateRemoteServerRawQuery = (
}
if (options.length < 1) {
throw new BadRequestException('No fields to update');
throw new RemoteServerException(
'No fields to update',
RemoteServerExceptionCode.INVALID_REMOTE_SERVER_INPUT,
);
}
const rawQuery = `UPDATE metadata."remoteServer" SET ${options.join(

View File

@ -0,0 +1,30 @@
import {
RemoteServerException,
RemoteServerExceptionCode,
} from 'src/engine/metadata-modules/remote-server/remote-server.exception';
import {
UserInputError,
ForbiddenError,
ConflictError,
InternalServerError,
NotFoundError,
} from 'src/engine/utils/graphql-errors.util';
export const remoteServerGraphqlApiExceptionHandler = (error: any) => {
if (error instanceof RemoteServerException) {
switch (error.code) {
case RemoteServerExceptionCode.REMOTE_SERVER_NOT_FOUND:
throw new NotFoundError(error.message);
case RemoteServerExceptionCode.INVALID_REMOTE_SERVER_INPUT:
throw new UserInputError(error.message);
case RemoteServerExceptionCode.REMOTE_SERVER_MUTATION_NOT_ALLOWED:
throw new ForbiddenError(error.message);
case RemoteServerExceptionCode.REMOTE_SERVER_ALREADY_EXISTS:
throw new ConflictError(error.message);
default:
throw new InternalServerError(error.message);
}
}
throw error;
};

View File

@ -1,7 +1,10 @@
import { BadRequestException } from '@nestjs/common';
import { isDefined } from 'class-validator';
import {
RemoteServerException,
RemoteServerExceptionCode,
} from 'src/engine/metadata-modules/remote-server/remote-server.exception';
const INPUT_REGEX = /^([A-Za-z0-9\-_.@]+)$/;
export const validateObjectAgainstInjections = (input: object) => {
@ -21,6 +24,9 @@ export const validateObjectAgainstInjections = (input: object) => {
export const validateStringAgainstInjections = (input: string) => {
if (!INPUT_REGEX.test(input)) {
throw new BadRequestException('Invalid remote server input');
throw new RemoteServerException(
'Invalid remote server input',
RemoteServerExceptionCode.INVALID_REMOTE_SERVER_INPUT,
);
}
};

View File

@ -1,5 +1,3 @@
import { BadRequestException } from '@nestjs/common';
import { Repository } from 'typeorm';
import {
@ -7,6 +5,10 @@ import {
FeatureFlagKeys,
} from 'src/engine/core-modules/feature-flag/feature-flag.entity';
import { RemoteServerType } from 'src/engine/metadata-modules/remote-server/remote-server.entity';
import {
RemoteServerException,
RemoteServerExceptionCode,
} from 'src/engine/metadata-modules/remote-server/remote-server.exception';
export const validateRemoteServerType = async (
remoteServerType: RemoteServerType,
@ -24,7 +26,10 @@ export const validateRemoteServerType = async (
const featureFlagEnabled = featureFlag && featureFlag.value;
if (!featureFlagEnabled) {
throw new BadRequestException(`Type ${remoteServerType} is not supported.`);
throw new RemoteServerException(
`Type ${remoteServerType} is not supported.`,
RemoteServerExceptionCode.INVALID_REMOTE_SERVER_INPUT,
);
}
};
@ -35,8 +40,9 @@ const getFeatureFlagKey = (remoteServerType: RemoteServerType) => {
case RemoteServerType.STRIPE_FDW:
return FeatureFlagKeys.IsStripeIntegrationEnabled;
default:
throw new BadRequestException(
throw new RemoteServerException(
`Type ${remoteServerType} is not supported.`,
RemoteServerExceptionCode.INVALID_REMOTE_SERVER_INPUT,
);
}
};