harryagasi
feat: repoint chat, chatroom & feedback to golang service
5042d8c
Raw
History Blame Contribute Delete
2.21 kB
import { NextRequest, NextResponse } from "next/server";
type Params = { path: string[] };
async function proxyRequest(
req: NextRequest,
{ params }: { params: Params }
): Promise<NextResponse> {
const golangUrl = process.env.GOLANG_SERVICE_URL;
const testerToken = process.env.TESTER_TOKEN;
if (!golangUrl) {
return NextResponse.json(
{ message: "Golang service URL not configured" },
{ status: 503 }
);
}
if (!testerToken) {
return NextResponse.json(
{ message: "Golang service token not configured" },
{ status: 503 }
);
}
const path = params.path.join("/");
const { search } = new URL(req.url);
const targetUrl = `${golangUrl}/${path}${search}`;
const authorization = testerToken.startsWith("Bearer ")
? testerToken
: `Bearer ${testerToken}`;
const forwardHeaders: HeadersInit = { authorization };
const contentType = req.headers.get("content-type");
if (contentType) forwardHeaders["content-type"] = contentType;
const fetchInit: RequestInit & { duplex?: string } = {
method: req.method,
headers: forwardHeaders,
};
if (req.method !== "GET" && req.method !== "HEAD") {
fetchInit.body = req.body;
fetchInit.duplex = "half";
}
try {
const upstream = await fetch(targetUrl, fetchInit);
const body = await upstream.arrayBuffer();
return new NextResponse(body, {
status: upstream.status,
headers: {
"content-type":
upstream.headers.get("content-type") ?? "application/json",
},
});
} catch {
return NextResponse.json(
{ message: "Upstream service unavailable" },
{ status: 502 }
);
}
}
export async function GET(req: NextRequest, ctx: { params: Params }) {
return proxyRequest(req, ctx);
}
export async function POST(req: NextRequest, ctx: { params: Params }) {
return proxyRequest(req, ctx);
}
export async function PUT(req: NextRequest, ctx: { params: Params }) {
return proxyRequest(req, ctx);
}
export async function PATCH(req: NextRequest, ctx: { params: Params }) {
return proxyRequest(req, ctx);
}
export async function DELETE(req: NextRequest, ctx: { params: Params }) {
return proxyRequest(req, ctx);
}