import "server-only"; import { redis } from "@/lib/redis"; const CACHE_TTL: Record = { websiteArticles: 60, websiteArticleComments: 10, websiteHelpCenterCategories: 300, websiteSettings: 600, websiteBanners: 120, websitePolls: 30, websiteEvents: 30, emulatorSettings: 300, emulatorTexts: 300, aclRoles: 600, aclPermissions: 600, users: 10, ranks: 600, }; const AVOID_CACHE = new Set(["count", "groupBy"]); function shouldCache(model: string, action: string): boolean { if (AVOID_CACHE.has(action)) return false; return model in CACHE_TTL; } function queryKey(model: string, action: string, args: unknown): string { const hash = JSON.stringify(args).replace(/["{}[\],]/g, "").slice(0, 120); return `pq:${model}:${action}:${hash}`; } export function cacheQuery( model: string, action: string, args: unknown, fn: () => Promise, ): Promise { if (!shouldCache(model, action)) return fn(); const ttl = CACHE_TTL[model]; const key = queryKey(model, action, args); return _cachedQuery(key, ttl, fn); } async function _cachedQuery( key: string, ttl: number, fn: () => Promise, ): Promise { if (!redis) return fn(); try { const cached = await redis.get(key); if (cached !== null) { return JSON.parse(cached) as T; } } catch { // ignore } const result = await fn(); try { await redis.setex(key, ttl, JSON.stringify(result)); } catch { // ignore } return result; }