diff --git a/apps/labrinth/.sqlx/query-0379424a41b12db94c7734086fca5b96c8cdfe0a9f9c00e5c67e6b95a33c8c6b.json b/apps/labrinth/.sqlx/query-0379424a41b12db94c7734086fca5b96c8cdfe0a9f9c00e5c67e6b95a33c8c6b.json deleted file mode 100644 index d3188818e..000000000 --- a/apps/labrinth/.sqlx/query-0379424a41b12db94c7734086fca5b96c8cdfe0a9f9c00e5c67e6b95a33c8c6b.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT SUM(amount)\n FROM payouts_values\n WHERE user_id = $1 AND date_available > NOW()\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "sum", - "type_info": "Numeric" - } - ], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [ - null - ] - }, - "hash": "0379424a41b12db94c7734086fca5b96c8cdfe0a9f9c00e5c67e6b95a33c8c6b" -} diff --git a/apps/labrinth/.sqlx/query-0a31f7b04f4b68c556bdbfe373ef7945741f915d4ae657363fe67db46e8bd4cf.json b/apps/labrinth/.sqlx/query-0a31f7b04f4b68c556bdbfe373ef7945741f915d4ae657363fe67db46e8bd4cf.json deleted file mode 100644 index 07ef85af5..000000000 --- a/apps/labrinth/.sqlx/query-0a31f7b04f4b68c556bdbfe373ef7945741f915d4ae657363fe67db46e8bd4cf.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT SUM(amount)\n FROM payouts_values\n WHERE user_id = $1 AND date_available <= NOW()\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "sum", - "type_info": "Numeric" - } - ], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [ - null - ] - }, - "hash": "0a31f7b04f4b68c556bdbfe373ef7945741f915d4ae657363fe67db46e8bd4cf" -} diff --git a/apps/labrinth/.sqlx/query-58fbda9daed27c5c466849a944ab3df193679cef17e8588ac3be79978b60bdab.json b/apps/labrinth/.sqlx/query-58fbda9daed27c5c466849a944ab3df193679cef17e8588ac3be79978b60bdab.json new file mode 100644 index 000000000..22e0f6006 --- /dev/null +++ b/apps/labrinth/.sqlx/query-58fbda9daed27c5c466849a944ab3df193679cef17e8588ac3be79978b60bdab.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT date_available, SUM(amount) sum\n FROM payouts_values\n WHERE user_id = $1\n GROUP BY date_available\n ORDER BY date_available DESC\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "date_available", + "type_info": "Timestamptz" + }, + { + "ordinal": 1, + "name": "sum", + "type_info": "Numeric" + } + ], + "parameters": { + "Left": [ + "Int8" + ] + }, + "nullable": [ + false, + null + ] + }, + "hash": "58fbda9daed27c5c466849a944ab3df193679cef17e8588ac3be79978b60bdab" +} diff --git a/apps/labrinth/src/routes/v3/payouts.rs b/apps/labrinth/src/routes/v3/payouts.rs index ad5636de1..1ed74e323 100644 --- a/apps/labrinth/src/routes/v3/payouts.rs +++ b/apps/labrinth/src/routes/v3/payouts.rs @@ -9,7 +9,7 @@ use crate::queue::payouts::{make_aditude_request, PayoutsQueue}; use crate::queue::session::AuthQueue; use crate::routes::ApiError; use actix_web::{delete, get, post, web, HttpRequest, HttpResponse}; -use chrono::{Datelike, Duration, TimeZone, Utc, Weekday}; +use chrono::{DateTime, Datelike, Duration, TimeZone, Utc, Weekday}; use hex::ToHex; use hmac::{Hmac, Mac, NewMac}; use reqwest::Method; @@ -763,6 +763,7 @@ pub async fn payment_methods( pub struct UserBalance { pub available: Decimal, pub pending: Decimal, + pub dates: HashMap, Decimal>, } #[get("balance")] @@ -791,27 +792,27 @@ async fn get_user_balance( user_id: crate::database::models::ids::UserId, pool: &PgPool, ) -> Result { - let available = sqlx::query!( + let payouts = sqlx::query!( " - SELECT SUM(amount) + SELECT date_available, SUM(amount) sum FROM payouts_values - WHERE user_id = $1 AND date_available <= NOW() + WHERE user_id = $1 + GROUP BY date_available + ORDER BY date_available DESC ", user_id.0 ) - .fetch_optional(pool) + .fetch_all(pool) .await?; - let pending = sqlx::query!( - " - SELECT SUM(amount) - FROM payouts_values - WHERE user_id = $1 AND date_available > NOW() - ", - user_id.0 - ) - .fetch_optional(pool) - .await?; + let available = payouts + .iter() + .filter(|x| x.date_available <= Utc::now()) + .fold(Decimal::ZERO, |acc, x| acc + x.sum.unwrap_or(Decimal::ZERO)); + let pending = payouts + .iter() + .filter(|x| x.date_available > Utc::now()) + .fold(Decimal::ZERO, |acc, x| acc + x.sum.unwrap_or(Decimal::ZERO)); let withdrawn = sqlx::query!( " @@ -824,12 +825,6 @@ async fn get_user_balance( .fetch_optional(pool) .await?; - let available = available - .map(|x| x.sum.unwrap_or(Decimal::ZERO)) - .unwrap_or(Decimal::ZERO); - let pending = pending - .map(|x| x.sum.unwrap_or(Decimal::ZERO)) - .unwrap_or(Decimal::ZERO); let (withdrawn, fees) = withdrawn .map(|x| { ( @@ -844,6 +839,10 @@ async fn get_user_balance( - withdrawn.round_dp(16) - fees.round_dp(16), pending, + dates: payouts + .iter() + .map(|x| (x.date_available, x.sum.unwrap_or(Decimal::ZERO))) + .collect(), }) }