Skip to content

Instantly share code, notes, and snippets.

@joshbedo
Created August 11, 2023 14:29
Show Gist options
  • Save joshbedo/1b4818a9a4d7780006124932ba4aab0e to your computer and use it in GitHub Desktop.
Save joshbedo/1b4818a9a4d7780006124932ba4aab0e to your computer and use it in GitHub Desktop.
webhook.ts
/* 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