Files
HKSingleParty/99_references/supabase-examples/caching/with-cloudflare-workers-kv/src/index.js
2025-05-28 09:55:51 +08:00

101 lines
2.6 KiB
JavaScript

import { createClient } from "@supabase/supabase-js";
import { Router } from "itty-router";
import { json, status, withContent } from "itty-router-extras";
import { readFrom, writeTo } from "./utils/cache";
const router = new Router();
router.get("/read-kv", async (request, { ARTICLES }) => {
const articles = await readFrom(ARTICLES, "/articles");
return json(articles);
});
router.get("/write-kv", async (request, { ARTICLES }) => {
const articles = [{ title: "test3" }, { title: "test4" }];
await writeTo(ARTICLES, "/articles", articles);
return json(articles);
});
router.get(
"/articles",
async (request, { SUPABASE_URL, SUPABASE_ANON_KEY, ARTICLES }) => {
const cachedArticles = await readFrom(ARTICLES, "/articles");
if (cachedArticles) {
console.log("sending the cache");
return json(cachedArticles);
}
console.log("fetching fresh articles");
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
const { data } = await supabase.from("articles").select("*");
await writeTo(ARTICLES, "/articles", data);
return json(data);
}
);
router.get(
"/articles/:id",
async (request, { SUPABASE_URL, SUPABASE_ANON_KEY, ARTICLES }) => {
const { id } = request.params;
const cachedArticle = await readFrom(ARTICLES, `/articles/${id}`);
if (cachedArticle) {
console.log("sending the cache");
return json(cachedArticle);
}
console.log("fetching fresh article");
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
const { data } = await supabase
.from("articles")
.select("*")
.match({ id })
.single();
await writeTo(ARTICLES, `/articles/${id}`, data);
return json(data);
}
);
router.post(
"/revalidate",
withContent,
async (request, { SUPABASE_URL, SUPABASE_ANON_KEY, ARTICLES }, context) => {
const updateCache = async () => {
const { type, record, old_record } = request.content;
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
if (type === "INSERT" || type === "UPDATE") {
await writeTo(ARTICLES, `/articles/${record.id}`, record);
}
if (type === "DELETE") {
await ARTICLES.delete(`/articles/${old_record.id}`);
}
const { data: articles } = await supabase.from("articles").select("*");
await writeTo(ARTICLES, "/articles", articles);
console.log("updated cache");
};
context.waitUntil(updateCache());
console.log("sending response");
return json({ received: true });
}
);
router.all("*", () => status(404, "Not found"));
export default {
fetch: router.handle,
};