33 lines
847 B
TypeScript
33 lines
847 B
TypeScript
import "server-only";
|
|
import { randomUUID } from "node:crypto";
|
|
import { cached } from "@/lib/cache";
|
|
import { logger } from "@/lib/logger";
|
|
import { redis } from "@/lib/redis";
|
|
|
|
const REVISION_KEY = "cms:news:revision";
|
|
export async function cacheNews<T>(
|
|
key: string,
|
|
ttlMs: number,
|
|
query: () => Promise<T>,
|
|
): Promise<T> {
|
|
if (!redis || redis.status === "end") return query();
|
|
let revision: string;
|
|
try {
|
|
revision = (await redis.get(REVISION_KEY)) ?? "0";
|
|
} catch {
|
|
return query();
|
|
}
|
|
return cached(`news:${revision}:${key}`, ttlMs, query);
|
|
}
|
|
export async function invalidateNewsCache(): Promise<void> {
|
|
if (!redis || redis.status === "end") return;
|
|
try {
|
|
await redis.set(REVISION_KEY, randomUUID());
|
|
} catch (error) {
|
|
logger.error("News saved but public cache invalidation failed", {
|
|
module: "news",
|
|
error,
|
|
});
|
|
}
|
|
}
|