// /app/api/courses/[courseId]/checkout/route.ts
import { auth } from "@/auth";
import { db } from "@/lib/db";
import { stripe } from "@/lib/stripe";
import { NextResponse } from "next/server";
import Stripe from "stripe";
export async function POST(
req: Request,
{ params }: { params: { courseId: string } }
) {
try {
const user = await auth();
if(!user || !user.user.id) {
return new NextResponse("Unauthorized", { status: 401 });
}
const course = await db.course.findUnique({
where: {
id: params.courseId,
isPublished: true
}
});
const purchase = await db.purchase.findUnique({
where: {
userId_courseId: {
userId: user.user.id,
courseId: params.courseId
}
}
});
if (purchase) {
return new NextResponse("Already purchased", { status: 400 });
}
if(!course) {
return new NextResponse("Course not found", { status: 404 });
}
const line_items: Stripe.Checkout.SessionCreateParams.LineItem[] = [
{
quantity: 1,
price_data: {
currency: "usd",
product_data: {
name: course.title,
description: course.description!
},
unit_amount: Math.round(course.price! * 100)
}
}
];
let stripeCustomer = await db.stripeCustomer.findUnique({
where: {
userId: user.user.id
},
select: {
stripeCustomerId: true
}
});
if(!stripeCustomer) {
// might get error for this email call
const customer = await stripe.customers.create({
email: user.user.email!
})
stripeCustomer = await db.stripeCustomer.create({
data: {
userId: user.user.id,
stripeCustomerId: customer.id
}
})
}
const session = await stripe.checkout.sessions.create({
customer: stripeCustomer.stripeCustomerId,
line_items,
mode: 'payment',
success_url: `${process.env.NEXT_PUBLIC_APP_URL}/courses/${course.id}`,
cancel_url: `${process.env.NEXT_PUBLIC_APP_URL}`,
metadata: {
courseId: course.id,
userId: user.user.id
}
});
return NextResponse.json({ url: session.url })
} catch (error) {
console.log("[COURSE_ID_CHECKOUT]", error);
return new NextResponse("Internal Error", { status: 500 })
}
}