import { type MessageDescriptor } from '@lingui/core'; import { msg } from '@lingui/core/macro'; import { assertUnreachable } from 'twenty-shared/utils'; import { CustomException } from 'src/utils/custom-exception'; export enum LogicFunctionExceptionCode { LOGIC_FUNCTION_NOT_FOUND = 'LOGIC_FUNCTION_NOT_FOUND', LOGIC_FUNCTION_ALREADY_EXIST = 'LOGIC_FUNCTION_ALREADY_EXIST', LOGIC_FUNCTION_NOT_READY = 'LOGIC_FUNCTION_NOT_READY', LOGIC_FUNCTION_BUILDING = 'LOGIC_FUNCTION_BUILDING', LOGIC_FUNCTION_CODE_UNCHANGED = 'LOGIC_FUNCTION_CODE_UNCHANGED', LOGIC_FUNCTION_EXECUTION_LIMIT_REACHED = 'LOGIC_FUNCTION_EXECUTION_LIMIT_REACHED', LOGIC_FUNCTION_CREATE_FAILED = 'LOGIC_FUNCTION_CREATE_FAILED', LOGIC_FUNCTION_COMPILATION_FAILED = 'LOGIC_FUNCTION_COMPILATION_FAILED', LOGIC_FUNCTION_EXECUTION_TIMEOUT = 'LOGIC_FUNCTION_EXECUTION_TIMEOUT', LOGIC_FUNCTION_PLATFORM_EXECUTION_ERROR = 'LOGIC_FUNCTION_PLATFORM_EXECUTION_ERROR', LOGIC_FUNCTION_LAYER_BUILD_FAILED = 'LOGIC_FUNCTION_LAYER_BUILD_FAILED', LOGIC_FUNCTION_DISABLED = 'LOGIC_FUNCTION_DISABLED', LOGIC_FUNCTION_INVALID_SEED_PROJECT = 'LOGIC_FUNCTION_INVALID_SEED_PROJECT', INVALID_LOGIC_FUNCTION_INPUT = 'INVALID_LOGIC_FUNCTION_INPUT', LOGIC_FUNCTION_PREBUILT_BUNDLE_NOT_INSTALLED = 'LOGIC_FUNCTION_PREBUILT_BUNDLE_NOT_INSTALLED', } const getLogicFunctionExceptionUserFriendlyMessage = ( code: LogicFunctionExceptionCode, ) => { switch (code) { case LogicFunctionExceptionCode.LOGIC_FUNCTION_NOT_FOUND: return msg`Function not found.`; case LogicFunctionExceptionCode.LOGIC_FUNCTION_ALREADY_EXIST: return msg`A function with this name already exists.`; case LogicFunctionExceptionCode.LOGIC_FUNCTION_NOT_READY: return msg`Function is not ready.`; case LogicFunctionExceptionCode.LOGIC_FUNCTION_BUILDING: return msg`Function is currently building.`; case LogicFunctionExceptionCode.LOGIC_FUNCTION_CODE_UNCHANGED: return msg`Function code is unchanged.`; case LogicFunctionExceptionCode.LOGIC_FUNCTION_EXECUTION_LIMIT_REACHED: return msg`Function execution limit reached.`; case LogicFunctionExceptionCode.LOGIC_FUNCTION_CREATE_FAILED: return msg`Failed to create function.`; case LogicFunctionExceptionCode.LOGIC_FUNCTION_COMPILATION_FAILED: return msg`Function code failed to compile.`; case LogicFunctionExceptionCode.LOGIC_FUNCTION_EXECUTION_TIMEOUT: return msg`Function execution timed out.`; case LogicFunctionExceptionCode.LOGIC_FUNCTION_PLATFORM_EXECUTION_ERROR: return msg`Function execution failed.`; case LogicFunctionExceptionCode.LOGIC_FUNCTION_LAYER_BUILD_FAILED: return msg`Failed to build function dependencies.`; case LogicFunctionExceptionCode.LOGIC_FUNCTION_DISABLED: return msg`Logic function execution is disabled.`; case LogicFunctionExceptionCode.LOGIC_FUNCTION_INVALID_SEED_PROJECT: return msg`Invalid seed project configuration.`; case LogicFunctionExceptionCode.INVALID_LOGIC_FUNCTION_INPUT: return msg`Invalid logic function input.`; case LogicFunctionExceptionCode.LOGIC_FUNCTION_PREBUILT_BUNDLE_NOT_INSTALLED: return msg`Prebuilt bundle is not installed on the function. Rebuild and try again.`; default: assertUnreachable(code); } }; export class LogicFunctionException extends CustomException { constructor( message: string, code: LogicFunctionExceptionCode, { userFriendlyMessage }: { userFriendlyMessage?: MessageDescriptor } = {}, ) { super(message, code, { userFriendlyMessage: userFriendlyMessage ?? getLogicFunctionExceptionUserFriendlyMessage(code), }); } }