From c22ac1e60abadb7196cb26ef50ffa6b9756156ce Mon Sep 17 00:00:00 2001 From: Geometrically <18202329+Geometrically@users.noreply.github.com> Date: Wed, 9 Nov 2022 16:01:10 -0700 Subject: [PATCH] Support unenrolling from payouts (#476) --- sqlx-data.json | 42 +++++++++++++-------- src/routes/users.rs | 89 +++++++++++++++++++++++++++------------------ 2 files changed, 81 insertions(+), 50 deletions(-) diff --git a/sqlx-data.json b/sqlx-data.json index 7f1e597dd..d4b0133d5 100644 --- a/sqlx-data.json +++ b/sqlx-data.json @@ -3576,6 +3576,21 @@ }, "query": "\n DELETE FROM team_members\n WHERE (team_id = $1 AND user_id = $2 AND NOT role = $3)\n " }, + "8cbd74dad7a21128d99fd32b430c2e0427480f910e1f125ff56b893c67a6e8a4": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar", + "Int8" + ] + } + }, + "query": "\n UPDATE users\n SET payout_wallet = $1, payout_wallet_type = $2, payout_address = $3\n WHERE (id = $4)\n " + }, "8ced4b7a1c4f944b918d2d2eefc8007a3fb9565021ca8c44608caccbe1ab9674": { "describe": { "columns": [ @@ -5032,21 +5047,6 @@ }, "query": "\n UPDATE mods\n SET license_url = $1\n WHERE (id = $2)\n " }, - "c11a0f7ca3959ede1655c4f244cfe4461701218d26e28152306bca5c46f1abd5": { - "describe": { - "columns": [], - "nullable": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar", - "Int8" - ] - } - }, - "query": "\n UPDATE users\n SET payout_wallet = $1, payout_wallet_type = $2, payout_address = $3\n WHERE (id = $4)\n " - }, "c15534b7259e2b138c6f041bf2a9f4c77bea060a9bce6f2a829a2d7594dddd3a": { "describe": { "columns": [ @@ -5224,6 +5224,18 @@ }, "query": "SELECT id FROM versions WHERE mod_id = $1 AND (version_number = $2 OR id = $3) ORDER BY date_published ASC" }, + "c4b167ec7452cc92be0e33f7e4f3908f0c4109291511c94909e9105fc62a432f": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Left": [ + "Int8" + ] + } + }, + "query": "\n UPDATE users\n SET payout_wallet = NULL, payout_wallet_type = NULL, payout_address = NULL\n WHERE (id = $1)\n " + }, "c545a74e902c5c63bca1057b76e94b9547ee21fadbc61964f45837915d5f4608": { "describe": { "columns": [], diff --git a/src/routes/users.rs b/src/routes/users.rs index 22ac063e1..ffcbe974f 100644 --- a/src/routes/users.rs +++ b/src/routes/users.rs @@ -160,8 +160,13 @@ pub struct EditUser { pub bio: Option>, pub role: Option, pub badges: Option, + #[serde( + default, + skip_serializing_if = "Option::is_none", + with = "::serde_with::rust::double_option" + )] #[validate] - pub payout_data: Option, + pub payout_data: Option>, } #[derive(Serialize, Deserialize, Validate)] @@ -315,42 +320,56 @@ pub async fn user_edit( } if let Some(payout_data) = &new_user.payout_data { - if payout_data.payout_wallet_type == RecipientType::UserHandle - && payout_data.payout_wallet == RecipientWallet::Paypal - { - return Err(ApiError::InvalidInput( - "You cannot use a paypal wallet with a user handle!" - .to_string(), - )); - } - - if !match payout_data.payout_wallet_type { - RecipientType::Email => { - validator::validate_email(&payout_data.payout_address) + if let Some(payout_data) = payout_data { + if payout_data.payout_wallet_type + == RecipientType::UserHandle + && payout_data.payout_wallet == RecipientWallet::Paypal + { + return Err(ApiError::InvalidInput( + "You cannot use a paypal wallet with a user handle!" + .to_string(), + )); } - RecipientType::Phone => { - validator::validate_phone(&payout_data.payout_address) - } - RecipientType::UserHandle => true, - } { - return Err(ApiError::InvalidInput( - "Invalid wallet specified!".to_string(), - )); - } - sqlx::query!( - " - UPDATE users - SET payout_wallet = $1, payout_wallet_type = $2, payout_address = $3 - WHERE (id = $4) - ", - payout_data.payout_wallet.as_str(), - payout_data.payout_wallet_type.as_str(), - payout_data.payout_address, - id as crate::database::models::ids::UserId, - ) - .execute(&mut *transaction) - .await?; + if !match payout_data.payout_wallet_type { + RecipientType::Email => validator::validate_email( + &payout_data.payout_address, + ), + RecipientType::Phone => validator::validate_phone( + &payout_data.payout_address, + ), + RecipientType::UserHandle => true, + } { + return Err(ApiError::InvalidInput( + "Invalid wallet specified!".to_string(), + )); + } + + sqlx::query!( + " + UPDATE users + SET payout_wallet = $1, payout_wallet_type = $2, payout_address = $3 + WHERE (id = $4) + ", + payout_data.payout_wallet.as_str(), + payout_data.payout_wallet_type.as_str(), + payout_data.payout_address, + id as crate::database::models::ids::UserId, + ) + .execute(&mut *transaction) + .await?; + } else { + sqlx::query!( + " + UPDATE users + SET payout_wallet = NULL, payout_wallet_type = NULL, payout_address = NULL + WHERE (id = $1) + ", + id as crate::database::models::ids::UserId, + ) + .execute(&mut *transaction) + .await?; + } } transaction.commit().await?;