diff --git a/crates/schema/database/mysql_queries/src/errors/database_insert_error.rs b/crates/schema/database/mysql_queries/src/errors/database_insert_error.rs index 23e677975f..26bdf7c49c 100644 --- a/crates/schema/database/mysql_queries/src/errors/database_insert_error.rs +++ b/crates/schema/database/mysql_queries/src/errors/database_insert_error.rs @@ -13,6 +13,7 @@ pub enum DatabaseInsertError { /// An uncategorized non-database error occurred. /// This will likely result in a 500 for the user. + #[deprecated(note = "This is not very semantic. Get rid of it. Stop using it.")] AnyhowError(anyhow::Error), } diff --git a/crates/schema/database/mysql_queries/src/queries/user_referral_codes/create_referral_code.rs b/crates/schema/database/mysql_queries/src/queries/user_referral_codes/create_referral_code.rs index c53334b7b7..30d1f95908 100644 --- a/crates/schema/database/mysql_queries/src/queries/user_referral_codes/create_referral_code.rs +++ b/crates/schema/database/mysql_queries/src/queries/user_referral_codes/create_referral_code.rs @@ -1,3 +1,4 @@ +use crate::errors::database_insert_error::DatabaseInsertError; use sqlx::{Executor, MySql}; use tokens::tokens::user_referral_codes::UserReferralCodeToken; use tokens::tokens::users::UserToken; @@ -11,7 +12,7 @@ pub struct CreateReferralCodeArgs<'a> { pub async fn create_referral_code<'e, 'c: 'e, E>( args: CreateReferralCodeArgs<'_>, mysql_executor: E, -) -> Result +) -> Result where E: 'e + Executor<'c, Database = MySql>, { @@ -33,7 +34,8 @@ VALUES (?, ?, ?, ?) args.owner_user_token.as_str(), ) .execute(mysql_executor) - .await?; + .await + .map_err(DatabaseInsertError::from)?; Ok(token) } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/user_referral_codes/create_referral_code_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/user_referral_codes/create_referral_code_handler.rs index 56539ea561..e01aef6b75 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/user_referral_codes/create_referral_code_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/user_referral_codes/create_referral_code_handler.rs @@ -8,6 +8,7 @@ use utoipa::ToSchema; use artcraft_api_defs::user_referral_codes::create_referral_code::{CreateReferralCodeRequest, CreateReferralCodeResponse}; use crate::http_server::common_responses::advanced_common_web_error::AdvancedCommonWebError; use crate::state::server_state::ServerState; +use mysql_queries::errors::database_insert_error::DatabaseInsertError; use mysql_queries::queries::user_referral_codes::create_referral_code::{create_referral_code, CreateReferralCodeArgs}; use mysql_queries::queries::user_referral_codes::list_referral_codes_for_user::list_referral_codes_for_user; @@ -84,7 +85,7 @@ pub async fn create_referral_code_handler( } // Insert the code. If code_lowercase is already taken, we get a duplicate key error. - let token = create_referral_code( + let result = create_referral_code( CreateReferralCodeArgs { owner_user_token: user_token, code: &code, @@ -93,18 +94,23 @@ pub async fn create_referral_code_handler( &mut *mysql_connection, ).await; - match token { - Ok(token) => Ok(Json(CreateReferralCodeResponse { - success: true, - token, - code, - code_lowercase, - })), - Err(sqlx::Error::Database(db_err)) if db_err.code().as_deref() == Some("23000") => { - Err(AdvancedCommonWebError::BadInputWithSimpleMessage( - "This referral code is already in use".to_string(), - )) - } - Err(e) => Err(AdvancedCommonWebError::from(e)), - } + let token = match result { + Ok(token) => token, + Err(err) => return match err { + DatabaseInsertError::DuplicateKeyError => { + return Err(AdvancedCommonWebError::BadInputWithSimpleMessage( + "This referral code is already in use".to_string(), + )); + }, + DatabaseInsertError::SqlxError(e) => Err(AdvancedCommonWebError::from(e)), + DatabaseInsertError::AnyhowError(e) => Err(AdvancedCommonWebError::from_anyhow_error(e)), + }, + }; + + Ok(Json(CreateReferralCodeResponse { + success: true, + token, + code, + code_lowercase, + })) }