Payouts fees changes (#478)

* Payouts fees changes

* Update src/queue/payouts.rs

Co-authored-by: triphora <emmaffle@modrinth.com>

Co-authored-by: triphora <emmaffle@modrinth.com>
This commit is contained in:
Geometrically
2022-11-16 13:46:36 -07:00
committed by GitHub
parent ecc500fc91
commit da19a07943
9 changed files with 141 additions and 39 deletions

View File

@@ -264,7 +264,7 @@ pub async fn process_payout(
let members_sum: Decimal =
members.iter().map(|x| x.1).sum();
if members_sum > Decimal::from(0) {
if members_sum > Decimal::ZERO {
for member in members {
let member_multiplier: Decimal =
member.1 / members_sum;
@@ -287,8 +287,8 @@ pub async fn process_payout(
let project_multiplier: Decimal =
Decimal::from(**value) / Decimal::from(multipliers.sum);
let default_split_given = Decimal::from(1);
let split_given = Decimal::from(1) / Decimal::from(5);
let default_split_given = Decimal::ONE;
let split_given = Decimal::ONE / Decimal::from(5);
let split_retention = Decimal::from(4) / Decimal::from(5);
let sum_splits: Decimal =
@@ -296,7 +296,7 @@ pub async fn process_payout(
let sum_tm_splits: Decimal =
project.split_team_members.iter().map(|x| x.1).sum();
if sum_splits > Decimal::from(0) {
if sum_splits > Decimal::ZERO {
for (user_id, split) in project.team_members {
let payout: Decimal = data.amount
* project_multiplier
@@ -307,7 +307,7 @@ pub async fn process_payout(
&default_split_given
});
if payout > Decimal::from(0) {
if payout > Decimal::ZERO {
sqlx::query!(
"
INSERT INTO payouts_values (user_id, mod_id, amount, created)
@@ -336,14 +336,14 @@ pub async fn process_payout(
}
}
if sum_tm_splits > Decimal::from(0) {
if sum_tm_splits > Decimal::ZERO {
for (user_id, split, project_id) in project.split_team_members {
let payout: Decimal = data.amount
* project_multiplier
* (split / sum_tm_splits)
* split_retention;
if payout > Decimal::from(0) {
if payout > Decimal::ZERO {
sqlx::query!(
"
INSERT INTO payouts_values (user_id, mod_id, amount, created)

View File

@@ -274,7 +274,7 @@ pub async fn auth_callback(
created: Utc::now(),
role: Role::Developer.to_string(),
badges: Badges::default(),
balance: Decimal::from(0),
balance: Decimal::ZERO,
payout_wallet: None,
payout_wallet_type: None,
payout_address: None,

View File

@@ -627,7 +627,7 @@ pub async fn project_create_inner(
role: crate::models::teams::OWNER_ROLE.to_owned(),
permissions: crate::models::teams::Permissions::ALL,
accepted: true,
payouts_split: Decimal::from(100),
payouts_split: Decimal::ONE_HUNDRED,
}],
};

View File

@@ -260,7 +260,7 @@ pub async fn add_team_member(
));
}
if new_member.payouts_split < Decimal::from(0)
if new_member.payouts_split < Decimal::ZERO
|| new_member.payouts_split > Decimal::from(5000)
{
return Err(ApiError::InvalidInput(
@@ -425,8 +425,7 @@ pub async fn edit_team_member(
}
if let Some(payouts_split) = edit_member.payouts_split {
if payouts_split < Decimal::from(0)
|| payouts_split > Decimal::from(5000)
if payouts_split < Decimal::ZERO || payouts_split > Decimal::from(5000)
{
return Err(ApiError::InvalidInput(
"Payouts split must be between 0 and 5000!".to_string(),

View File

@@ -345,6 +345,22 @@ pub async fn user_edit(
));
}
let results = sqlx::query!(
"
SELECT EXISTS(SELECT 1 FROM users WHERE id = $1 AND email IS NULL)
",
id as crate::database::models::ids::UserId,
)
.fetch_one(&mut *transaction)
.await?;
if results.exists.unwrap_or(false) {
return Err(ApiError::InvalidInput(
"You must have an email set on your Modrinth account to enroll in the monetization program!"
.to_string(),
));
}
sqlx::query!(
"
UPDATE users
@@ -720,13 +736,25 @@ pub async fn user_payouts_request(
payouts_data.payout_wallet_type
{
if let Some(payout_wallet) = payouts_data.payout_wallet {
let paypal_fee = Decimal::from(1) / Decimal::from(4);
return if data.amount < payouts_data.balance
&& data.amount > paypal_fee
{
return if data.amount < payouts_data.balance {
let mut transaction = pool.begin().await?;
let mut payouts_queue = payouts_queue.lock().await;
let leftover = payouts_queue
.send_payout(PayoutItem {
amount: PayoutAmount {
currency: "USD".to_string(),
value: data.amount,
},
receiver: payout_address,
note: "Payment from Modrinth creator monetization program".to_string(),
recipient_type: payout_wallet_type.to_string().to_uppercase(),
recipient_wallet: payout_wallet.as_str_api().to_string(),
sender_item_id: format!("{}-{}", UserId::from(id), Utc::now().timestamp()),
})
.await?;
sqlx::query!(
"
INSERT INTO historical_payouts (user_id, amount, status)
@@ -745,27 +773,12 @@ pub async fn user_payouts_request(
SET balance = balance - $1
WHERE id = $2
",
data.amount,
data.amount - leftover,
id as crate::database::models::ids::UserId
)
.execute(&mut *transaction)
.await?;
let mut payouts_queue = payouts_queue.lock().await;
payouts_queue
.send_payout(PayoutItem {
amount: PayoutAmount {
currency: "USD".to_string(),
value: (data.amount - paypal_fee).to_string(),
},
receiver: payout_address,
note: "Payment from Modrinth creator monetization program".to_string(),
recipient_type: payout_wallet_type.to_string().to_uppercase(),
recipient_wallet: payout_wallet.as_str_api().to_string(),
sender_item_id: format!("{}-{}", UserId::from(id), Utc::now().timestamp()),
})
.await?;
transaction.commit().await?;
Ok(HttpResponse::NoContent().body(""))