appwrite / sdk-for-node

[READ-ONLY] Official Appwrite Node.js SDK 🟢
https://appwrite.io
BSD 3-Clause "New" or "Revised" License
213 stars 41 forks source link

🐛 Bug Report: Missing type property in the AppwriteException declaration #73

Open Splinteer opened 8 months ago

Splinteer commented 8 months ago

👟 Reproduction steps

When using the node sdk, the AppwriteException doesn't have the type property in the interface

👍 Expected behavior

It should have the property since it's in the original class

👎 Actual Behavior

I actually tells that it doesn't exist

🎲 Appwrite version

Version 0.10.x

💻 Operating system

MacOS

🧱 Your Environment

In local dev

👀 Have you spent some time to check if this issue has been raised before?

🏢 Have you read the Code of Conduct?

I made a PR for this bug: https://github.com/appwrite/sdk-for-node/pull/74

Splinteer commented 8 months ago

It could also be cool to have a proper type for the type property instead of using string and having a dictionnary of possible AppwriteException types like:

export const AppwritePlatformErrors = {
  general_mock: 'general_mock',
  general_argument_invalid: 'general_argument_invalid',
  general_query_limit_exceeded: 'general_query_limit_exceeded',
  general_query_invalid: 'general_query_invalid',
  general_cursor_not_found: 'general_cursor_not_found',
  general_provider_failure: 'general_provider_failure',
  project_unknown: 'project_unknown',
  project_invalid_success_url: 'project_invalid_success_url',
  project_invalid_failure_url: 'project_invalid_failure_url',
  project_reserved_project: 'project_reserved_project',
  project_smtp_config_invalid: 'project_smtp_config_invalid',
  project_key_expired: 'project_key_expired',
  rule_verification_failed: 'rule_verification_failed',
  project_template_default_deletion: 'project_template_default_deletion',
  general_unknown_origin: 'general_unknown_origin',
  general_access_forbidden: 'general_access_forbidden',
  general_unauthorized_scope: 'general_unauthorized_scope',
  general_route_not_found: 'general_route_not_found',
  webhook_not_found: 'webhook_not_found',
  rule_resource_not_found: 'rule_resource_not_found',
  rule_not_found: 'rule_not_found',
  key_not_found: 'key_not_found',
  platform_not_found: 'platform_not_found',
  project_not_found: 'project_not_found',
  router_host_not_found: 'router_host_not_found',
  general_not_implemented: 'general_not_implemented',
  project_already_exists: 'project_already_exists',
  rule_already_exists: 'rule_already_exists',
  project_provider_disabled: 'project_provider_disabled',
  general_rate_limit_exceeded: 'general_rate_limit_exceeded',
  general_unknown: 'general_unknown',
  general_server_error: 'general_server_error',
  general_protocol_unsupported: 'general_protocol_unsupported',
  general_codes_disabled: 'general_codes_disabled',
  router_domain_not_configured: 'router_domain_not_configured',
  general_usage_disabled: 'general_usage_disabled',
  project_provider_unsupported: 'project_provider_unsupported',
  general_service_disabled: 'general_service_disabled',
  general_smtp_disabled: 'general_smtp_disabled',
  general_phone_disabled: 'general_phone_disabled',
} as const;

export const AppwriteAuthErrors = {
  user_password_mismatch: 'user_password_mismatch',
  password_recently_used: 'password_recently_used',
  password_personal_data: 'password_personal_data',
  user_phone_not_found: 'user_phone_not_found',
  user_missing_id: 'user_missing_id',
  user_oauth2_bad_request: 'user_oauth2_bad_request',
  user_jwt_invalid: 'user_jwt_invalid',
  user_blocked: 'user_blocked',
  user_invalid_token: 'user_invalid_token',
  user_email_not_whitelisted: 'user_email_not_whitelisted',
  user_invalid_code: 'user_invalid_code',
  user_ip_not_whitelisted: 'user_ip_not_whitelisted',
  user_invalid_credentials: 'user_invalid_credentials',
  user_anonymous_console_prohibited: 'user_anonymous_console_prohibited',
  user_session_already_exists: 'user_session_already_exists',
  user_unauthorized: 'user_unauthorized',
  user_oauth2_unauthorized: 'user_oauth2_unauthorized',
  team_invalid_secret: 'team_invalid_secret',
  team_invite_mismatch: 'team_invite_mismatch',
  user_not_found: 'user_not_found',
  user_session_not_found: 'user_session_not_found',
  user_identity_not_found: 'user_identity_not_found',
  team_not_found: 'team_not_found',
  team_invite_not_found: 'team_invite_not_found',
  team_membership_mismatch: 'team_membership_mismatch',
  membership_not_found: 'membership_not_found',
  user_already_exists: 'user_already_exists',
  user_email_already_exists: 'user_email_already_exists',
  user_phone_already_exists: 'user_phone_already_exists',
  team_invite_already_exists: 'team_invite_already_exists',
  team_already_exists: 'team_already_exists',
  membership_already_confirmed: 'membership_already_confirmed',
  user_password_reset_required: 'user_password_reset_required',
  user_oauth2_provider_error: 'user_oauth2_provider_error',
  user_count_exceeded: 'user_count_exceeded',
  user_auth_method_unsupported: 'user_auth_method_unsupported',
} as const;

export const AppwriteDatabaseErrors = {
  collection_limit_exceeded: 'collection_limit_exceeded',
  document_invalid_structure: 'document_invalid_structure',
  document_missing_data: 'document_missing_data',
  document_missing_payload: 'document_missing_payload',
  attribute_unknown: 'attribute_unknown',
  attribute_not_available: 'attribute_not_available',
  attribute_format_unsupported: 'attribute_format_unsupported',
  attribute_default_unsupported: 'attribute_default_unsupported',
  attribute_limit_exceeded: 'attribute_limit_exceeded',
  attribute_value_invalid: 'attribute_value_invalid',
  attribute_type_invalid: 'attribute_type_invalid',
  index_limit_exceeded: 'index_limit_exceeded',
  index_invalid: 'index_invalid',
  document_delete_restricted: 'document_delete_restricted',
  execution_not_found: 'execution_not_found',
  database_not_found: 'database_not_found',
  collection_not_found: 'collection_not_found',
  document_not_found: 'document_not_found',
  attribute_not_found: 'attribute_not_found',
  index_not_found: 'index_not_found',
  database_already_exists: 'database_already_exists',
  collection_already_exists: 'collection_already_exists',
  document_already_exists: 'document_already_exists',
  document_update_conflict: 'document_update_conflict',
  attribute_already_exists: 'attribute_already_exists',
  index_already_exists: 'index_already_exists',
} as const;

export const AppwriteStorageErrors = {
  storage_device_not_found: 'storage_device_not_found',
  storage_file_empty: 'storage_file_empty',
  storage_file_type_unsupported: 'storage_file_type_unsupported',
  storage_invalid_file_size: 'storage_invalid_file_size',
  storage_invalid_content_range: 'storage_invalid_content_range',
  storage_invalid_appwrite_id: 'storage_invalid_appwrite_id',
  storage_invalid_file: 'storage_invalid_file',
  storage_file_not_found: 'storage_file_not_found',
  storage_bucket_not_found: 'storage_bucket_not_found',
  storage_file_already_exists: 'storage_file_already_exists',
  storage_bucket_already_exists: 'storage_bucket_already_exists',
  storage_invalid_range: 'storage_invalid_range',
} as const;

const AppwriteFunctionsErrors = {
  build_not_ready: 'build_not_ready',
  build_in_progress: 'build_in_progress',
  installation_not_found: 'installation_not_found',
  provider_repository_not_found: 'provider_repository_not_found',
  repository_not_found: 'repository_not_found',
  function_not_found: 'function_not_found',
  function_runtime_unsupported: 'function_runtime_unsupported',
  build_not_found: 'build_not_found',
  deployment_not_found: 'deployment_not_found',
  variable_not_found: 'variable_not_found',
  provider_contribution_conflict: 'provider_contribution_conflict',
  variable_already_exists: 'variable_already_exists',
} as const;

const AppwriteMigrationErrors = {
  migration_not_found: 'migration_not_found',
  migration_already_exists: 'migration_already_exists',
  migration_in_progress: 'migration_in_progress',
} as const;

const AppwriteAvatarErrors = {
  avatar_set_not_found: 'avatar_set_not_found',
  avatar_not_found: 'avatar_not_found',
  avatar_image_not_found: 'avatar_image_not_found',
  avatar_remote_url_failed: 'avatar_remote_url_failed',
  avatar_icon_not_found: 'avatar_icon_not_found',
} as const;

export const AppwriteGraphQLErrors = {
  graphql_no_query: 'graphql_no_query',
  graphql_too_many_queries: 'graphql_too_many_queries',
} as const;

export type AppwriteExceptionTypes =
  | (typeof AppwritePlatformErrors)[keyof typeof AppwritePlatformErrors]
  | (typeof AppwriteAuthErrors)[keyof typeof AppwriteAuthErrors]
  | (typeof AppwriteDatabaseErrors)[keyof typeof AppwriteDatabaseErrors]
  | (typeof AppwriteStorageErrors)[keyof typeof AppwriteStorageErrors]
  | (typeof AppwriteFunctionsErrors)[keyof typeof AppwriteFunctionsErrors]
  | (typeof AppwriteMigrationErrors)[keyof typeof AppwriteMigrationErrors]
  | (typeof AppwriteAvatarErrors)[keyof typeof AppwriteAvatarErrors]
  | (typeof AppwriteGraphQLErrors)[keyof typeof AppwriteGraphQLErrors];
hadnet commented 2 weeks ago

The response prop of AppwriteException declares string, but the response is actually an object in version 1.6.0: https://github.com/appwrite/sdk-for-node/blob/7a2418cafaf3cff4247b2e8d9c106e1ab7e9288b/src/client.ts#L23

response: {
    message: 'Invalid token passed in the request.',
    code: 401,
    type: 'user_invalid_token',
    version: '1.6.0'
  }