import { Cache } from '../lib/cache'; import { NextResponse } from 'next/server'; import logger from '@akinon/next/utils/log'; export async function POST(...args) { return handleRequest(...args); } export async function PUT(...args) { return handleRequest(...args); } async function handleRequest(...args) { const [req] = args as [req: Request]; if ( !req.headers.get('authorization') || req.headers.get('authorization') !== process.env.CACHE_SECRET ) { return NextResponse.next({ status: 403 }); } const formData = await req.formData(); const body = {} as { key: string; value?: string; expire?: number; keyValuePairs?: string; compressed?: string; }; formData.forEach((value, key) => { body[key] = value; }); const { key, value, expire, keyValuePairs, compressed } = body; let response: any; try { if (req.method === 'POST') { // GET request - check if compressed flag is set if (compressed === 'true') { response = await Cache.getCompressed(key); } else { response = await Cache.get(key); } } else if (req.method === 'PUT') { if (keyValuePairs) { try { const parsedKeyValuePairs = JSON.parse(keyValuePairs); if ( typeof parsedKeyValuePairs !== 'object' || parsedKeyValuePairs === null || Array.isArray(parsedKeyValuePairs) ) { throw new Error('Invalid keyValuePairs format - must be an object'); } response = await Cache.mset(parsedKeyValuePairs, expire); } catch (error) { logger.error('Invalid keyValuePairs in mset request', { error }); return NextResponse.json( { error: 'Invalid keyValuePairs format' }, { status: 400 } ); } } else { // SET request - check if compressed flag is set if (compressed === 'true') { response = await Cache.setCompressed(key, value, expire); } else { response = await Cache.set(key, value, expire); } } } } catch (error) { logger.error(error); } return NextResponse.json(response); }