diff --git a/apps/labrinth/.sqlx/query-9139ada08ea017859b2928d2776f878ce9531daa7556fb0b4d2a467cafeaa130.json b/apps/labrinth/.sqlx/query-e6c22fe10d603206c8466da630b30d0d4848455f5cddbf9202d9cdbfa1f306b5.json similarity index 76% rename from apps/labrinth/.sqlx/query-9139ada08ea017859b2928d2776f878ce9531daa7556fb0b4d2a467cafeaa130.json rename to apps/labrinth/.sqlx/query-e6c22fe10d603206c8466da630b30d0d4848455f5cddbf9202d9cdbfa1f306b5.json index 5b308549b..9425db920 100644 --- a/apps/labrinth/.sqlx/query-9139ada08ea017859b2928d2776f878ce9531daa7556fb0b4d2a467cafeaa130.json +++ b/apps/labrinth/.sqlx/query-e6c22fe10d603206c8466da630b30d0d4848455f5cddbf9202d9cdbfa1f306b5.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id, email,\n avatar_url, raw_avatar_url, username, bio,\n created, role, badges,\n (\n SELECT MAX(campaign_donations.donated_at)\n FROM campaign_donations\n WHERE campaign_donations.user_id = users.id\n AND campaign_donations.amount_usd > 5\n ) AS campaign_pride_26,\n github_id, discord_id, gitlab_id, google_id, steam_id, microsoft_id,\n email_verified, password, totp_secret, paypal_id, paypal_country, paypal_email,\n venmo_handle, stripe_customer_id, allow_friend_requests, is_subscribed_to_newsletter\n FROM users\n WHERE id = ANY($1) OR LOWER(username) = ANY($2)\n ", + "query": "\n SELECT id, email,\n avatar_url, raw_avatar_url, username, bio,\n created, role, badges,\n (\n SELECT MAX(campaign_donations.donated_at)\n FROM campaign_donations\n WHERE campaign_donations.user_id = users.id\n ) AS campaign_pride_26_last_donated_at,\n (\n SELECT SUM(campaign_donations.amount_usd)\n FROM campaign_donations\n WHERE campaign_donations.user_id = users.id\n ) AS campaign_pride_26_total_amount_donated_usd,\n github_id, discord_id, gitlab_id, google_id, steam_id, microsoft_id,\n email_verified, password, totp_secret, paypal_id, paypal_country, paypal_email,\n venmo_handle, stripe_customer_id, allow_friend_requests, is_subscribed_to_newsletter\n FROM users\n WHERE id = ANY($1) OR LOWER(username) = ANY($2)\n ", "describe": { "columns": [ { @@ -50,86 +50,91 @@ }, { "ordinal": 9, - "name": "campaign_pride_26", + "name": "campaign_pride_26_last_donated_at", "type_info": "Timestamptz" }, { "ordinal": 10, + "name": "campaign_pride_26_total_amount_donated_usd", + "type_info": "Numeric" + }, + { + "ordinal": 11, "name": "github_id", "type_info": "Int8" }, { - "ordinal": 11, + "ordinal": 12, "name": "discord_id", "type_info": "Int8" }, { - "ordinal": 12, + "ordinal": 13, "name": "gitlab_id", "type_info": "Int8" }, { - "ordinal": 13, + "ordinal": 14, "name": "google_id", "type_info": "Varchar" }, { - "ordinal": 14, + "ordinal": 15, "name": "steam_id", "type_info": "Int8" }, { - "ordinal": 15, + "ordinal": 16, "name": "microsoft_id", "type_info": "Varchar" }, { - "ordinal": 16, + "ordinal": 17, "name": "email_verified", "type_info": "Bool" }, { - "ordinal": 17, + "ordinal": 18, "name": "password", "type_info": "Text" }, { - "ordinal": 18, + "ordinal": 19, "name": "totp_secret", "type_info": "Varchar" }, { - "ordinal": 19, + "ordinal": 20, "name": "paypal_id", "type_info": "Text" }, { - "ordinal": 20, + "ordinal": 21, "name": "paypal_country", "type_info": "Text" }, { - "ordinal": 21, + "ordinal": 22, "name": "paypal_email", "type_info": "Text" }, { - "ordinal": 22, + "ordinal": 23, "name": "venmo_handle", "type_info": "Text" }, { - "ordinal": 23, + "ordinal": 24, "name": "stripe_customer_id", "type_info": "Text" }, { - "ordinal": 24, + "ordinal": 25, "name": "allow_friend_requests", "type_info": "Bool" }, { - "ordinal": 25, + "ordinal": 26, "name": "is_subscribed_to_newsletter", "type_info": "Bool" } @@ -151,6 +156,7 @@ false, false, null, + null, true, true, true, @@ -169,5 +175,5 @@ false ] }, - "hash": "9139ada08ea017859b2928d2776f878ce9531daa7556fb0b4d2a467cafeaa130" + "hash": "e6c22fe10d603206c8466da630b30d0d4848455f5cddbf9202d9cdbfa1f306b5" } diff --git a/apps/labrinth/src/database/models/user_item.rs b/apps/labrinth/src/database/models/user_item.rs index 234347aea..9fbc3b3d0 100644 --- a/apps/labrinth/src/database/models/user_item.rs +++ b/apps/labrinth/src/database/models/user_item.rs @@ -11,6 +11,7 @@ use crate::util::error::Context; use ariadne::ids::base62_impl::{parse_base62, to_base62}; use chrono::{DateTime, Utc}; use dashmap::DashMap; +use rust_decimal::Decimal; use serde::{Deserialize, Serialize}; use std::fmt::{Debug, Display}; use std::hash::Hash; @@ -49,13 +50,20 @@ pub struct DBUser { pub role: String, pub badges: Badges, #[serde(default)] - pub campaign_pride_26: Option>, + pub campaign_pride_26: Option, pub allow_friend_requests: bool, pub is_subscribed_to_newsletter: bool, } +#[derive(Deserialize, Serialize, Clone, Debug, utoipa::ToSchema)] +pub struct Pride26CampaignDonation { + pub last_donated_at: DateTime, + pub has_badge: bool, + pub has_midas: bool, +} + impl DBUser { pub async fn insert( &self, @@ -186,8 +194,12 @@ impl DBUser { SELECT MAX(campaign_donations.donated_at) FROM campaign_donations WHERE campaign_donations.user_id = users.id - AND campaign_donations.amount_usd > 5 - ) AS campaign_pride_26, + ) AS campaign_pride_26_last_donated_at, + ( + SELECT SUM(campaign_donations.amount_usd) + FROM campaign_donations + WHERE campaign_donations.user_id = users.id + ) AS campaign_pride_26_total_amount_donated_usd, github_id, discord_id, gitlab_id, google_id, steam_id, microsoft_id, email_verified, password, totp_secret, paypal_id, paypal_country, paypal_email, venmo_handle, stripe_customer_id, allow_friend_requests, is_subscribed_to_newsletter @@ -216,7 +228,21 @@ impl DBUser { created: u.created, role: u.role, badges: Badges::from_bits(u.badges as u64).unwrap_or_default(), - campaign_pride_26: u.campaign_pride_26, + campaign_pride_26: u + .campaign_pride_26_last_donated_at + .zip(u.campaign_pride_26_total_amount_donated_usd) + .map( + |( + last_donated_at, + total_amount_donated_usd, + )| Pride26CampaignDonation { + last_donated_at, + has_badge: total_amount_donated_usd + >= Decimal::ONE, + has_midas: total_amount_donated_usd + >= Decimal::from(5), + }, + ), password: u.password, paypal_id: u.paypal_id, paypal_country: u.paypal_country, diff --git a/apps/labrinth/src/models/v3/users.rs b/apps/labrinth/src/models/v3/users.rs index b9947ea41..89de2cccd 100644 --- a/apps/labrinth/src/models/v3/users.rs +++ b/apps/labrinth/src/models/v3/users.rs @@ -75,7 +75,7 @@ pub struct User { #[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] pub struct UserCampaigns { - pub pride_26: Option>, + pub pride_26: Option, } #[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] @@ -87,7 +87,8 @@ pub struct UserPayoutData { pub balance: Decimal, } -use crate::database::models::user_item::DBUser; +use crate::database::models::user_item::{DBUser, Pride26CampaignDonation}; + impl From for User { fn from(data: DBUser) -> Self { Self {