import { NextResponse } from 'next/server';
import { stripe } from '@/lib/stripe';
import { createClient } from '@supabase/supabase-js';
export async function POST(req: Request) {
try {
const { priceId } = await req.json();
// Get the Authorization header
const authHeader = req.headers.get('authorization');
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return NextResponse.json(
{ error: 'Not authenticated' },
{ status: 401 }
);
}
const token = authHeader.replace('Bearer ', '');
// Create Supabase client with the access token
const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
global: {
headers: {
Authorization: `Bearer ${token}`,
},
},
}
);
// Get the user from the token
const { data: { user }, error: userError } = await supabase.auth.getUser();
if (userError || !user) {
return NextResponse.json(
{ error: 'Not authenticated' },
{ status: 401 }
);
}
// Get the base URL with fallback
const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000';
console.log('Base URL from env:', process.env.NEXT_PUBLIC_BASE_URL);
console.log('Using base URL:', baseUrl);
// Validate the base URL
try {
new URL(baseUrl);
} catch (urlError) {
console.error('Invalid base URL:', baseUrl);
return NextResponse.json(
{ error: 'Invalid base URL configuration' },
{ status: 500 }
);
}
const successUrl = `${baseUrl}/billing?success=true`;
const cancelUrl = `${baseUrl}/pricing`;
console.log('Success URL:', successUrl);
console.log('Cancel URL:', cancelUrl);
// Create or update customer with metadata
let customer;
try {
// Try to find existing customer by email
const customers = await stripe!.customers.list({
email: user.email,
limit: 1,
});
if (customers.data.length > 0) {
// Update existing customer with metadata
customer = await stripe!.customers.update(customers.data[0].id, {
metadata: {
userId: user.id,
},
});
} else {
// Create new customer with metadata
customer = await stripe!.customers.create({
email: user.email,
metadata: {
userId: user.id,
},
});
}
} catch (error) {
console.error('Error handling customer:', error);
return NextResponse.json(
{ error: 'Error setting up customer' },
{ status: 500 }
);
}
// Create a checkout session
const checkoutSession = await stripe!.checkout.sessions.create({
mode: 'subscription',
payment_method_types: ['card'],
line_items: [
{
price: priceId,
quantity: 1,
},
],
success_url: successUrl,
cancel_url: cancelUrl,
customer: customer.id,
metadata: {
userId: user.id,
},
subscription_data: {
metadata: {
userId: user.id,
},
},
});
return NextResponse.json({ sessionId: checkoutSession.id });
} catch (error) {
console.error('Error creating checkout session:', error);
return NextResponse.json(
{ error: 'Error creating checkout session' },
{ status: 500 }
);
}
}