Created
August 11, 2023 14:29
-
-
Save joshbedo/1b4818a9a4d7780006124932ba4aab0e to your computer and use it in GitHub Desktop.
webhook.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* eslint-disable @typescript-eslint/no-unsafe-call */ | |
/* eslint-disable @typescript-eslint/no-unsafe-assignment */ | |
/* eslint-disable @typescript-eslint/no-unsafe-member-access */ | |
import { NextApiRequest, NextApiResponse } from 'next'; | |
import type Stripe from 'stripe'; | |
import { prisma } from '~/server/db'; | |
import { stripe } from '~/utils/stripe'; | |
import { buffer } from 'micro'; | |
export const config = { api: { bodyParser: false } }; | |
export default async function handler(req: NextApiRequest, res: NextApiResponse) { | |
// return new Promise<void>(async (resolve) => { | |
if (req.method === 'POST') { | |
// const body = JSON.stringify(req.body); | |
const body = await buffer(req); | |
const signature = req.headers['stripe-signature'] ?? ""; | |
let event: Stripe.Event; | |
// const header = stripe.webhooks.generateTestHeaderString({ | |
// payload: body, | |
// secret: process.env.STRIPE_WEBHOOK_SECRET!, | |
// }); | |
try { | |
event = stripe.webhooks.constructEvent(body, signature, process.env.STRIPE_WEBHOOK_SECRET!); | |
} catch (err) { | |
console.error(err, 'error'); | |
return res.status(400).send(`Webhook Error: ${err instanceof Error ? err.message : 'unknown error'}`); | |
} | |
const session = event.data.object as Stripe.Checkout.Session; | |
if (!session?.metadata?.clerkId) { | |
// console.log('no clerk id'); | |
// return res.status(400).end(); | |
return res.status(200).end(); | |
} | |
if (event.type === "checkout.session.completed") { | |
console.log(session, session?.metadata?.clerkId, 'session clerkId checkout.session.completed'); | |
const subscription = await stripe.subscriptions.retrieve(session.subscription as string); | |
await prisma.user.create({ | |
data: { | |
clerkId: subscription.metadata.clerkId!, | |
stripeSubscriptionId: subscription.id, | |
stripeCustomerId: subscription.customer as string, | |
stripePriceId: subscription.items.data[0]?.price.id, | |
stripeCurrentPeriodEnd: new Date( | |
subscription.current_period_end * 1000, | |
), | |
}, | |
// update: { | |
// stripeSubscriptionId: subscription.id, | |
// stripeCustomerId: subscription.customer as string, | |
// stripePriceId: subscription.items.data[0]?.price.id, | |
// stripeCurrentPeriodEnd: new Date( | |
// subscription.current_period_end * 1000, | |
// ), | |
// } | |
}); | |
// const mutation = api.user.updateUser.useMutation(); | |
// mutation.mutate({ | |
// clerkId: session.metadata.clerkId, | |
// stripeSubscriptionId: subscription.id, | |
// stripeCustomerId: subscription.customer as string, | |
// stripePriceId: subscription.items.data[0].price.id, | |
// stripeCurrentPeriodEnd: new Date( | |
// subscription.current_period_end * 1000, | |
// ) | |
// }) | |
// await db.user.update({ | |
// where: { | |
// id: session.metadata.userId, | |
// }, | |
// data: { | |
// stripeSubscriptionId: subscription.id, | |
// stripeCustomerId: subscription.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 prisma.user.update({ | |
where: { | |
stripeSubscriptionId: subscription.id, | |
}, | |
data: { | |
stripePriceId: subscription.items.data[0]?.price.id, | |
stripeCurrentPeriodEnd: new Date( | |
subscription.current_period_end * 1000, | |
), | |
// clerkId: subscription.metadata.clerkId!, | |
// stripeCustomerId: subscription.customer as string, | |
// stripePriceId: subscription.items.data[0]?.price.id, | |
// stripeCurrentPeriodEnd: new Date( | |
// subscription.current_period_end * 1000, | |
// ), | |
} | |
}); | |
// const mutation = api.user.updateUser.useMutation(); | |
// mutation.mutate({ | |
// stripePriceId: subscription.items.data[0].price.id, | |
// stripeCurrentPeriodEnd: new Date( | |
// subscription.current_period_end * 1000, | |
// ), | |
// }); | |
} | |
console.log('webhook success!') | |
return res.json({ received: true }); | |
} else { | |
res.setHeader("Allow", "POST"); | |
res.status(405).end("Method Not Allowed"); | |
// res.status(404).end(); | |
// resolve(); | |
} | |
// }); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment