You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
| import md5 from "spark-md5";
 | |
| import { NextRequest, NextResponse } from "next/server";
 | |
| import { getServerSideConfig } from "@/app/config/server";
 | |
| 
 | |
| 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 = 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";
 |