From fa3d67977052c3aa8c1c22c1099d93ee02047b9a Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 13 Oct 2023 11:19:33 +0800 Subject: [PATCH] chore: replace sqlx error with custom DatabaseError --- libs/database-entity/src/database_error.rs | 5 +++- libs/database/src/resource_usage.rs | 26 +++++++++++--------- libs/database/src/user.rs | 11 +++++---- libs/database/src/workspace.rs | 28 ++++++++++++---------- libs/shared-entity/src/app_error.rs | 6 ++--- 5 files changed, 44 insertions(+), 32 deletions(-) diff --git a/libs/database-entity/src/database_error.rs b/libs/database-entity/src/database_error.rs index 25ee8a47..938937c3 100644 --- a/libs/database-entity/src/database_error.rs +++ b/libs/database-entity/src/database_error.rs @@ -15,6 +15,9 @@ pub enum DatabaseError { #[error(transparent)] UuidError(#[from] uuid::Error), + #[error(transparent)] + SqlxError(sqlx::Error), + #[error("Storage space not enough")] StorageSpaceNotEnough, @@ -35,7 +38,7 @@ impl From for DatabaseError { fn from(value: sqlx::Error) -> Self { match value { Error::RowNotFound => DatabaseError::RecordNotFound, - _ => DatabaseError::Internal(value.into()), + _ => DatabaseError::SqlxError(value), } } } diff --git a/libs/database/src/resource_usage.rs b/libs/database/src/resource_usage.rs index 05fe42df..7581a109 100644 --- a/libs/database/src/resource_usage.rs +++ b/libs/database/src/resource_usage.rs @@ -1,3 +1,4 @@ +use database_entity::database_error::DatabaseError; use database_entity::AFBlobMetadata; use rust_decimal::prelude::ToPrimitive; use sqlx::types::Decimal; @@ -10,7 +11,7 @@ pub async fn is_blob_metadata_exists( pool: &PgPool, workspace_id: &Uuid, file_id: &str, -) -> Result { +) -> Result { let exists: (bool,) = sqlx::query_as( r#" SELECT EXISTS ( @@ -35,8 +36,8 @@ pub async fn insert_blob_metadata( workspace_id: &Uuid, file_type: &str, file_size: i64, -) -> Result { - sqlx::query_as!( +) -> Result { + let metadata = sqlx::query_as!( AFBlobMetadata, r#" INSERT INTO af_blob_metadata @@ -53,7 +54,8 @@ pub async fn insert_blob_metadata( file_size ) .fetch_one(pg_pool) - .await + .await?; + Ok(metadata) } #[instrument(level = "trace", skip_all, err)] @@ -61,8 +63,8 @@ pub async fn delete_blob_metadata( pg_pool: &PgPool, workspace_id: &Uuid, file_id: &str, -) -> Result { - sqlx::query_as!( +) -> Result { + let metadata = sqlx::query_as!( AFBlobMetadata, r#" DELETE FROM af_blob_metadata @@ -73,7 +75,8 @@ pub async fn delete_blob_metadata( file_id, ) .fetch_one(pg_pool) - .await + .await?; + Ok(metadata) } #[instrument(level = "trace", skip_all, err)] @@ -81,8 +84,8 @@ pub async fn get_blob_metadata( pg_pool: &PgPool, workspace_id: &Uuid, file_id: &str, -) -> Result { - sqlx::query_as!( +) -> Result { + let metadata = sqlx::query_as!( AFBlobMetadata, r#" SELECT * FROM af_blob_metadata @@ -92,14 +95,15 @@ pub async fn get_blob_metadata( file_id, ) .fetch_one(pg_pool) - .await + .await?; + Ok(metadata) } #[instrument(level = "trace", skip_all, err)] pub async fn get_workspace_usage_size( pool: &PgPool, workspace_id: &Uuid, -) -> Result { +) -> Result { let row: (Option,) = sqlx::query_as(r#"SELECT SUM(file_size) FROM af_blob_metadata WHERE workspace_id = $1;"#) .bind(workspace_id) diff --git a/libs/database/src/user.rs b/libs/database/src/user.rs index 2bc804f9..6a03484f 100644 --- a/libs/database/src/user.rs +++ b/libs/database/src/user.rs @@ -1,4 +1,5 @@ -use anyhow::{Context, Error}; +use anyhow::Context; +use database_entity::database_error::DatabaseError; use sqlx::PgPool; use tracing::instrument; @@ -6,7 +7,7 @@ pub async fn update_user_name( pool: &PgPool, uuid: &uuid::Uuid, name: &str, -) -> Result<(), sqlx::Error> { +) -> Result<(), DatabaseError> { sqlx::query!( r#" UPDATE af_user @@ -27,7 +28,7 @@ pub async fn create_user_if_not_exists( user_uuid: &uuid::Uuid, email: &str, name: &str, -) -> Result { +) -> Result { let affected_rows = sqlx::query!( r#" INSERT INTO af_user (uuid, email, name) @@ -46,7 +47,7 @@ pub async fn create_user_if_not_exists( .execute(pool) .await .context(format!( - "Fail to insert user. uuid: {}, name: {}, email: {}", + "Fail to insert user to db. uuid: {}, name: {}, email: {}", user_uuid, name, email ))? .rows_affected(); @@ -54,7 +55,7 @@ pub async fn create_user_if_not_exists( Ok(affected_rows > 0) } -pub async fn uid_from_uuid(pool: &PgPool, gotrue_uuid: &uuid::Uuid) -> Result { +pub async fn uid_from_uuid(pool: &PgPool, gotrue_uuid: &uuid::Uuid) -> Result { let uid = sqlx::query!( r#" SELECT uid FROM af_user WHERE uuid = $1 diff --git a/libs/database/src/workspace.rs b/libs/database/src/workspace.rs index b2893493..f1700f9c 100644 --- a/libs/database/src/workspace.rs +++ b/libs/database/src/workspace.rs @@ -3,13 +3,14 @@ use sqlx::{ PgPool, }; +use database_entity::database_error::DatabaseError; use database_entity::{AFRole, AFUserProfileView, AFWorkspace, AFWorkspaceMember}; pub async fn select_all_workspaces_owned( pool: &PgPool, owner_uuid: &Uuid, -) -> Result, sqlx::Error> { - sqlx::query_as!( +) -> Result, DatabaseError> { + let workspaces = sqlx::query_as!( AFWorkspace, r#" SELECT * FROM public.af_workspace WHERE owner_uid = ( @@ -19,14 +20,15 @@ pub async fn select_all_workspaces_owned( owner_uuid ) .fetch_all(pool) - .await + .await?; + Ok(workspaces) } pub async fn select_user_is_workspace_owner( pg_pool: &PgPool, user_uuid: &Uuid, workspace_uuid: &Uuid, -) -> Result { +) -> Result { let exists = sqlx::query_scalar!( r#" SELECT EXISTS( @@ -50,7 +52,7 @@ pub async fn insert_workspace_members( workspace_id: &uuid::Uuid, member_emails: &[String], role: AFRole, -) -> Result<(), sqlx::Error> { +) -> Result<(), DatabaseError> { sqlx::query!( r#" INSERT INTO public.af_workspace_member (workspace_id, uid, role_id) @@ -74,7 +76,7 @@ pub async fn delete_workspace_members( pool: &PgPool, workspace_id: &uuid::Uuid, member_emails: &[String], -) -> Result<(), sqlx::Error> { +) -> Result<(), DatabaseError> { sqlx::query!( r#" DELETE FROM public.af_workspace_member @@ -94,8 +96,8 @@ pub async fn delete_workspace_members( pub async fn select_workspace_members( pg_pool: &PgPool, workspace_id: &uuid::Uuid, -) -> Result, sqlx::Error> { - sqlx::query_as!( +) -> Result, DatabaseError> { + let members = sqlx::query_as!( AFWorkspaceMember, r#" SELECT af_user.email, af_workspace_member.role_id AS role @@ -106,14 +108,15 @@ pub async fn select_workspace_members( workspace_id ) .fetch_all(pg_pool) - .await + .await?; + Ok(members) } pub async fn select_user_profile_view_by_uuid( pool: &PgPool, user_uuid: &Uuid, -) -> Result, sqlx::Error> { - sqlx::query_as!( +) -> Result, DatabaseError> { + let user_profile = sqlx::query_as!( AFUserProfileView, r#" SELECT * @@ -122,5 +125,6 @@ pub async fn select_user_profile_view_by_uuid( user_uuid ) .fetch_optional(pool) - .await + .await?; + Ok(user_profile) } diff --git a/libs/shared-entity/src/app_error.rs b/libs/shared-entity/src/app_error.rs index b920196c..496be407 100644 --- a/libs/shared-entity/src/app_error.rs +++ b/libs/shared-entity/src/app_error.rs @@ -45,9 +45,9 @@ impl actix_web::error::ResponseError for AppError { // impl From for AppError { fn from(err: anyhow::Error) -> Self { - match err.downcast_ref::() { - None => AppError::new(ErrorCode::Unhandled, err.to_string()), - Some(err) => err.clone(), + match err.downcast::() { + Err(err) => AppError::new(ErrorCode::Unhandled, err.to_string()), + Ok(err) => err, } } }