Organization payouts (#848)
This commit is contained in:
parent
9c70c35669
commit
05d2a96900
35
.sqlx/query-03cd8926d18aa8c11934fdc0da32ccbbbccf2527c523336f230c0e344c471a0f.json
generated
Normal file
35
.sqlx/query-03cd8926d18aa8c11934fdc0da32ccbbbccf2527c523336f230c0e344c471a0f.json
generated
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"db_name": "PostgreSQL",
|
||||||
|
"query": "\n SELECT m.id id, tm.user_id user_id, tm.payouts_split payouts_split\n FROM mods m\n INNER JOIN organizations o ON m.organization_id = o.id\n INNER JOIN team_members tm on o.team_id = tm.team_id AND tm.accepted = TRUE\n WHERE m.id = ANY($1) AND m.monetization_status = $2 AND m.organization_id IS NOT NULL\n ",
|
||||||
|
"describe": {
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"ordinal": 0,
|
||||||
|
"name": "id",
|
||||||
|
"type_info": "Int8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 1,
|
||||||
|
"name": "user_id",
|
||||||
|
"type_info": "Int8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 2,
|
||||||
|
"name": "payouts_split",
|
||||||
|
"type_info": "Numeric"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"parameters": {
|
||||||
|
"Left": [
|
||||||
|
"Int8Array",
|
||||||
|
"Text"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"nullable": [
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hash": "03cd8926d18aa8c11934fdc0da32ccbbbccf2527c523336f230c0e344c471a0f"
|
||||||
|
}
|
||||||
@ -520,8 +520,6 @@ pub async fn process_payout(
|
|||||||
redis: &RedisPool,
|
redis: &RedisPool,
|
||||||
client: &clickhouse::Client,
|
client: &clickhouse::Client,
|
||||||
) -> Result<(), ApiError> {
|
) -> Result<(), ApiError> {
|
||||||
return Ok(());
|
|
||||||
|
|
||||||
let start: DateTime<Utc> = DateTime::from_naive_utc_and_offset(
|
let start: DateTime<Utc> = DateTime::from_naive_utc_and_offset(
|
||||||
(Utc::now() - Duration::days(1))
|
(Utc::now() - Duration::days(1))
|
||||||
.date_naive()
|
.date_naive()
|
||||||
@ -621,40 +619,69 @@ pub async fn process_payout(
|
|||||||
|
|
||||||
let mut projects_map: HashMap<i64, Project> = HashMap::new();
|
let mut projects_map: HashMap<i64, Project> = HashMap::new();
|
||||||
|
|
||||||
use futures::TryStreamExt;
|
let project_ids = multipliers
|
||||||
|
.values
|
||||||
|
.keys()
|
||||||
|
.map(|x| *x as i64)
|
||||||
|
.collect::<Vec<i64>>();
|
||||||
|
|
||||||
sqlx::query!(
|
let project_org_members = sqlx::query!(
|
||||||
|
"
|
||||||
|
SELECT m.id id, tm.user_id user_id, tm.payouts_split payouts_split
|
||||||
|
FROM mods m
|
||||||
|
INNER JOIN organizations o ON m.organization_id = o.id
|
||||||
|
INNER JOIN team_members tm on o.team_id = tm.team_id AND tm.accepted = TRUE
|
||||||
|
WHERE m.id = ANY($1) AND m.monetization_status = $2 AND m.organization_id IS NOT NULL
|
||||||
|
",
|
||||||
|
&project_ids,
|
||||||
|
MonetizationStatus::Monetized.as_str(),
|
||||||
|
)
|
||||||
|
.fetch_all(&mut *transaction)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let project_team_members = sqlx::query!(
|
||||||
"
|
"
|
||||||
SELECT m.id id, tm.user_id user_id, tm.payouts_split payouts_split
|
SELECT m.id id, tm.user_id user_id, tm.payouts_split payouts_split
|
||||||
FROM mods m
|
FROM mods m
|
||||||
INNER JOIN team_members tm on m.team_id = tm.team_id AND tm.accepted = TRUE
|
INNER JOIN team_members tm on m.team_id = tm.team_id AND tm.accepted = TRUE
|
||||||
WHERE m.id = ANY($1) AND m.monetization_status = $2
|
WHERE m.id = ANY($1) AND m.monetization_status = $2
|
||||||
",
|
",
|
||||||
&multipliers
|
&project_ids,
|
||||||
.values
|
|
||||||
.keys()
|
|
||||||
.map(|x| *x as i64)
|
|
||||||
.collect::<Vec<i64>>(),
|
|
||||||
MonetizationStatus::Monetized.as_str(),
|
MonetizationStatus::Monetized.as_str(),
|
||||||
)
|
)
|
||||||
.fetch_many(&mut *transaction)
|
.fetch_all(&mut *transaction)
|
||||||
.try_for_each(|e| {
|
.await?;
|
||||||
if let Some(row) = e.right() {
|
|
||||||
if let Some(project) = projects_map.get_mut(&row.id) {
|
for project_id in project_ids {
|
||||||
project.team_members.push((row.user_id, row.payouts_split));
|
let team_members: HashMap<i64, Decimal> = project_team_members
|
||||||
} else {
|
.iter()
|
||||||
|
.filter(|r| r.id == project_id)
|
||||||
|
.map(|r| (r.user_id, r.payouts_split))
|
||||||
|
.collect();
|
||||||
|
let org_team_members: HashMap<i64, Decimal> = project_org_members
|
||||||
|
.iter()
|
||||||
|
.filter(|r| r.id == project_id)
|
||||||
|
.map(|r| (r.user_id, r.payouts_split))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let mut all_team_members = vec![];
|
||||||
|
|
||||||
|
for (user_id, payouts_split) in org_team_members {
|
||||||
|
if !team_members.contains_key(&user_id) {
|
||||||
|
all_team_members.push((user_id, payouts_split));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (user_id, payouts_split) in team_members {
|
||||||
|
all_team_members.push((user_id, payouts_split));
|
||||||
|
}
|
||||||
|
|
||||||
projects_map.insert(
|
projects_map.insert(
|
||||||
row.id,
|
project_id,
|
||||||
Project {
|
Project {
|
||||||
team_members: vec![(row.user_id, row.payouts_split)],
|
team_members: all_team_members,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
futures::future::ready(Ok(()))
|
|
||||||
})
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let amount = Decimal::from(parse_var::<u64>("PAYOUTS_BUDGET").unwrap_or(0));
|
let amount = Decimal::from(parse_var::<u64>("PAYOUTS_BUDGET").unwrap_or(0));
|
||||||
|
|
||||||
|
|||||||
@ -94,12 +94,17 @@ pub async fn project_search(
|
|||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|facet| {
|
.map(|facet| {
|
||||||
if let Some((key, operator, val)) = parse_facet(&facet) {
|
if let Some((key, operator, val)) = parse_facet(&facet) {
|
||||||
format!("{}{}{}", match key.as_str() {
|
format!(
|
||||||
|
"{}{}{}",
|
||||||
|
match key.as_str() {
|
||||||
"versions" => "game_versions",
|
"versions" => "game_versions",
|
||||||
"project_type" => "project_types",
|
"project_type" => "project_types",
|
||||||
"title" => "name",
|
"title" => "name",
|
||||||
x => x,
|
x => x,
|
||||||
}, operator, val)
|
},
|
||||||
|
operator,
|
||||||
|
val
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
facet.to_string()
|
facet.to_string()
|
||||||
}
|
}
|
||||||
@ -127,7 +132,7 @@ pub async fn project_search(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Parses a facet into a key, operator, and value
|
/// Parses a facet into a key, operator, and value
|
||||||
fn parse_facet(facet: &String) -> Option<(String, String, String)> {
|
fn parse_facet(facet: &str) -> Option<(String, String, String)> {
|
||||||
let mut key = String::new();
|
let mut key = String::new();
|
||||||
let mut operator = String::new();
|
let mut operator = String::new();
|
||||||
let mut val = String::new();
|
let mut val = String::new();
|
||||||
|
|||||||
@ -247,7 +247,7 @@ pub async fn version_edit(
|
|||||||
// Get the older version to get info from
|
// Get the older version to get info from
|
||||||
let old_version = v3::versions::version_get_helper(
|
let old_version = v3::versions::version_get_helper(
|
||||||
req.clone(),
|
req.clone(),
|
||||||
info.clone().0,
|
(*info).0,
|
||||||
pool.clone(),
|
pool.clone(),
|
||||||
redis.clone(),
|
redis.clone(),
|
||||||
session_queue.clone(),
|
session_queue.clone(),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user