import { cookies } from "next/headers"; import { NextResponse } from "next/server"; import { ACCESS_TOKEN, AUTH_USER_ID, CLAIM_NAME, COOKIE_DOMAIN, REFRESH_TOKEN, SERVER_API_URL, SITE_ID, } from "@/shared/config"; async function handler( request: Request, params: { url: string[] }, method: "GET" | "POST" | "PUT" | "DELETE", ) { const cookieStore = await cookies(); const headers: Record = { "Content-Type": "application/json", "X-Site-Id": SITE_ID, }; const deviceId = request.headers.get("X-Device-Id"); if (deviceId) { headers["X-Device-Id"] = deviceId; } let body = {}; const isRefreshHandler = params.url.includes("refresh"); // silent refresh if (isRefreshHandler) { const refreshToken = cookieStore.get(REFRESH_TOKEN); headers[CLAIM_NAME] = refreshToken?.value ?? ""; if (!headers[CLAIM_NAME]) { return NextResponse.json({ message: "Can't refresh" }, { status: 401 }); } } try { if (!isRefreshHandler) { body = await request.json(); } const targetUrl = `${SERVER_API_URL}/${params.url.join("/")}`; const result = await fetch(targetUrl, { method, headers, body: JSON.stringify(body), }); if (!result.ok) { return NextResponse.json({ message: "Invalid Credentials" }, { status: 401 }); } const accessToken = result.headers.get(ACCESS_TOKEN); const refreshToken = result.headers.get(REFRESH_TOKEN); const userId = result.headers.get(AUTH_USER_ID); if (accessToken && userId) { const response = NextResponse.json({ [ACCESS_TOKEN]: accessToken, [AUTH_USER_ID]: userId, }); if (refreshToken) { cookieStore.set(REFRESH_TOKEN, refreshToken, { httpOnly: true, sameSite: "strict", domain: COOKIE_DOMAIN, path: "/", }); } return response; } return NextResponse.json({ message: "Invalid Credentials" }, { status: 401 }); } catch (error) { console.error(`[Proxy API] Error caught in handler:`, error); return NextResponse.json({ message: "Server Error", error }, { status: 500 }); } } export async function POST(request: Request, props: { params: Promise<{ url: string[] }> }) { const params = await props.params; return handler(request, params, "POST"); } export async function PUT(request: Request, props: { params: Promise<{ url: string[] }> }) { const params = await props.params; return handler(request, params, "PUT"); }