appwrite/src/Appwrite/Extend/Exception.php

473 lines
22 KiB
PHP
Raw Normal View History

<?php
2022-01-29 22:49:52 +00:00
namespace Appwrite\Extend;
use Utopia\Config\Config;
class Exception extends \Exception
{
/**
* Error Codes
2022-05-23 14:54:50 +00:00
*
* Naming the error types based on the following convention
2022-02-01 08:39:07 +00:00
* <ENTITY>_<ERROR_TYPE>
2022-05-23 14:54:50 +00:00
*
2022-09-21 17:23:36 +00:00
* Appwrite has the following entities:
2022-02-07 21:10:36 +00:00
* - General
2022-02-01 08:39:07 +00:00
* - Users
* - Teams
* - Memberships
2022-02-06 21:42:03 +00:00
* - Avatars
* - Storage
2022-02-01 08:39:07 +00:00
* - Functions
* - Deployments
* - Executions
2022-02-06 21:42:03 +00:00
* - Collections
* - Documents
* - Attributes
* - Indexes
* - Projects
* - Webhooks
* - Keys
* - Platform
* - Domain
2022-04-26 07:49:36 +00:00
* - GraphQL
2023-08-04 16:21:41 +00:00
* - Migrations
2022-02-01 08:39:07 +00:00
*/
2022-02-07 21:10:36 +00:00
/** General */
2025-09-03 11:54:21 +00:00
public const string GENERAL_UNKNOWN = 'general_unknown';
public const string GENERAL_MOCK = 'general_mock';
public const string GENERAL_ACCESS_FORBIDDEN = 'general_access_forbidden';
public const string GENERAL_RESOURCE_BLOCKED = 'general_resource_blocked';
public const string GENERAL_UNKNOWN_ORIGIN = 'general_unknown_origin';
public const string GENERAL_API_DISABLED = 'general_api_disabled';
public const string GENERAL_SERVICE_DISABLED = 'general_service_disabled';
public const string GENERAL_UNAUTHORIZED_SCOPE = 'general_unauthorized_scope';
public const string GENERAL_RATE_LIMIT_EXCEEDED = 'general_rate_limit_exceeded';
public const string GENERAL_SMTP_DISABLED = 'general_smtp_disabled';
public const string GENERAL_PHONE_DISABLED = 'general_phone_disabled';
public const string GENERAL_ARGUMENT_INVALID = 'general_argument_invalid';
public const string GENERAL_COLUMN_QUERY_LIMIT_EXCEEDED = 'general_column_query_limit_exceeded';
public const string GENERAL_ATTRIBUTE_QUERY_LIMIT_EXCEEDED = 'general_attribute_query_limit_exceeded';
public const string GENERAL_QUERY_INVALID = 'general_query_invalid';
public const string GENERAL_ROUTE_NOT_FOUND = 'general_route_not_found';
public const string GENERAL_CURSOR_NOT_FOUND = 'general_cursor_not_found';
public const string GENERAL_SERVER_ERROR = 'general_server_error';
public const string GENERAL_PROTOCOL_UNSUPPORTED = 'general_protocol_unsupported';
public const string GENERAL_CODES_DISABLED = 'general_codes_disabled';
public const string GENERAL_USAGE_DISABLED = 'general_usage_disabled';
public const string GENERAL_NOT_IMPLEMENTED = 'general_not_implemented';
public const string GENERAL_INVALID_EMAIL = 'general_invalid_email';
public const string GENERAL_INVALID_PHONE = 'general_invalid_phone';
public const string GENERAL_REGION_ACCESS_DENIED = 'general_region_access_denied';
public const string GENERAL_BAD_REQUEST = 'general_bad_request';
2022-02-07 21:10:36 +00:00
2022-02-01 08:39:07 +00:00
/** Users */
2025-09-03 11:54:21 +00:00
public const string USER_COUNT_EXCEEDED = 'user_count_exceeded';
public const string USER_CONSOLE_COUNT_EXCEEDED = 'user_console_count_exceeded';
public const string USER_JWT_INVALID = 'user_jwt_invalid';
public const string USER_ALREADY_EXISTS = 'user_already_exists';
public const string USER_BLOCKED = 'user_blocked';
public const string USER_INVALID_TOKEN = 'user_invalid_token';
public const string USER_PASSWORD_RESET_REQUIRED = 'user_password_reset_required';
public const string USER_EMAIL_NOT_WHITELISTED = 'user_email_not_whitelisted';
public const string USER_IP_NOT_WHITELISTED = 'user_ip_not_whitelisted';
public const string USER_INVALID_CODE = 'user_invalid_code';
public const string USER_INVALID_CREDENTIALS = 'user_invalid_credentials';
public const string USER_ANONYMOUS_CONSOLE_PROHIBITED = 'user_anonymous_console_prohibited';
public const string USER_SESSION_ALREADY_EXISTS = 'user_session_already_exists';
public const string USER_NOT_FOUND = 'user_not_found';
public const string USER_PASSWORD_RECENTLY_USED = 'password_recently_used';
public const string USER_PASSWORD_PERSONAL_DATA = 'password_personal_data';
public const string USER_EMAIL_ALREADY_EXISTS = 'user_email_already_exists';
public const string USER_PASSWORD_MISMATCH = 'user_password_mismatch';
public const string USER_SESSION_NOT_FOUND = 'user_session_not_found';
public const string USER_IDENTITY_NOT_FOUND = 'user_identity_not_found';
public const string USER_UNAUTHORIZED = 'user_unauthorized';
public const string USER_AUTH_METHOD_UNSUPPORTED = 'user_auth_method_unsupported';
public const string USER_PHONE_ALREADY_EXISTS = 'user_phone_already_exists';
public const string USER_PHONE_NOT_FOUND = 'user_phone_not_found';
public const string USER_PHONE_NOT_VERIFIED = 'user_phone_not_verified';
public const string USER_EMAIL_NOT_FOUND = 'user_email_not_found';
public const string USER_EMAIL_NOT_VERIFIED = 'user_email_not_verified';
public const string USER_MISSING_ID = 'user_missing_id';
public const string USER_MORE_FACTORS_REQUIRED = 'user_more_factors_required';
public const string USER_INVALID_CHALLENGE = 'user_invalid_challenge';
public const string USER_AUTHENTICATOR_NOT_FOUND = 'user_authenticator_not_found';
public const string USER_AUTHENTICATOR_ALREADY_VERIFIED = 'user_authenticator_already_verified';
public const string USER_RECOVERY_CODES_ALREADY_EXISTS = 'user_recovery_codes_already_exists';
public const string USER_RECOVERY_CODES_NOT_FOUND = 'user_recovery_codes_not_found';
public const string USER_CHALLENGE_REQUIRED = 'user_challenge_required';
public const string USER_OAUTH2_BAD_REQUEST = 'user_oauth2_bad_request';
public const string USER_OAUTH2_UNAUTHORIZED = 'user_oauth2_unauthorized';
public const string USER_OAUTH2_PROVIDER_ERROR = 'user_oauth2_provider_error';
public const string USER_EMAIL_ALREADY_VERIFIED = 'user_email_already_verified';
public const string USER_PHONE_ALREADY_VERIFIED = 'user_phone_already_verified';
public const string USER_DELETION_PROHIBITED = 'user_deletion_prohibited';
public const string USER_TARGET_NOT_FOUND = 'user_target_not_found';
public const string USER_TARGET_ALREADY_EXISTS = 'user_target_already_exists';
public const string USER_API_KEY_AND_SESSION_SET = 'user_key_and_session_set';
public const string API_KEY_EXPIRED = 'api_key_expired';
2024-05-06 09:55:59 +00:00
/** Teams */
2025-09-03 11:54:21 +00:00
public const string TEAM_NOT_FOUND = 'team_not_found';
public const string TEAM_INVITE_NOT_FOUND = 'team_invite_not_found';
public const string TEAM_INVALID_SECRET = 'team_invalid_secret';
public const string TEAM_MEMBERSHIP_MISMATCH = 'team_membership_mismatch';
public const string TEAM_INVITE_MISMATCH = 'team_invite_mismatch';
public const string TEAM_ALREADY_EXISTS = 'team_already_exists';
2024-11-17 17:15:03 +00:00
/** Console */
2025-09-03 11:54:21 +00:00
public const string RESOURCE_ALREADY_EXISTS = 'resource_already_exists';
2024-11-17 17:15:03 +00:00
/** Membership */
2025-09-03 11:54:21 +00:00
public const string MEMBERSHIP_NOT_FOUND = 'membership_not_found';
public const string MEMBERSHIP_ALREADY_CONFIRMED = 'membership_already_confirmed';
public const string MEMBERSHIP_DELETION_PROHIBITED = 'membership_deletion_prohibited';
public const string MEMBERSHIP_DOWNGRADE_PROHIBITED = 'membership_downgrade_prohibited';
/** Avatars */
2025-09-03 11:54:21 +00:00
public const string AVATAR_SET_NOT_FOUND = 'avatar_set_not_found';
public const string AVATAR_NOT_FOUND = 'avatar_not_found';
public const string AVATAR_IMAGE_NOT_FOUND = 'avatar_image_not_found';
public const string AVATAR_REMOTE_URL_FAILED = 'avatar_remote_url_failed';
public const string AVATAR_ICON_NOT_FOUND = 'avatar_icon_not_found';
public const string AVATAR_SVG_SANITIZATION_FAILED = 'avatar_svg_sanitization_failed';
/** Storage */
2025-09-03 11:54:21 +00:00
public const string STORAGE_FILE_ALREADY_EXISTS = 'storage_file_already_exists';
public const string STORAGE_FILE_NOT_FOUND = 'storage_file_not_found';
public const string STORAGE_DEVICE_NOT_FOUND = 'storage_device_not_found';
public const string STORAGE_FILE_EMPTY = 'storage_file_empty';
public const string STORAGE_FILE_TYPE_UNSUPPORTED = 'storage_file_type_unsupported';
public const string STORAGE_INVALID_FILE_SIZE = 'storage_invalid_file_size';
public const string STORAGE_INVALID_FILE = 'storage_invalid_file';
public const string STORAGE_BUCKET_ALREADY_EXISTS = 'storage_bucket_already_exists';
public const string STORAGE_BUCKET_NOT_FOUND = 'storage_bucket_not_found';
public const string STORAGE_INVALID_CONTENT_RANGE = 'storage_invalid_content_range';
public const string STORAGE_INVALID_RANGE = 'storage_invalid_range';
public const string STORAGE_INVALID_APPWRITE_ID = 'storage_invalid_appwrite_id';
public const string STORAGE_FILE_NOT_PUBLIC = 'storage_file_not_public';
public const string STORAGE_BUCKET_TRANSFORMATIONS_DISABLED = 'storage_bucket_transformations_disabled';
/** VCS */
2025-09-03 11:54:21 +00:00
public const string INSTALLATION_NOT_FOUND = 'installation_not_found';
public const string PROVIDER_REPOSITORY_NOT_FOUND = 'provider_repository_not_found';
public const string REPOSITORY_NOT_FOUND = 'repository_not_found';
public const string PROVIDER_CONTRIBUTION_CONFLICT = 'provider_contribution_conflict';
public const string GENERAL_PROVIDER_FAILURE = 'general_provider_failure';
2024-10-22 15:01:38 +00:00
/** Sites */
2025-09-03 11:54:21 +00:00
public const string SITE_NOT_FOUND = 'site_not_found';
public const string SITE_TEMPLATE_NOT_FOUND = 'site_template_not_found';
2024-10-22 15:01:38 +00:00
/** Functions */
2025-09-03 11:54:21 +00:00
public const string FUNCTION_NOT_FOUND = 'function_not_found';
public const string FUNCTION_ALREADY_EXISTS = 'function_already_exists';
2025-09-03 11:54:21 +00:00
public const string FUNCTION_RUNTIME_UNSUPPORTED = 'function_runtime_unsupported';
public const string FUNCTION_ENTRYPOINT_MISSING = 'function_entrypoint_missing';
public const string FUNCTION_SYNCHRONOUS_TIMEOUT = 'function_synchronous_timeout';
public const string FUNCTION_TEMPLATE_NOT_FOUND = 'function_template_not_found';
public const string FUNCTION_RUNTIME_NOT_DETECTED = 'function_runtime_not_detected';
public const string FUNCTION_EXECUTE_PERMISSION_MISSING = 'function_execute_permission_missing';
/** Deployments */
2025-09-03 11:54:21 +00:00
public const string DEPLOYMENT_NOT_FOUND = 'deployment_not_found';
2022-02-27 11:57:41 +00:00
/** Builds */
2025-09-03 11:54:21 +00:00
public const string BUILD_NOT_FOUND = 'build_not_found';
public const string BUILD_NOT_READY = 'build_not_ready';
public const string BUILD_IN_PROGRESS = 'build_in_progress';
public const string BUILD_ALREADY_COMPLETED = 'build_already_completed';
public const string BUILD_CANCELED = 'build_canceled';
public const string BUILD_FAILED = 'build_failed';
2022-02-27 11:57:41 +00:00
/** Execution */
2025-09-03 11:54:21 +00:00
public const string EXECUTION_NOT_FOUND = 'execution_not_found';
public const string EXECUTION_IN_PROGRESS = 'execution_in_progress';
2024-11-29 12:57:51 +00:00
/** Log */
2025-09-03 11:54:21 +00:00
public const string LOG_NOT_FOUND = 'log_not_found';
2024-11-29 12:57:51 +00:00
Database layer (#3338) * database response model * database collection config * new database scopes * database service update * database execption codes * remove read write permission from database model * updating tests and fixing some bugs * server side tests are now passing * databases api * tests for database endpoint * composer update * fix error * formatting * formatting fixes * get database test * more updates to events and usage * more usage updates * fix delete type * fix test * delete database * more fixes * databaseId in attributes and indexes * more fixes * fix issues * fix index subquery * fix console scope and index query * updating tests as required * fix phpcs errors and warnings * updates to review suggestions * UI progress * ui updates and cleaning up * fix type * rework database events * update tests * update types * event generation fixed * events config updated * updating context to support multiple * realtime updates * fix ids * update context * validator updates * fix naming conflict * fix tests * fix lint errors * fix wprler and realtime tests * fix webhooks test * fix event validator and other tests * formatting fixes * removing leftover var_dumps * remove leftover comment * update usage params * usage metrics updates * update database usage * fix usage * specs update * updates to usage * fix UI and usage * fix lints * internal id fixes * fixes for internal Id * renaming services and related files * rename tests * rename doc link * rename readme * fix test name * tests: fixes for 0.15.x sync Co-authored-by: Torsten Dittmann <torsten.dittmann@googlemail.com>
2022-06-22 10:51:49 +00:00
/** Databases */
2025-09-03 11:54:21 +00:00
public const string DATABASE_NOT_FOUND = 'database_not_found';
public const string DATABASE_ALREADY_EXISTS = 'database_already_exists';
public const string DATABASE_TIMEOUT = 'database_timeout';
public const string DATABASE_QUERY_ORDER_NULL = 'database_query_order_null';
Database layer (#3338) * database response model * database collection config * new database scopes * database service update * database execption codes * remove read write permission from database model * updating tests and fixing some bugs * server side tests are now passing * databases api * tests for database endpoint * composer update * fix error * formatting * formatting fixes * get database test * more updates to events and usage * more usage updates * fix delete type * fix test * delete database * more fixes * databaseId in attributes and indexes * more fixes * fix issues * fix index subquery * fix console scope and index query * updating tests as required * fix phpcs errors and warnings * updates to review suggestions * UI progress * ui updates and cleaning up * fix type * rework database events * update tests * update types * event generation fixed * events config updated * updating context to support multiple * realtime updates * fix ids * update context * validator updates * fix naming conflict * fix tests * fix lint errors * fix wprler and realtime tests * fix webhooks test * fix event validator and other tests * formatting fixes * removing leftover var_dumps * remove leftover comment * update usage params * usage metrics updates * update database usage * fix usage * specs update * updates to usage * fix UI and usage * fix lints * internal id fixes * fixes for internal Id * renaming services and related files * rename tests * rename doc link * rename readme * fix test name * tests: fixes for 0.15.x sync Co-authored-by: Torsten Dittmann <torsten.dittmann@googlemail.com>
2022-06-22 10:51:49 +00:00
/** Collections */
2025-09-03 11:54:21 +00:00
public const string COLLECTION_NOT_FOUND = 'collection_not_found';
public const string COLLECTION_ALREADY_EXISTS = 'collection_already_exists';
public const string COLLECTION_LIMIT_EXCEEDED = 'collection_limit_exceeded';
2022-05-23 14:54:50 +00:00
/** Tables */
2025-09-03 11:54:21 +00:00
public const string TABLE_NOT_FOUND = 'table_not_found';
public const string TABLE_ALREADY_EXISTS = 'table_already_exists';
public const string TABLE_LIMIT_EXCEEDED = 'table_limit_exceeded';
2022-05-23 14:54:50 +00:00
2022-02-06 21:42:03 +00:00
/** Documents */
2025-09-03 11:54:21 +00:00
public const string DOCUMENT_NOT_FOUND = 'document_not_found';
public const string DOCUMENT_INVALID_STRUCTURE = 'document_invalid_structure';
public const string DOCUMENT_MISSING_DATA = 'document_missing_data';
public const string DOCUMENT_MISSING_PAYLOAD = 'document_missing_payload';
public const string DOCUMENT_ALREADY_EXISTS = 'document_already_exists';
public const string DOCUMENT_UPDATE_CONFLICT = 'document_update_conflict';
public const string DOCUMENT_DELETE_RESTRICTED = 'document_delete_restricted';
2025-05-06 11:18:04 +00:00
/** Rows */
2025-09-03 11:54:21 +00:00
public const string ROW_NOT_FOUND = 'row_not_found';
public const string ROW_INVALID_STRUCTURE = 'row_invalid_structure';
public const string ROW_MISSING_DATA = 'row_missing_data';
public const string ROW_MISSING_PAYLOAD = 'row_missing_payload';
public const string ROW_ALREADY_EXISTS = 'row_already_exists';
public const string ROW_UPDATE_CONFLICT = 'row_update_conflict';
public const string ROW_DELETE_RESTRICTED = 'row_delete_restricted';
/** Attributes */
2025-09-03 11:54:21 +00:00
public const string ATTRIBUTE_NOT_FOUND = 'attribute_not_found';
public const string ATTRIBUTE_UNKNOWN = 'attribute_unknown';
public const string ATTRIBUTE_NOT_AVAILABLE = 'attribute_not_available';
public const string ATTRIBUTE_FORMAT_UNSUPPORTED = 'attribute_format_unsupported';
public const string ATTRIBUTE_DEFAULT_UNSUPPORTED = 'attribute_default_unsupported';
public const string ATTRIBUTE_ALREADY_EXISTS = 'attribute_already_exists';
public const string ATTRIBUTE_LIMIT_EXCEEDED = 'attribute_limit_exceeded';
public const string ATTRIBUTE_VALUE_INVALID = 'attribute_value_invalid';
public const string ATTRIBUTE_TYPE_INVALID = 'attribute_type_invalid';
public const string ATTRIBUTE_INVALID_RESIZE = 'attribute_invalid_resize';
2025-09-02 12:03:30 +00:00
public const ATTRIBUTE_TYPE_NOT_SUPPORTED = 'ATTRIBUTE_TYPE_NOT_SUPPORTED';
/** Columns */
2025-09-03 11:54:21 +00:00
public const string COLUMN_NOT_FOUND = 'column_not_found';
public const string COLUMN_UNKNOWN = 'column_unknown';
public const string COLUMN_NOT_AVAILABLE = 'column_not_available';
public const string COLUMN_FORMAT_UNSUPPORTED = 'column_format_unsupported';
public const string COLUMN_DEFAULT_UNSUPPORTED = 'column_default_unsupported';
public const string COLUMN_ALREADY_EXISTS = 'column_already_exists';
public const string COLUMN_LIMIT_EXCEEDED = 'column_limit_exceeded';
public const string COLUMN_VALUE_INVALID = 'column_value_invalid';
public const string COLUMN_TYPE_INVALID = 'column_type_invalid';
public const string COLUMN_INVALID_RESIZE = 'column_invalid_resize';
2025-09-02 12:03:30 +00:00
public const COLUMN_TYPE_NOT_SUPPORTED = 'COLUMN_TYPE_NOT_SUPPORTED';
2024-04-09 12:32:23 +00:00
/** Relationship */
2025-09-03 11:54:21 +00:00
public const string RELATIONSHIP_VALUE_INVALID = 'relationship_value_invalid';
2024-04-09 12:32:23 +00:00
/** Indexes */
2025-09-03 11:54:21 +00:00
public const string INDEX_NOT_FOUND = 'index_not_found';
public const string INDEX_LIMIT_EXCEEDED = 'index_limit_exceeded';
public const string INDEX_ALREADY_EXISTS = 'index_already_exists';
public const string INDEX_INVALID = 'index_invalid';
public const string INDEX_DEPENDENCY = 'index_dependency';
2025-05-08 08:45:00 +00:00
/** Column Indexes */
2025-09-03 11:54:21 +00:00
public const string COLUMN_INDEX_NOT_FOUND = 'column_index_not_found';
public const string COLUMN_INDEX_LIMIT_EXCEEDED = 'column_index_limit_exceeded';
public const string COLUMN_INDEX_ALREADY_EXISTS = 'column_index_already_exists';
public const string COLUMN_INDEX_INVALID = 'column_index_invalid';
public const string COLUMN_INDEX_DEPENDENCY = 'column_index_dependency';
2025-05-08 08:45:00 +00:00
2025-06-17 20:01:56 +00:00
/** Transactions */
2025-09-03 11:54:21 +00:00
public const string TRANSACTION_NOT_FOUND = 'transaction_not_found';
public const string TRANSACTION_ALREADY_EXISTS = 'transaction_already_exists';
public const string TRANSACTION_INVALID = 'transaction_invalid';
public const string TRANSACTION_FAILED = 'transaction_failed';
public const string TRANSACTION_EXPIRED = 'transaction_expired';
public const string TRANSACTION_CONFLICT = 'transaction_conflict';
public const string TRANSACTION_LIMIT_EXCEEDED = 'transaction_limit_exceeded';
public const string TRANSACTION_NOT_READY = 'transaction_not_ready';
2025-06-17 20:01:56 +00:00
2022-02-06 12:49:01 +00:00
/** Projects */
2025-09-03 11:54:21 +00:00
public const string PROJECT_NOT_FOUND = 'project_not_found';
public const string PROJECT_PROVIDER_DISABLED = 'project_provider_disabled';
public const string PROJECT_PROVIDER_UNSUPPORTED = 'project_provider_unsupported';
public const string PROJECT_ALREADY_EXISTS = 'project_already_exists';
public const string PROJECT_INVALID_SUCCESS_URL = 'project_invalid_success_url';
public const string PROJECT_INVALID_FAILURE_URL = 'project_invalid_failure_url';
public const string PROJECT_RESERVED_PROJECT = 'project_reserved_project';
public const string PROJECT_KEY_EXPIRED = 'project_key_expired';
2025-09-03 11:54:21 +00:00
public const string PROJECT_SMTP_CONFIG_INVALID = 'project_smtp_config_invalid';
2023-05-23 05:09:17 +00:00
2025-09-03 11:54:21 +00:00
public const string PROJECT_TEMPLATE_DEFAULT_DELETION = 'project_template_default_deletion';
2023-04-19 08:44:22 +00:00
2025-09-03 11:54:21 +00:00
public const string PROJECT_REGION_UNSUPPORTED = 'project_region_unsupported';
/** Webhooks */
2025-09-03 11:54:21 +00:00
public const string WEBHOOK_NOT_FOUND = 'webhook_not_found';
/** Router */
2025-09-03 11:54:21 +00:00
public const string ROUTER_HOST_NOT_FOUND = 'router_host_not_found';
public const string ROUTER_DOMAIN_NOT_CONFIGURED = 'router_domain_not_configured';
2023-03-08 18:30:01 +00:00
/** Proxy */
2025-09-03 11:54:21 +00:00
public const string RULE_RESOURCE_NOT_FOUND = 'rule_resource_not_found';
public const string RULE_NOT_FOUND = 'rule_not_found';
public const string RULE_ALREADY_EXISTS = 'rule_already_exists';
public const string RULE_VERIFICATION_FAILED = 'rule_verification_failed';
2023-03-08 18:30:01 +00:00
/** Keys */
2025-09-03 11:54:21 +00:00
public const string KEY_NOT_FOUND = 'key_not_found';
2022-07-20 07:18:49 +00:00
/** Variables */
2025-09-03 11:54:21 +00:00
public const string VARIABLE_NOT_FOUND = 'variable_not_found';
public const string VARIABLE_ALREADY_EXISTS = 'variable_already_exists';
public const string VARIABLE_CANNOT_UNSET_SECRET = 'variable_cannot_unset_secret';
2022-07-20 07:18:49 +00:00
/** Platform */
2025-09-03 11:54:21 +00:00
public const string PLATFORM_NOT_FOUND = 'platform_not_found';
2022-04-26 07:49:36 +00:00
/** GraphqQL */
2025-09-03 11:54:21 +00:00
public const string GRAPHQL_NO_QUERY = 'graphql_no_query';
public const string GRAPHQL_TOO_MANY_QUERIES = 'graphql_too_many_queries';
2022-02-01 08:39:07 +00:00
2023-08-04 16:21:41 +00:00
/** Migrations */
2025-09-03 11:54:21 +00:00
public const string MIGRATION_NOT_FOUND = 'migration_not_found';
public const string MIGRATION_ALREADY_EXISTS = 'migration_already_exists';
public const string MIGRATION_IN_PROGRESS = 'migration_in_progress';
public const string MIGRATION_PROVIDER_ERROR = 'migration_provider_error';
2023-08-04 16:21:41 +00:00
2023-10-24 12:32:22 +00:00
/** Realtime */
2025-09-03 11:54:21 +00:00
public const string REALTIME_MESSAGE_FORMAT_INVALID = 'realtime_message_format_invalid';
public const string REALTIME_TOO_MANY_MESSAGES = 'realtime_too_many_messages';
public const string REALTIME_POLICY_VIOLATION = 'realtime_policy_violation';
2023-11-16 18:21:09 +00:00
/** Health */
2025-09-03 11:54:21 +00:00
public const string HEALTH_QUEUE_SIZE_EXCEEDED = 'health_queue_size_exceeded';
public const string HEALTH_CERTIFICATE_EXPIRED = 'health_certificate_expired';
public const string HEALTH_INVALID_HOST = 'health_invalid_host';
2023-08-04 16:21:41 +00:00
/** Provider */
2025-09-03 11:54:21 +00:00
public const string PROVIDER_NOT_FOUND = 'provider_not_found';
public const string PROVIDER_ALREADY_EXISTS = 'provider_already_exists';
public const string PROVIDER_INCORRECT_TYPE = 'provider_incorrect_type';
public const string PROVIDER_MISSING_CREDENTIALS = 'provider_missing_credentials';
2023-08-24 20:15:17 +00:00
/** Topic */
2025-09-03 11:54:21 +00:00
public const string TOPIC_NOT_FOUND = 'topic_not_found';
public const string TOPIC_ALREADY_EXISTS = 'topic_already_exists';
2023-08-28 15:11:05 +00:00
/** Subscriber */
2025-09-03 11:54:21 +00:00
public const string SUBSCRIBER_NOT_FOUND = 'subscriber_not_found';
public const string SUBSCRIBER_ALREADY_EXISTS = 'subscriber_already_exists';
2023-08-24 20:15:17 +00:00
2023-09-21 10:56:53 +00:00
/** Message */
2025-09-03 11:54:21 +00:00
public const string MESSAGE_NOT_FOUND = 'message_not_found';
public const string MESSAGE_MISSING_TARGET = 'message_missing_target';
public const string MESSAGE_ALREADY_SENT = 'message_already_sent';
public const string MESSAGE_ALREADY_PROCESSING = 'message_already_processing';
public const string MESSAGE_ALREADY_FAILED = 'message_already_failed';
public const string MESSAGE_ALREADY_SCHEDULED = 'message_already_scheduled';
public const string MESSAGE_TARGET_NOT_EMAIL = 'message_target_not_email';
public const string MESSAGE_TARGET_NOT_SMS = 'message_target_not_sms';
public const string MESSAGE_TARGET_NOT_PUSH = 'message_target_not_push';
public const string MESSAGE_MISSING_SCHEDULE = 'message_missing_schedule';
/** Targets */
2025-09-03 11:54:21 +00:00
public const string TARGET_PROVIDER_INVALID_TYPE = 'target_provider_invalid_type';
2024-01-11 03:06:59 +00:00
/** Schedules */
2025-09-03 11:54:21 +00:00
public const string SCHEDULE_NOT_FOUND = 'schedule_not_found';
2024-01-11 03:06:59 +00:00
2024-11-18 07:38:48 +00:00
/** Tokens */
2025-09-03 11:54:21 +00:00
public const string TOKEN_NOT_FOUND = 'token_not_found';
public const string TOKEN_EXPIRED = 'token_expired';
public const string TOKEN_RESOURCE_TYPE_INVALID = 'token_resource_type_invalid';
2023-09-21 10:56:53 +00:00
2023-10-24 12:32:22 +00:00
protected string $type = '';
protected array $errors = [];
2024-02-12 01:18:19 +00:00
protected bool $publish;
2025-04-09 04:43:54 +00:00
private array $ctas = [];
2025-04-15 09:40:32 +00:00
private ?string $view = null;
2022-02-01 08:39:07 +00:00
2025-09-03 11:54:21 +00:00
public function __construct(
string $type = Exception::GENERAL_UNKNOWN,
string $message = null,
int|string $code = null,
\Throwable $previous = null,
2025-12-11 10:29:24 +00:00
?string $view = null,
array $params = []
2025-09-03 15:57:03 +00:00
) {
2022-08-14 07:19:19 +00:00
$this->errors = Config::getParam('errors');
$this->type = $type;
2025-04-09 04:43:54 +00:00
$this->view = $view;
2024-02-12 01:18:19 +00:00
$this->code = $code ?? $this->errors[$type]['code'];
2024-03-28 12:36:44 +00:00
2024-05-24 11:04:30 +00:00
// Mark string errors like HY001 from PDO as 500 errors
2024-09-04 09:06:59 +00:00
if (\is_string($this->code)) {
if (\is_numeric($this->code)) {
2025-09-03 11:54:21 +00:00
$this->code = (int)$this->code;
} else {
$this->code = 500;
}
2024-03-28 12:36:44 +00:00
}
2025-12-11 10:29:24 +00:00
// Format message with params if provided
if (!empty($params) && $message === null) {
$description = $this->errors[$type]['description'] ?? '';
$this->message = !empty($description) ? sprintf($description, ...$params) : '';
} else {
$this->message = $message ?? $this->errors[$type]['description'];
}
2024-02-12 01:18:19 +00:00
$this->publish = $this->errors[$type]['publish'] ?? ($this->code >= 500);
parent::__construct($this->message, $this->code, $previous);
}
/**
2022-02-08 23:08:23 +00:00
* Get the type of the exception.
2022-05-23 14:54:50 +00:00
*
* @return string
2022-05-23 14:54:50 +00:00
*/
public function getType(): string
{
return $this->type;
}
2022-02-08 23:08:23 +00:00
/**
* Set the type of the exception.
2022-05-23 14:54:50 +00:00
*
* @param string $type
*
2022-02-08 23:08:23 +00:00
* @return void
*/
public function setType(string $type): void
{
$this->type = $type;
}
2023-11-16 18:21:09 +00:00
/**
2023-11-17 18:34:57 +00:00
* Check whether the log is publishable for the exception.
2023-11-16 18:21:09 +00:00
*
* @return bool
*/
2023-11-17 18:34:57 +00:00
public function isPublishable(): bool
2023-11-16 18:21:09 +00:00
{
2023-11-17 18:34:57 +00:00
return $this->publish;
2023-11-16 18:21:09 +00:00
}
2025-04-09 04:43:54 +00:00
2025-04-15 09:40:32 +00:00
public function addCTA(string $label, ?string $url = null): self
2025-04-09 04:43:54 +00:00
{
$this->ctas[] = [
'label' => $label,
'url' => $url
];
return $this;
}
public function getCTAs(): array
{
return $this->ctas;
}
2025-04-15 09:40:32 +00:00
public function getView(): ?string
2025-04-09 04:43:54 +00:00
{
return $this->view;
}
2022-05-23 14:54:50 +00:00
}