You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

43 lines
1.0 KiB
TypeScript

import { db } from '$lib/db'
import { user } from '$lib/db/schema'
import { eq } from 'drizzle-orm'
import Stripe from 'stripe'
import { env } from '$env/dynamic/private'
import type { RequestHandler } from './$types'
export const POST: RequestHandler = async (event) => {
try {
const sig = event.request.headers.get('stripe-signature') || ''
const arrayBuffer = await event.request.arrayBuffer()
const body = Buffer.from(arrayBuffer)
const stripe = new Stripe(env.PRIVATE_STRIPE_SECRET_KEY)
const stripeEvent = stripe.webhooks.constructEvent(
body,
sig,
env.PRIVATE_STRIPE_WEBHOOK_SECRET,
)
if (
stripeEvent.type === 'subscription_schedule.canceled' ||
stripeEvent.type === 'customer.subscription.deleted'
) {
await db
.update(user)
.set({ plan: 'free' })
.where(
eq(
user.stripeCustomerId,
stripeEvent.data.object.customer.toString(),
),
)
}
return new Response('Success', { status: 200 })
} catch (err) {
return new Response(`Webhook Error: ${err}`, {
status: 400,
})
}
}