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:
@ -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(
|
||||
|
||||
@ -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;
|
||||
};
|
||||
@ -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,
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
@ -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,
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user