import { cookies } from "next/headers"; import { NextResponse } from "next/server"; const ACCESS_TOKEN = process.env.NEXT_PUBLIC_ACCESS_TOKEN || "access-token"; const AUTH_USER_ID = process.env.NEXT_PUBLIC_AUTH_USER_ID || "token-id"; const CLAIM_NAME = process.env.NEXT_PUBLIC_CLAIM_NAME || "Authorization"; const REFRESH_TOKEN = process.env.NEXT_PUBLIC_REFRESH_TOKEN || "refresh-token"; const SERVER_API_URL = process.env.NEXT_PUBLIC_SERVER_API_URL || ""; const SITE_ID = process.env.NEXT_PUBLIC_SITE_ID || "SN"; 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, }; 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 result = await fetch(`${SERVER_API_URL}/${params.url.join("/")}`, { method, headers, body: JSON.stringify(body), }); if (!result.ok) { console.log("Invalid Credentials "); 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: "lax", path: "/", }); } return response; } return NextResponse.json( { message: "Invalid Credentials" }, { status: 401 }, ); } catch (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"); }