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';