Fix subscriptions edge case (#952)

* Fix subscriptions edge case

* prep
This commit is contained in:
Geometrically
2024-08-15 02:03:46 -07:00
committed by GitHub
parent 1d0d8d7fbe
commit 7dd340f0b6
3 changed files with 22 additions and 3 deletions

View File

@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n INSERT INTO users_subscriptions (\n id, user_id, price_id, interval, created, expires, last_charge, status\n )\n VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8\n )\n ON CONFLICT (id)\n DO UPDATE\n SET interval = EXCLUDED.interval,\n expires = EXCLUDED.expires,\n last_charge = EXCLUDED.last_charge,\n status = EXCLUDED.status\n ",
"query": "\n INSERT INTO users_subscriptions (\n id, user_id, price_id, interval, created, expires, last_charge, status\n )\n VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8\n )\n ON CONFLICT (id)\n DO UPDATE\n SET interval = EXCLUDED.interval,\n expires = EXCLUDED.expires,\n last_charge = EXCLUDED.last_charge,\n status = EXCLUDED.status,\n price_id = EXCLUDED.price_id\n ",
"describe": {
"columns": [],
"parameters": {
@@ -17,5 +17,5 @@
},
"nullable": []
},
"hash": "0e7a1aaa7999dcae156e1b1194232a12742a24740e48dd0d99582a79da873383"
"hash": "e82ba8bafb4e45b8a8a100c639a9174f196a50cd74c9243ddd57d6f4f3d0b062"
}

View File

@@ -117,7 +117,8 @@ impl UserSubscriptionItem {
SET interval = EXCLUDED.interval,
expires = EXCLUDED.expires,
last_charge = EXCLUDED.last_charge,
status = EXCLUDED.status
status = EXCLUDED.status,
price_id = EXCLUDED.price_id
",
self.id.0,
self.user_id.0,

View File

@@ -670,6 +670,20 @@ pub async fn initiate_payment(
..Default::default()
};
let mut metadata = HashMap::new();
metadata.insert("modrinth_user_id".to_string(), to_base62(user.id.0));
metadata.insert(
"modrinth_price_id".to_string(),
to_base62(price_item.id.0 as u64),
);
if let Some(interval) = payment_request.interval {
metadata.insert(
"modrinth_subscription_interval".to_string(),
interval.as_str().to_string(),
);
}
update_payment_intent.metadata = Some(metadata);
if let PaymentRequestType::PaymentMethod { .. } = payment_request.type_ {
update_payment_intent.payment_method = Some(payment_method.id.clone());
}
@@ -897,6 +911,7 @@ pub async fn stripe_webhook(
user_subscription.expires += duration;
user_subscription.status = SubscriptionStatus::Active;
user_subscription.interval = interval;
user_subscription.price_id = metadata.product_price.id;
user_subscription.upsert(&mut transaction).await?;
} else {
user_subscription_item::UserSubscriptionItem {
@@ -952,6 +967,7 @@ pub async fn stripe_webhook(
if let Some(mut user_subscription) = metadata.user_subscription {
user_subscription.status = SubscriptionStatus::PaymentProcessing;
user_subscription.interval = interval;
user_subscription.price_id = metadata.product_price.id;
user_subscription.upsert(&mut transaction).await?;
} else {
user_subscription_item::UserSubscriptionItem {
@@ -988,6 +1004,8 @@ pub async fn stripe_webhook(
if let Some(mut user_subscription) = metadata.user_subscription {
user_subscription.last_charge = Some(Utc::now());
user_subscription.status = SubscriptionStatus::PaymentFailed;
user_subscription.price_id = metadata.product_price.id;
user_subscription.interval = interval;
user_subscription.upsert(&mut transaction).await?;
} else {
user_subscription_item::UserSubscriptionItem {