Expose user campaign donation info (#6266)

expose extra donation info for users
This commit is contained in:
aecsocket
2026-05-31 16:18:40 +01:00
committed by GitHub
parent 71286f7b2b
commit cc8d556448
3 changed files with 57 additions and 24 deletions
@@ -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"
}
+30 -4
View File
@@ -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<DateTime<Utc>>,
pub campaign_pride_26: Option<Pride26CampaignDonation>,
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<Utc>,
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,
+3 -2
View File
@@ -75,7 +75,7 @@ pub struct User {
#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)]
pub struct UserCampaigns {
pub pride_26: Option<DateTime<Utc>>,
pub pride_26: Option<Pride26CampaignDonation>,
}
#[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<DBUser> for User {
fn from(data: DBUser) -> Self {
Self {