Skip to content

Instantly share code, notes, and snippets.

@HectorBlisS
Last active May 6, 2022 02:29
Show Gist options
  • Save HectorBlisS/ce52e582cb88725d47ec39ab9ca781bd to your computer and use it in GitHub Desktop.
Save HectorBlisS/ce52e582cb88725d47ec39ab9ca781bd to your computer and use it in GitHub Desktop.
import { json, LoaderFunction } from "remix";
import Stripe from 'stripe'
import dbConnection from "~/db/mongoose.server";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY)
export async function action({ request }): LoaderFunction {
if (request.method !== 'POST') return;
const webhookSecret = process.env.STRIPE_SIGN;
const webhookStripeSignatureHeader = request.headers.get('stripe-signature');
const payload = await request.text()
let event
let paymentIntent
try {
event = stripe.webhooks.constructEvent(
payload,
webhookStripeSignatureHeader,
webhookSecret,
);
} catch (err) {
console.error(`Webhook Error: ${err.message}`);
return null;
}
switch (event.type) {
//TODO: On failed we want to know who to email marketing
case 'checkout.session.async_payment_failed':
return null;
//TODO: need a difference for module vs course
case 'checkout.session.async_payment_succeeded':
case 'checkout.session.completed':
session = event.data.object;
const db = await dbConnection()
const user = await db.User.findOne({ email: session.customer_email })
const offer = await db.Offer.findOne({ slug: session.metadata.offerSlug })
const order = await db.Order.create({
user: user._id,
amount: session.amount_total,
currency: session.currency,
stripeCustomer: session.customer,
paid: session.payment_status,
metadata: session.metadata,
});
//TODO: need a difference for module vs course USE METADATA
await db.User.findByIdAndUpdate(user._id, {
$addToSet: {
courses: offer.course,
}
}, { new: true })
return json(null, { status: 200 });
default:
return null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment