use app url

This commit is contained in:
Jun-te Kim 2026-01-18 15:51:43 +00:00
parent 6962d2f3a1
commit b02ee5f74b

View file

@ -1,26 +1,24 @@
import { cookies } from "next/headers"; import { cookies } from "next/headers";
import { NextRequest, NextResponse } from "next/server"; import { NextRequest, NextResponse } from "next/server";
import { db } from "@/lib/db";
import { stripeAccounts } from "@/lib/schema/stripeAccounts";
import { eq } from "drizzle-orm";
type StripeOAuthResponse = { type StripeOAuthResponse = {
stripe_user_id: string; // acct_... access_token: string;
refresh_token: string;
stripe_user_id: string;
scope: string;
}; };
export async function GET(req: NextRequest) { export async function GET(req: NextRequest) {
const cookieStore = await cookies(); const cookieStore = await cookies();
const session = cookieStore.get("session"); const session = cookieStore.get("session");
// 🔒 Must be logged in // Safety: user must still be logged in
if (!session) { if (!session) {
return NextResponse.redirect( return NextResponse.redirect(
new URL("/login", process.env.NEXT_PUBLIC_BASE_URL) new URL("/login", process.env.NEXT_PUBLIC_BASE_URL)
); );
} }
const userId = session.value;
const { searchParams } = new URL(req.url); const { searchParams } = new URL(req.url);
const code = searchParams.get("code"); const code = searchParams.get("code");
const error = searchParams.get("error"); const error = searchParams.get("error");
@ -28,10 +26,7 @@ export async function GET(req: NextRequest) {
if (error) { if (error) {
console.error("Stripe OAuth error:", error); console.error("Stripe OAuth error:", error);
return NextResponse.redirect( return NextResponse.redirect(
new URL( new URL("/connect/stripe?error=oauth_failed", process.env.NEXT_PUBLIC_BASE_URL)
"/connect/stripe?error=oauth_failed",
process.env.NEXT_PUBLIC_BASE_URL
)
); );
} }
@ -42,7 +37,7 @@ export async function GET(req: NextRequest) {
); );
} }
// 🔁 Exchange OAuth code // Exchange code for access token
const tokenRes = await fetch("https://connect.stripe.com/oauth/token", { const tokenRes = await fetch("https://connect.stripe.com/oauth/token", {
method: "POST", method: "POST",
headers: { headers: {
@ -60,36 +55,34 @@ export async function GET(req: NextRequest) {
console.error("Stripe token exchange failed:", text); console.error("Stripe token exchange failed:", text);
return NextResponse.redirect( return NextResponse.redirect(
new URL( new URL("/connect/stripe?error=token_exchange_failed", process.env.NEXT_PUBLIC_BASE_URL)
"/connect/stripe?error=token_exchange_failed",
process.env.NEXT_PUBLIC_BASE_URL
)
); );
} }
const data = (await tokenRes.json()) as StripeOAuthResponse; const data = (await tokenRes.json()) as StripeOAuthResponse;
// ✅ Persist Stripe account → user (UPSERT) /**
await db * TODO (NEXT STEP):
.insert(stripeAccounts) * - Encrypt tokens
.values({ * - Persist to DB against the current user
userId, *
stripeAccountId: data.stripe_user_id, * Required fields:
}) * - data.stripe_user_id (acct_...)
.onConflictDoUpdate({ * - data.access_token
target: stripeAccounts.userId, * - data.refresh_token
set: { * - mode: "test"
stripeAccountId: data.stripe_user_id, */
},
console.log("Stripe OAuth success", {
stripe_account_id: data.stripe_user_id,
scope: data.scope,
has_access_token: Boolean(data.access_token),
has_refresh_token: Boolean(data.refresh_token),
access_token_preview: data.access_token?.slice(0, 8) + "...",
}); });
console.log("Stripe connected", { // MVP success redirect
userId,
stripeAccountId: data.stripe_user_id,
});
// ✅ Success redirect
return NextResponse.redirect( return NextResponse.redirect(
new URL("/connect/stripe/success", process.env.NEXT_PUBLIC_BASE_URL) new URL("/connect/stripe/success", process.env.APP_URL)
); );
} }