import Stripe from 'stripe'; import { headers } from 'next/headers'; import { NextResponse } from 'next/server'; import { db } from '@/lib/db'; import { stripe } from '@/lib/stripe'; export async function POST(req: Request) { const body = await req.text(); const signature = headers().get('Stripe-Signature') as string; let event: Stripe.Event; try { event = stripe.webhooks.constructEvent( body, signature, process.env.STRIPE_WEBHOOK_SECRET! ); } catch (error) { return new NextResponse(JSON.stringify(error), { status: 400 }); } const session = event.data.object as Stripe.Checkout.Session; if (event.type === 'checkout.session.completed') { const subscription = await stripe.subscriptions.retrieve( session.subscription as string ); if (!session?.metadata?.orgId) { return new NextResponse(JSON.stringify({ error: 'Missing orgId' }), { status: 400, }); } await db.orgSubscription.create({ data: { orgId: session.metadata.orgId, stripeSubscriptionId: subscription.id, stripeCustomerId: session.customer as string, stripePriceId: subscription.items.data[0].price.id, stripeCurrentPeriodEnd: new Date( subscription.current_period_end * 1000 ), }, }); } if (event.type === 'invoice.payment_succeeded') { const subscription = await stripe.subscriptions.retrieve( session.subscription as string ); await db.orgSubscription.update({ where: { stripeSubscriptionId: subscription.id, }, data: { stripePriceId: subscription.items.data[0].price.id, stripeCurrentPeriodEnd: new Date( subscription.current_period_end * 1000 ), }, }); } return NextResponse.json(null, { status: 200 }); }