diff --git a/apps/labrinth/src/routes/internal/billing.rs b/apps/labrinth/src/routes/internal/billing.rs index 6d3f8f6ec8..41735e95f3 100644 --- a/apps/labrinth/src/routes/internal/billing.rs +++ b/apps/labrinth/src/routes/internal/billing.rs @@ -99,6 +99,13 @@ struct SubscriptionsQuery { pub user_id: Option, } +#[derive(Serialize)] +struct UserSubscriptionWithNextChargeTaxAmount { + #[serde(flatten)] + pub subscription: UserSubscription, + pub next_charge_tax_amount: Option, +} + #[get("subscriptions")] pub async fn subscriptions( req: HttpRequest, @@ -117,7 +124,7 @@ pub async fn subscriptions( .await? .1; - let subscriptions = + let db_subscriptions = user_subscription_item::DBUserSubscription::get_all_user( if let Some(user_id) = query.user_id { if user.role.is_admin() { @@ -133,10 +140,20 @@ pub async fn subscriptions( }, &**pool, ) - .await? - .into_iter() - .map(UserSubscription::from) - .collect::>(); + .await?; + + let mut subscriptions = Vec::with_capacity(db_subscriptions.len()); + for subscription in db_subscriptions { + let next_charge_tax_amount = + DBCharge::get_open_subscription(subscription.id, &**pool) + .await? + .map(|charge| charge.tax_amount); + + subscriptions.push(UserSubscriptionWithNextChargeTaxAmount { + subscription: UserSubscription::from(subscription), + next_charge_tax_amount, + }); + } Ok(HttpResponse::Ok().json(subscriptions)) } diff --git a/packages/api-client/src/modules/labrinth/types.ts b/packages/api-client/src/modules/labrinth/types.ts index 95dca046ee..ea5be7b750 100644 --- a/packages/api-client/src/modules/labrinth/types.ts +++ b/packages/api-client/src/modules/labrinth/types.ts @@ -26,6 +26,7 @@ export namespace Labrinth { status: SubscriptionStatus created: string metadata?: SubscriptionMetadata + next_charge_tax_amount?: number | null } export type SubscriptionMetadata =