Segment pending revenue in API response (#3283)

This commit is contained in:
Jai Agrawal 2025-02-20 15:07:54 -08:00 committed by GitHub
parent f75d824c92
commit 067f471766
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 48 additions and 65 deletions

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -9,7 +9,7 @@ use crate::queue::payouts::{make_aditude_request, PayoutsQueue};
use crate::queue::session::AuthQueue; use crate::queue::session::AuthQueue;
use crate::routes::ApiError; use crate::routes::ApiError;
use actix_web::{delete, get, post, web, HttpRequest, HttpResponse}; 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 hex::ToHex;
use hmac::{Hmac, Mac, NewMac}; use hmac::{Hmac, Mac, NewMac};
use reqwest::Method; use reqwest::Method;
@ -763,6 +763,7 @@ pub async fn payment_methods(
pub struct UserBalance { pub struct UserBalance {
pub available: Decimal, pub available: Decimal,
pub pending: Decimal, pub pending: Decimal,
pub dates: HashMap<DateTime<Utc>, Decimal>,
} }
#[get("balance")] #[get("balance")]
@ -791,27 +792,27 @@ async fn get_user_balance(
user_id: crate::database::models::ids::UserId, user_id: crate::database::models::ids::UserId,
pool: &PgPool, pool: &PgPool,
) -> Result<UserBalance, sqlx::Error> { ) -> Result<UserBalance, sqlx::Error> {
let available = sqlx::query!( let payouts = sqlx::query!(
" "
SELECT SUM(amount) SELECT date_available, SUM(amount) sum
FROM payouts_values 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 user_id.0
) )
.fetch_optional(pool) .fetch_all(pool)
.await?; .await?;
let pending = sqlx::query!( let available = payouts
" .iter()
SELECT SUM(amount) .filter(|x| x.date_available <= Utc::now())
FROM payouts_values .fold(Decimal::ZERO, |acc, x| acc + x.sum.unwrap_or(Decimal::ZERO));
WHERE user_id = $1 AND date_available > NOW() let pending = payouts
", .iter()
user_id.0 .filter(|x| x.date_available > Utc::now())
) .fold(Decimal::ZERO, |acc, x| acc + x.sum.unwrap_or(Decimal::ZERO));
.fetch_optional(pool)
.await?;
let withdrawn = sqlx::query!( let withdrawn = sqlx::query!(
" "
@ -824,12 +825,6 @@ async fn get_user_balance(
.fetch_optional(pool) .fetch_optional(pool)
.await?; .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 let (withdrawn, fees) = withdrawn
.map(|x| { .map(|x| {
( (
@ -844,6 +839,10 @@ async fn get_user_balance(
- withdrawn.round_dp(16) - withdrawn.round_dp(16)
- fees.round_dp(16), - fees.round_dp(16),
pending, pending,
dates: payouts
.iter()
.map(|x| (x.date_available, x.sum.unwrap_or(Decimal::ZERO)))
.collect(),
}) })
} }