mirror of https://github.com/TZGyn/shortener
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
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,
|
|
})
|
|
}
|
|
}
|