parent
a02aa7586b
commit
ce3b024fea
@ -1,4 +1,3 @@
|
|||||||
use crate::models::ids::UserId;
|
|
||||||
use crate::models::payouts::{
|
use crate::models::payouts::{
|
||||||
PayoutDecimal, PayoutInterval, PayoutMethod, PayoutMethodFee, PayoutMethodType,
|
PayoutDecimal, PayoutInterval, PayoutMethod, PayoutMethodFee, PayoutMethodType,
|
||||||
};
|
};
|
||||||
@ -7,7 +6,6 @@ use crate::util::env::parse_var;
|
|||||||
use crate::{database::redis::RedisPool, models::projects::MonetizationStatus};
|
use crate::{database::redis::RedisPool, models::projects::MonetizationStatus};
|
||||||
use base64::Engine;
|
use base64::Engine;
|
||||||
use chrono::{DateTime, Datelike, Duration, Utc, Weekday};
|
use chrono::{DateTime, Datelike, Duration, Utc, Weekday};
|
||||||
use dashmap::DashMap;
|
|
||||||
use reqwest::Method;
|
use reqwest::Method;
|
||||||
use rust_decimal::Decimal;
|
use rust_decimal::Decimal;
|
||||||
use serde::de::DeserializeOwned;
|
use serde::de::DeserializeOwned;
|
||||||
@ -16,13 +14,12 @@ use serde_json::Value;
|
|||||||
use sqlx::postgres::PgQueryResult;
|
use sqlx::postgres::PgQueryResult;
|
||||||
use sqlx::PgPool;
|
use sqlx::PgPool;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::Arc;
|
|
||||||
use tokio::sync::{Mutex, RwLock};
|
use tokio::sync::{Mutex, RwLock};
|
||||||
|
|
||||||
pub struct PayoutsQueue {
|
pub struct PayoutsQueue {
|
||||||
credential: RwLock<Option<PayPalCredentials>>,
|
credential: RwLock<Option<PayPalCredentials>>,
|
||||||
payout_options: RwLock<Option<PayoutMethods>>,
|
payout_options: RwLock<Option<PayoutMethods>>,
|
||||||
payouts_locks: DashMap<UserId, Arc<Mutex<()>>>,
|
pub payouts_locks: Mutex<()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@ -49,7 +46,7 @@ impl PayoutsQueue {
|
|||||||
PayoutsQueue {
|
PayoutsQueue {
|
||||||
credential: RwLock::new(None),
|
credential: RwLock::new(None),
|
||||||
payout_options: RwLock::new(None),
|
payout_options: RwLock::new(None),
|
||||||
payouts_locks: DashMap::new(),
|
payouts_locks: Mutex::new(()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,8 +343,14 @@ impl PayoutsQueue {
|
|||||||
"OEFTMSBA5ELH",
|
"OEFTMSBA5ELH",
|
||||||
"A3CQK6UHNV27",
|
"A3CQK6UHNV27",
|
||||||
];
|
];
|
||||||
const SUPPORTED_METHODS: &[&str] =
|
const SUPPORTED_METHODS: &[&str] = &[
|
||||||
&["merchant_cards", "visa", "bank", "ach", "visa_card"];
|
"merchant_cards",
|
||||||
|
"merchant_card",
|
||||||
|
"visa",
|
||||||
|
"bank",
|
||||||
|
"ach",
|
||||||
|
"visa_card",
|
||||||
|
];
|
||||||
|
|
||||||
if !SUPPORTED_METHODS.contains(&&*product.category)
|
if !SUPPORTED_METHODS.contains(&&*product.category)
|
||||||
|| BLACKLISTED_IDS.contains(&&*product.id)
|
|| BLACKLISTED_IDS.contains(&&*product.id)
|
||||||
@ -506,13 +509,6 @@ impl PayoutsQueue {
|
|||||||
|
|
||||||
Ok(options.options)
|
Ok(options.options)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn lock_user_payouts(&self, user_id: UserId) -> Arc<Mutex<()>> {
|
|
||||||
self.payouts_locks
|
|
||||||
.entry(user_id)
|
|
||||||
.or_insert_with(|| Arc::new(Mutex::new(())))
|
|
||||||
.clone()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn process_payout(
|
pub async fn process_payout(
|
||||||
|
|||||||
@ -128,9 +128,7 @@ pub async fn paypal_webhook(
|
|||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
if let Some(result) = result {
|
if let Some(result) = result {
|
||||||
let mtx =
|
let _guard = payouts.payouts_locks.lock().await;
|
||||||
payouts.lock_user_payouts(crate::models::ids::UserId(result.user_id as u64));
|
|
||||||
let _guard = mtx.lock().await;
|
|
||||||
|
|
||||||
sqlx::query!(
|
sqlx::query!(
|
||||||
"
|
"
|
||||||
@ -249,9 +247,7 @@ pub async fn tremendous_webhook(
|
|||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
if let Some(result) = result {
|
if let Some(result) = result {
|
||||||
let mtx =
|
let _guard = payouts.payouts_locks.lock().await;
|
||||||
payouts.lock_user_payouts(crate::models::ids::UserId(result.user_id as u64));
|
|
||||||
let _guard = mtx.lock().await;
|
|
||||||
|
|
||||||
sqlx::query!(
|
sqlx::query!(
|
||||||
"
|
"
|
||||||
@ -371,8 +367,7 @@ pub async fn create_payout(
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
let mtx = payouts_queue.lock_user_payouts(user.id.into());
|
let _guard = payouts_queue.payouts_locks.lock().await;
|
||||||
let _guard = mtx.lock().await;
|
|
||||||
|
|
||||||
if user.balance < body.amount || body.amount < Decimal::ZERO {
|
if user.balance < body.amount || body.amount < Decimal::ZERO {
|
||||||
return Err(ApiError::InvalidInput(
|
return Err(ApiError::InvalidInput(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user