Spaces:
Sleeping
Sleeping
| import { NextRequest, NextResponse } from "next/server"; | |
| import { getRazorpay } from "@/lib/razorpay"; | |
| import { createClient } from "@/lib/supabase/server"; | |
| export async function POST(req: NextRequest) { | |
| try { | |
| const supabase = await createClient(); | |
| const { data: { user } } = await supabase.auth.getUser(); | |
| if (!user) return NextResponse.json({ error: "Not authenticated" }, { status: 401 }); | |
| const { data: profile } = await supabase | |
| .from("profiles") | |
| .select("razorpay_subscription_id") | |
| .eq("id", user.id) | |
| .single(); | |
| if (!profile?.razorpay_subscription_id) { | |
| return NextResponse.json({ error: "No active subscription" }, { status: 400 }); | |
| } | |
| const razorpay = getRazorpay(); | |
| // Cancel at end of billing cycle (like Stripe's cancel_at_period_end) | |
| await razorpay.subscriptions.cancel(profile.razorpay_subscription_id, true); | |
| await supabase | |
| .from("profiles") | |
| .update({ updated_at: new Date().toISOString() }) | |
| .eq("id", user.id); | |
| return NextResponse.json({ success: true, message: "Subscription will cancel at end of current period." }); | |
| } catch (error: any) { | |
| console.error("Cancel error:", error); | |
| return NextResponse.json({ error: error.message || "Cancel failed" }, { status: 500 }); | |
| } | |
| } | |