From 4e8fce9f95744a0dd588363bb081fae58ac71830 Mon Sep 17 00:00:00 2001 From: tobinio Date: Sun, 06 Oct 2024 11:54:12 +0000 Subject: [PATCH] feat: cache routes --- nuxt.config.ts | 11 ++++++++--- server/api/stats.ts | 77 ++++++++++++++++++++++++++++++++++++++++------------------------------------- server/api/statsTime.ts | 75 +++++++++++++++++++++++++++++++++++++++------------------------------------ 3 file(s) changed, 87 insertion(s)(+), 76 deletion(s)(-) diff --git a/nuxt.config.ts b/nuxt.config.ts --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -12,9 +12,8 @@ }, routeRules: { - "/downloads": { - redirect: "/downloads/major", - }, + "/": { swr: 60 * 60 /* 1 hour */ }, + "/charts": { swr: 60 * 60 /* 1 hour */ }, }, nitro: { @@ -32,6 +31,12 @@ driver: "fs", base: "./.data/statistics", }, + // statistics: { + // driver: "mongodb", + // connectionString: `mongodb://${process.env.MONGODB_USER}:${process.env.MONGODB_PASSWORD}@tobinio.at:27017/stats`, + // databaseName: "stats", + // collectionName: "stats", + // }, }, experimental: { tasks: true, diff --git a/server/api/stats.ts b/server/api/stats.ts --- a/server/api/stats.ts +++ b/server/api/stats.ts @@ -9,45 +9,48 @@ versionTo: string | null; }; -export default defineEventHandler(async (event): Promise => { - const query = getQuery(event); +export default defineCachedEventHandler( + async (event): Promise => { + const query = getQuery(event); - const storage = useStorage("statistics"); - const dateKey = await storage.getItem("latestDate"); + const storage = useStorage("statistics"); + const dateKey = await storage.getItem("latestDate"); - if (!dateKey) { - consola.error("no latestDate set"); + if (!dateKey) { + consola.error("no latestDate set"); - return { - labels: [], - data: [], - }; - } - - let typeFn: (value: StatsValue) => number; - - switch (query.stat) { - case "versions": { - typeFn = (value) => value.versions; - break; + return { + labels: [], + data: [], + }; } - case "count": { - typeFn = (value) => value.count; - break; - } - default: { - typeFn = (value) => value.downloads; - break; - } - } - return exportStats( - query.mode, - query.type, - query.exclusive === "true", - dateKey, - typeFn, - query.versionTo, - query.versionFrom, - ); -}); + let typeFn: (value: StatsValue) => number; + + switch (query.stat) { + case "versions": { + typeFn = (value) => value.versions; + break; + } + case "count": { + typeFn = (value) => value.count; + break; + } + default: { + typeFn = (value) => value.downloads; + break; + } + } + + return exportStats( + query.mode, + query.type, + query.exclusive === "true", + dateKey, + typeFn, + query.versionTo, + query.versionFrom, + ); + }, + { maxAge: 60 * 60 /* 1 hour */ }, +); diff --git a/server/api/statsTime.ts b/server/api/statsTime.ts --- a/server/api/statsTime.ts +++ b/server/api/statsTime.ts @@ -9,44 +9,47 @@ version: string; }; -export default defineEventHandler(async (event): Promise => { - const query = getQuery(event); +export default defineCachedEventHandler( + async (event): Promise => { + const query = getQuery(event); - const storage = useStorage("statistics"); - const dateKey = await storage.getItem("latestDate"); + const storage = useStorage("statistics"); + const dateKey = await storage.getItem("latestDate"); - if (!dateKey) { - consola.error("no latestDate set"); + if (!dateKey) { + consola.error("no latestDate set"); - return { - labels: [], - data: [], - }; - } - - let typeFn: (value: StatsValue) => number; - - switch (query.stat) { - case "versions": { - typeFn = (value) => value.versions; - break; + return { + labels: [], + data: [], + }; } - case "count": { - typeFn = (value) => value.count; - break; - } - default: { - typeFn = (value) => value.downloads; - break; - } - } - return exportStatsOverTime( - query.mode, - query.type, - query.exclusive === "true", - dateKey, - query.version, - typeFn, - ); -}); + let typeFn: (value: StatsValue) => number; + + switch (query.stat) { + case "versions": { + typeFn = (value) => value.versions; + break; + } + case "count": { + typeFn = (value) => value.count; + break; + } + default: { + typeFn = (value) => value.downloads; + break; + } + } + + return exportStatsOverTime( + query.mode, + query.type, + query.exclusive === "true", + dateKey, + query.version, + typeFn, + ); + }, + { maxAge: 60 * 60 /* 1 hour */ }, +); -- tangled.sh