75 lines
2.1 KiB
TypeScript
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';
|