import { type MessageDescriptor } from '@lingui/core'; import { msg } from '@lingui/core/macro'; import { assertUnreachable } from 'twenty-shared/utils'; import { STANDARD_ERROR_MESSAGE } from 'src/engine/api/common/common-query-runners/errors/standard-error-message.constant'; import { CustomException } from 'src/utils/custom-exception'; export enum TwentyORMExceptionCode { METADATA_VERSION_MISMATCH = 'METADATA_VERSION_MISMATCH', WORKSPACE_SCHEMA_NOT_FOUND = 'WORKSPACE_SCHEMA_NOT_FOUND', ROLES_PERMISSIONS_VERSION_NOT_FOUND = 'ROLES_PERMISSIONS_VERSION_NOT_FOUND', FEATURE_FLAG_MAP_VERSION_NOT_FOUND = 'FEATURE_FLAG_MAP_VERSION_NOT_FOUND', USER_WORKSPACE_ROLE_MAP_VERSION_NOT_FOUND = 'USER_WORKSPACE_ROLE_MAP_VERSION_NOT_FOUND', API_KEY_ROLE_MAP_VERSION_NOT_FOUND = 'API_KEY_ROLE_MAP_VERSION_NOT_FOUND', MALFORMED_METADATA = 'MALFORMED_METADATA', WORKSPACE_NOT_FOUND = 'WORKSPACE_NOT_FOUND', CONNECT_RECORD_NOT_FOUND = 'CONNECT_RECORD_NOT_FOUND', CONNECT_NOT_ALLOWED = 'CONNECT_NOT_ALLOWED', CONNECT_UNIQUE_CONSTRAINT_ERROR = 'CONNECT_UNIQUE_CONSTRAINT_ERROR', MISSING_MAIN_ALIAS_TARGET = 'MISSING_MAIN_ALIAS_TARGET', METHOD_NOT_ALLOWED = 'METHOD_NOT_ALLOWED', ENUM_TYPE_NAME_NOT_FOUND = 'ENUM_TYPE_NAME_NOT_FOUND', QUERY_READ_TIMEOUT = 'QUERY_READ_TIMEOUT', DUPLICATE_ENTRY_DETECTED = 'DUPLICATE_ENTRY_DETECTED', TOO_MANY_RECORDS_TO_UPDATE = 'TOO_MANY_RECORDS_TO_UPDATE', INVALID_INPUT = 'INVALID_INPUT', ORM_EVENT_DATA_CORRUPTED = 'ORM_EVENT_DATA_CORRUPTED', RLS_VALIDATION_FAILED = 'RLS_VALIDATION_FAILED', NO_ROLE_FOUND_FOR_USER_WORKSPACE = 'NO_ROLE_FOUND_FOR_USER_WORKSPACE', } const getTwentyORMExceptionUserFriendlyMessage = ( code: TwentyORMExceptionCode, ) => { switch (code) { case TwentyORMExceptionCode.METADATA_VERSION_MISMATCH: return msg`Data version mismatch. Please refresh and try again.`; case TwentyORMExceptionCode.WORKSPACE_SCHEMA_NOT_FOUND: return msg`Workspace schema not found.`; case TwentyORMExceptionCode.ROLES_PERMISSIONS_VERSION_NOT_FOUND: return msg`Roles and permissions configuration not found.`; case TwentyORMExceptionCode.FEATURE_FLAG_MAP_VERSION_NOT_FOUND: return msg`Feature configuration not found.`; case TwentyORMExceptionCode.USER_WORKSPACE_ROLE_MAP_VERSION_NOT_FOUND: return msg`User workspace role configuration not found.`; case TwentyORMExceptionCode.API_KEY_ROLE_MAP_VERSION_NOT_FOUND: return msg`API key role configuration not found.`; case TwentyORMExceptionCode.MALFORMED_METADATA: return msg`Data structure is invalid.`; case TwentyORMExceptionCode.WORKSPACE_NOT_FOUND: return msg`Workspace not found.`; case TwentyORMExceptionCode.CONNECT_RECORD_NOT_FOUND: return msg`Related record not found.`; case TwentyORMExceptionCode.CONNECT_NOT_ALLOWED: return msg`This connection is not allowed.`; case TwentyORMExceptionCode.CONNECT_UNIQUE_CONSTRAINT_ERROR: return msg`A record with this relationship already exists.`; case TwentyORMExceptionCode.MISSING_MAIN_ALIAS_TARGET: return msg`Missing main alias target.`; case TwentyORMExceptionCode.METHOD_NOT_ALLOWED: return msg`This operation is not allowed.`; case TwentyORMExceptionCode.QUERY_READ_TIMEOUT: return msg`Query timed out. Please try again.`; case TwentyORMExceptionCode.DUPLICATE_ENTRY_DETECTED: return msg`A duplicate entry was detected.`; case TwentyORMExceptionCode.TOO_MANY_RECORDS_TO_UPDATE: return msg`Too many records to update at once.`; case TwentyORMExceptionCode.INVALID_INPUT: return msg`Invalid input provided.`; case TwentyORMExceptionCode.RLS_VALIDATION_FAILED: return msg`Record does not satisfy security constraints.`; case TwentyORMExceptionCode.ENUM_TYPE_NAME_NOT_FOUND: case TwentyORMExceptionCode.ORM_EVENT_DATA_CORRUPTED: return STANDARD_ERROR_MESSAGE; case TwentyORMExceptionCode.NO_ROLE_FOUND_FOR_USER_WORKSPACE: return msg`No role found for user.`; default: assertUnreachable(code); } }; export class TwentyORMException extends CustomException { constructor( message: string, code: TwentyORMExceptionCode, { userFriendlyMessage }: { userFriendlyMessage?: MessageDescriptor } = {}, ) { super(message, code, { userFriendlyMessage: userFriendlyMessage ?? getTwentyORMExceptionUserFriendlyMessage(code), }); } }