mirror of
https://github.com/formbricks/formbricks.git
synced 2026-05-03 19:40:08 -05:00
ab80bc1bf2
Co-authored-by: Johannes <johannes@formbricks.com> Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
51 lines
1.3 KiB
TypeScript
Executable File
51 lines
1.3 KiB
TypeScript
Executable File
import { responses } from "@/app/lib/api/response";
|
|
import { AsyncParser } from "@json2csv/node";
|
|
import { getServerSession } from "next-auth";
|
|
import { NextRequest } from "next/server";
|
|
import { authOptions } from "@formbricks/lib/authOptions";
|
|
|
|
export const POST = async (request: NextRequest) => {
|
|
const session = await getServerSession(authOptions);
|
|
|
|
if (!session) {
|
|
return responses.unauthorizedResponse();
|
|
}
|
|
|
|
const data = await request.json();
|
|
let csv: string = "";
|
|
|
|
const { json, fields, fileName } = data;
|
|
|
|
const fallbackFileName = fileName.replace(/[^A-Za-z0-9_.-]/g, "_");
|
|
const encodedFileName = encodeURIComponent(fileName)
|
|
.replace(/['()]/g, (match) => "%" + match.charCodeAt(0).toString(16))
|
|
.replace(/\*/g, "%2A");
|
|
|
|
const parser = new AsyncParser({
|
|
fields,
|
|
});
|
|
|
|
try {
|
|
csv = await parser.parse(json).promise();
|
|
} catch (err) {
|
|
console.error(err);
|
|
throw new Error("Failed to convert to CSV");
|
|
}
|
|
|
|
const headers = new Headers();
|
|
headers.set("Content-Type", "text/csv;charset=utf-8;");
|
|
headers.set(
|
|
"Content-Disposition",
|
|
`attachment; filename="${fallbackFileName}"; filename*=UTF-8''${encodedFileName}`
|
|
);
|
|
|
|
return Response.json(
|
|
{
|
|
fileResponse: csv,
|
|
},
|
|
{
|
|
headers,
|
|
}
|
|
);
|
|
};
|