Fix error handling (#13072)
Fixes https://twenty-v7.sentry.io/issues/6730499496/?environment=prod&environment=prod-eu&project=4507072499810304&query=is%3Aunresolved%20%21issue.type%3A%5Bperformance_consecutive_db_queries%2Cperformance_consecutive_http%2Cperformance_file_io_main_thread%2Cperformance_db_main_thread%2Cperformance_n_plus_one_db_queries%2Cperformance_n_plus_one_api_calls%2Cperformance_p95_endpoint_regression%2Cperformance_slow_db_query%2Cperformance_render_blocking_asset_span%2Cperformance_uncompressed_assets%2Cperformance_http_overhead%2Cperformance_large_http_payload%5D%20timesSeen%3A%3E10&referrer=issue-stream&sort=date&stream_index=0
This commit is contained in:
@ -18,9 +18,7 @@ export class ApprovedAccessDomainExceptionFilter implements ExceptionFilter {
|
|||||||
case ApprovedAccessDomainExceptionCode.APPROVED_ACCESS_DOMAIN_ALREADY_VALIDATED:
|
case ApprovedAccessDomainExceptionCode.APPROVED_ACCESS_DOMAIN_ALREADY_VALIDATED:
|
||||||
case ApprovedAccessDomainExceptionCode.APPROVED_ACCESS_DOMAIN_MUST_BE_A_COMPANY_DOMAIN:
|
case ApprovedAccessDomainExceptionCode.APPROVED_ACCESS_DOMAIN_MUST_BE_A_COMPANY_DOMAIN:
|
||||||
throw new ForbiddenError(exception.message, {
|
throw new ForbiddenError(exception.message, {
|
||||||
extensions: {
|
userFriendlyMessage: exception.userFriendlyMessage,
|
||||||
userFriendlyMessage: exception.userFriendlyMessage,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
default: {
|
default: {
|
||||||
const _exhaustiveCheck: never = exception.code;
|
const _exhaustiveCheck: never = exception.code;
|
||||||
|
|||||||
@ -30,6 +30,11 @@ export enum ErrorCode {
|
|||||||
INTERNAL_SERVER_ERROR = 'INTERNAL_SERVER_ERROR',
|
INTERNAL_SERVER_ERROR = 'INTERNAL_SERVER_ERROR',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RestrictedGraphQLErrorExtensions = {
|
||||||
|
userFriendlyMessage?: string;
|
||||||
|
subCode?: string;
|
||||||
|
};
|
||||||
|
|
||||||
export class BaseGraphQLError extends GraphQLError {
|
export class BaseGraphQLError extends GraphQLError {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
public extensions: Record<string, any>;
|
public extensions: Record<string, any>;
|
||||||
@ -110,7 +115,7 @@ export class ValidationError extends BaseGraphQLError {
|
|||||||
|
|
||||||
export class AuthenticationError extends BaseGraphQLError {
|
export class AuthenticationError extends BaseGraphQLError {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
constructor(message: string, extensions?: Record<string, any>) {
|
constructor(message: string, extensions?: RestrictedGraphQLErrorExtensions) {
|
||||||
super(message, ErrorCode.UNAUTHENTICATED, extensions);
|
super(message, ErrorCode.UNAUTHENTICATED, extensions);
|
||||||
|
|
||||||
Object.defineProperty(this, 'name', { value: 'AuthenticationError' });
|
Object.defineProperty(this, 'name', { value: 'AuthenticationError' });
|
||||||
@ -119,7 +124,7 @@ export class AuthenticationError extends BaseGraphQLError {
|
|||||||
|
|
||||||
export class ForbiddenError extends BaseGraphQLError {
|
export class ForbiddenError extends BaseGraphQLError {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
constructor(message: string, extensions?: Record<string, any>) {
|
constructor(message: string, extensions?: RestrictedGraphQLErrorExtensions) {
|
||||||
super(message, ErrorCode.FORBIDDEN, extensions);
|
super(message, ErrorCode.FORBIDDEN, extensions);
|
||||||
|
|
||||||
Object.defineProperty(this, 'name', { value: 'ForbiddenError' });
|
Object.defineProperty(this, 'name', { value: 'ForbiddenError' });
|
||||||
@ -151,7 +156,7 @@ export class PersistedQueryNotSupportedError extends BaseGraphQLError {
|
|||||||
|
|
||||||
export class UserInputError extends BaseGraphQLError {
|
export class UserInputError extends BaseGraphQLError {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
constructor(message: string, extensions?: Record<string, any>) {
|
constructor(message: string, extensions?: RestrictedGraphQLErrorExtensions) {
|
||||||
super(message, ErrorCode.BAD_USER_INPUT, extensions);
|
super(message, ErrorCode.BAD_USER_INPUT, extensions);
|
||||||
|
|
||||||
Object.defineProperty(this, 'name', { value: 'UserInputError' });
|
Object.defineProperty(this, 'name', { value: 'UserInputError' });
|
||||||
@ -160,7 +165,7 @@ export class UserInputError extends BaseGraphQLError {
|
|||||||
|
|
||||||
export class NotFoundError extends BaseGraphQLError {
|
export class NotFoundError extends BaseGraphQLError {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
constructor(message: string, extensions?: Record<string, any>) {
|
constructor(message: string, extensions?: RestrictedGraphQLErrorExtensions) {
|
||||||
super(message, ErrorCode.NOT_FOUND, extensions);
|
super(message, ErrorCode.NOT_FOUND, extensions);
|
||||||
|
|
||||||
Object.defineProperty(this, 'name', { value: 'NotFoundError' });
|
Object.defineProperty(this, 'name', { value: 'NotFoundError' });
|
||||||
@ -177,7 +182,7 @@ export class MethodNotAllowedError extends BaseGraphQLError {
|
|||||||
|
|
||||||
export class ConflictError extends BaseGraphQLError {
|
export class ConflictError extends BaseGraphQLError {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
constructor(message: string, extensions?: Record<string, any>) {
|
constructor(message: string, extensions?: RestrictedGraphQLErrorExtensions) {
|
||||||
super(message, ErrorCode.CONFLICT, extensions);
|
super(message, ErrorCode.CONFLICT, extensions);
|
||||||
|
|
||||||
Object.defineProperty(this, 'name', { value: 'ConflictError' });
|
Object.defineProperty(this, 'name', { value: 'ConflictError' });
|
||||||
|
|||||||
@ -20,15 +20,11 @@ export const handleWorkflowTriggerException = (
|
|||||||
case WorkflowTriggerExceptionCode.INVALID_WORKFLOW_STATUS:
|
case WorkflowTriggerExceptionCode.INVALID_WORKFLOW_STATUS:
|
||||||
case WorkflowTriggerExceptionCode.FORBIDDEN:
|
case WorkflowTriggerExceptionCode.FORBIDDEN:
|
||||||
throw new UserInputError(exception.message, {
|
throw new UserInputError(exception.message, {
|
||||||
extensions: {
|
userFriendlyMessage: exception.userFriendlyMessage,
|
||||||
userFriendlyMessage: exception.userFriendlyMessage,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
case WorkflowTriggerExceptionCode.NOT_FOUND:
|
case WorkflowTriggerExceptionCode.NOT_FOUND:
|
||||||
throw new NotFoundError(exception.message, {
|
throw new NotFoundError(exception.message, {
|
||||||
extensions: {
|
userFriendlyMessage: exception.userFriendlyMessage,
|
||||||
userFriendlyMessage: exception.userFriendlyMessage,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
case WorkflowTriggerExceptionCode.INTERNAL_ERROR:
|
case WorkflowTriggerExceptionCode.INTERNAL_ERROR:
|
||||||
throw exception;
|
throw exception;
|
||||||
|
|||||||
Reference in New Issue
Block a user