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
		
	
| 
											9 months ago
										 | 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"; |