ChatGPT-Next-Web/app/api/artifacts/route.ts

75 lines
2.1 KiB
TypeScript

import type { NextRequest } from 'next/server';
import { getServerSideConfig } from '@/app/config/server';
import { NextResponse } from 'next/server';
import md5 from 'spark-md5';
async function handle(req: NextRequest, res: NextResponse) {
const serverConfig = getServerSideConfig();
const storeUrl = () =>
`https://api.cloudflare.com/client/v4/accounts/${serverConfig.cloudflareAccountId}/storage/kv/namespaces/${serverConfig.cloudflareKVNamespaceId}`;
const storeHeaders = () => ({
Authorization: `Bearer ${serverConfig.cloudflareKVApiKey}`,
});
if (req.method === 'POST') {
const clonedBody = await req.text();
const hashedCode = md5.hash(clonedBody).trim();
const body: {
key: string;
value: string;
expiration_ttl?: number;
} = {
key: hashedCode,
value: clonedBody,
};
try {
const ttl = Number.parseInt(serverConfig.cloudflareKVTTL as string);
if (ttl > 60) {
body.expiration_ttl = ttl;
}
} catch (e) {
console.error(e);
}
const res = await fetch(`${storeUrl()}/bulk`, {
headers: {
...storeHeaders(),
'Content-Type': 'application/json',
},
method: 'PUT',
body: JSON.stringify([body]),
});
const result = await res.json();
console.log('save data', result);
if (result?.success) {
return NextResponse.json(
{ code: 0, id: hashedCode, result },
{ status: res.status },
);
}
return NextResponse.json(
{ error: true, msg: 'Save data error' },
{ status: 400 },
);
}
if (req.method === 'GET') {
const id = req?.nextUrl?.searchParams?.get('id');
const res = await fetch(`${storeUrl()}/values/${id}`, {
headers: storeHeaders(),
method: 'GET',
});
return new Response(res.body, {
status: res.status,
statusText: res.statusText,
headers: res.headers,
});
}
return NextResponse.json(
{ error: true, msg: 'Invalid request' },
{ status: 400 },
);
}
export const POST = handle;
export const GET = handle;
export const runtime = 'edge';