diff --git a/apps/dokploy/package.json b/apps/dokploy/package.json index ebee5cac0..61db1ff98 100644 --- a/apps/dokploy/package.json +++ b/apps/dokploy/package.json @@ -1,6 +1,6 @@ { "name": "dokploy", - "version": "v0.11.1", + "version": "v0.11.2", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/apps/dokploy/pages/api/stripe/webhook.ts b/apps/dokploy/pages/api/stripe/webhook.ts index c6364d945..d4599f784 100644 --- a/apps/dokploy/pages/api/stripe/webhook.ts +++ b/apps/dokploy/pages/api/stripe/webhook.ts @@ -88,7 +88,6 @@ export default async function handler( .update(admins) .set({ stripeSubscriptionId: newSubscription.id, - serversQuantity: 0, stripeCustomerId: newSubscription.customer as string, }) .where(eq(admins.stripeCustomerId, newSubscription.customer as string)) @@ -121,12 +120,6 @@ export default async function handler( } case "customer.subscription.updated": { const newSubscription = event.data.object as Stripe.Subscription; - await db - .update(admins) - .set({ - serversQuantity: newSubscription?.items?.data?.[0]?.quantity ?? 0, - }) - .where(eq(admins.stripeCustomerId, newSubscription.customer as string)); const admin = await findAdminByStripeCustomerId( newSubscription.customer as string, @@ -136,8 +129,27 @@ export default async function handler( return res.status(400).send("Webhook Error: Admin not found"); } - const newServersQuantity = admin.serversQuantity; - await updateServersBasedOnQuantity(admin.adminId, newServersQuantity); + if (newSubscription.status === "active") { + await db + .update(admins) + .set({ + serversQuantity: newSubscription?.items?.data?.[0]?.quantity ?? 0, + }) + .where( + eq(admins.stripeCustomerId, newSubscription.customer as string), + ); + + const newServersQuantity = admin.serversQuantity; + await updateServersBasedOnQuantity(admin.adminId, newServersQuantity); + } else { + await disableServers(admin.adminId); + await db + .update(admins) + .set({ serversQuantity: 0 }) + .where( + eq(admins.stripeCustomerId, newSubscription.customer as string), + ); + } break; } @@ -148,6 +160,13 @@ export default async function handler( newInvoice.subscription as string, ); + if (suscription.status !== "active") { + console.log( + `Skipping invoice.payment_succeeded for subscription ${suscription.id} with status ${suscription.status}`, + ); + break; + } + await db .update(admins) .set({ @@ -168,22 +187,29 @@ export default async function handler( } case "invoice.payment_failed": { const newInvoice = event.data.object as Stripe.Invoice; - await db - .update(admins) - .set({ - serversQuantity: 0, - }) - .where(eq(admins.stripeCustomerId, newInvoice.customer as string)); - const admin = await findAdminByStripeCustomerId( - newInvoice.customer as string, + const subscription = await stripe.subscriptions.retrieve( + newInvoice.subscription as string, ); - if (!admin) { - return res.status(400).send("Webhook Error: Admin not found"); + if (subscription.status !== "active") { + const admin = await findAdminByStripeCustomerId( + newInvoice.customer as string, + ); + + if (!admin) { + return res.status(400).send("Webhook Error: Admin not found"); + } + await db + .update(admins) + .set({ + serversQuantity: 0, + }) + .where(eq(admins.stripeCustomerId, newInvoice.customer as string)); + + await disableServers(admin.adminId); } - await disableServers(admin.adminId); break; }