From 2cc87d81d93bbdf22321c37019e381f1f52d8f26 Mon Sep 17 00:00:00 2001 From: tobinio Date: Tue, 8 Jul 2025 10:26:32 +0200 Subject: [PATCH] refactor to nested db access --- server/api/gameVersions.ts | 3 +- server/api/latestDate.ts | 4 +- server/api/stats/global.ts | 3 +- server/api/stats/time/global.ts | 3 +- server/tasks/analyze.ts | 5 +- server/utils/export/globalStats.ts | 3 +- server/utils/export/projectStats.ts | 12 +- .../processing/gameVersions/processing.ts | 3 +- server/utils/processing/global/processing.ts | 3 +- .../utils/processing/projects/processing.ts | 15 +- server/utils/storage.ts | 199 ++++++++++-------- 11 files changed, 128 insertions(+), 125 deletions(-) diff --git a/server/api/gameVersions.ts b/server/api/gameVersions.ts index b678c95..a1e907d 100644 --- a/server/api/gameVersions.ts +++ b/server/api/gameVersions.ts @@ -1,10 +1,9 @@ import type { GameVersionData } from "~~/server/utils/processing/gameVersions/types"; -import { getGameVersions } from "~~/server/utils/storage"; export default defineEventHandler(async (event): Promise => { const query = getQuery(event); - const gameVersions = await getGameVersions(); + const gameVersions = await DB.GameVersions.get(); if (gameVersions instanceof Error) { setResponseStatus(event, 500); diff --git a/server/api/latestDate.ts b/server/api/latestDate.ts index 6eb169b..9057219 100644 --- a/server/api/latestDate.ts +++ b/server/api/latestDate.ts @@ -1,7 +1,5 @@ -import { getLatestDate } from "~~/server/utils/storage"; - export default defineEventHandler(async (event): Promise => { - const gameVersions = await getLatestDate(); + const gameVersions = await DB.LatestDate.get(); if (gameVersions instanceof Error) { setResponseStatus(event, 500); diff --git a/server/api/stats/global.ts b/server/api/stats/global.ts index 2864adc..82cdc74 100644 --- a/server/api/stats/global.ts +++ b/server/api/stats/global.ts @@ -1,10 +1,9 @@ import consola from "consola"; import type { GlobalStats } from "~~/server/utils/processing/global/types"; -import { getLatestGlobalStats } from "~~/server/utils/storage"; export default defineCachedEventHandler( async (event): Promise => { - const globalStats = await getLatestGlobalStats(); + const globalStats = await DB.GlobalStats.getLatest(); if (globalStats instanceof Error) { consola.error(globalStats.message); diff --git a/server/api/stats/time/global.ts b/server/api/stats/time/global.ts index 99f41d9..73ffeb7 100644 --- a/server/api/stats/time/global.ts +++ b/server/api/stats/time/global.ts @@ -2,7 +2,6 @@ import consola from "consola"; import { exportGlobalStatsOverTime } from "~~/server/utils/export/globalStats"; import { fracture } from "~~/server/utils/processing/aggregate"; import type { GlobalStatCategory } from "~~/server/utils/processing/global/types"; -import { getLatestDate } from "~~/server/utils/storage"; type QueryData = { type: GlobalStatCategory; @@ -13,7 +12,7 @@ export default defineCachedEventHandler( async (event): Promise => { const query = getQuery(event); - const dateKey = await getLatestDate(); + const dateKey = await DB.LatestDate.get(); if (dateKey instanceof Error) { consola.error("no latestDate set"); diff --git a/server/tasks/analyze.ts b/server/tasks/analyze.ts index ead34c8..a079df4 100644 --- a/server/tasks/analyze.ts +++ b/server/tasks/analyze.ts @@ -2,7 +2,6 @@ import consola from "consola"; import { updateGameVersions } from "~~/server/utils/processing/gameVersions/processing"; import { updateGlobalStats } from "~~/server/utils/processing/global/processing"; import { updateStatistics } from "~~/server/utils/processing/projects/processing"; -import { getLatestDate, setLatestDate } from "~~/server/utils/storage"; export default defineTask({ meta: { @@ -10,7 +9,7 @@ export default defineTask({ description: "Update all the statistics", }, async run() { - const latestDate = await getLatestDate(); + const latestDate = await DB.LatestDate.get(); if (latestDate === dateToKey(new Date())) { consola.debug("data already analyzed"); return { result: "Fail" }; @@ -23,7 +22,7 @@ export default defineTask({ await updateGameVersions(); await updateStatistics(); await updateGlobalStats(); - await setLatestDate(new Date()); + await DB.LatestDate.set(new Date()); } catch (e) { consola.fail(e); } diff --git a/server/utils/export/globalStats.ts b/server/utils/export/globalStats.ts index e00ffbb..3943858 100644 --- a/server/utils/export/globalStats.ts +++ b/server/utils/export/globalStats.ts @@ -1,5 +1,4 @@ import type { GlobalStats } from "~~/server/utils/processing/global/types"; -import { getGlobalStatsBulk } from "~~/server/utils/storage"; export async function exportGlobalStatsOverTime( firstDateKey: string, @@ -31,7 +30,7 @@ export async function exportGlobalStatsOverTime( date = new_date; } - const data = await getGlobalStatsBulk(dates); + const data = await DB.GlobalStats.getBulk(dates); for (let i = 0; i < data.length; i++) { const stats = data[i]!; diff --git a/server/utils/export/projectStats.ts b/server/utils/export/projectStats.ts index ceaa75f..9b815d7 100644 --- a/server/utils/export/projectStats.ts +++ b/server/utils/export/projectStats.ts @@ -4,10 +4,6 @@ import type { ProjectStats, ProjectStatsValue, } from "~~/server/utils/processing/projects/types"; -import { - getLatestProjectStats, - getProjectStatsBulk, -} from "~~/server/utils/storage"; // maps database data to a format usable by the frontend function mapStats( @@ -65,7 +61,11 @@ export async function exportStats( versionTo: string | null, versionFrom: string | null, ): Promise { - const stats = await getLatestProjectStats(type, versionCategory, exclusive); + const stats = await DB.ProjectStats.getLatest( + type, + versionCategory, + exclusive, + ); if (stats instanceof Error) { consola.error(stats.message); @@ -113,7 +113,7 @@ export async function exportStatsOverTime( date = new_date; } - const data = await getProjectStatsBulk( + const data = await DB.ProjectStats.getBulk( dates, type, versionCategory, diff --git a/server/utils/processing/gameVersions/processing.ts b/server/utils/processing/gameVersions/processing.ts index c04697c..c2eb63c 100644 --- a/server/utils/processing/gameVersions/processing.ts +++ b/server/utils/processing/gameVersions/processing.ts @@ -6,13 +6,12 @@ import type { SupportedVersions, } from "~~/server/utils/processing/gameVersions/types"; import type { Version } from "~~/server/utils/processing/projects/types"; -import { setGameVersions } from "~~/server/utils/storage"; export async function updateGameVersions() { const versions = await getGameVersions(); const gameVersions = groupGameVersions(versions); - await setGameVersions(gameVersions); + await DB.GameVersions.set(gameVersions); } // returns what versionGroup (all, minor, major) a specif projectVersion supports diff --git a/server/utils/processing/global/processing.ts b/server/utils/processing/global/processing.ts index 3a9203d..71f7271 100644 --- a/server/utils/processing/global/processing.ts +++ b/server/utils/processing/global/processing.ts @@ -1,11 +1,10 @@ import consola from "consola"; import type { GlobalStats } from "~~/server/utils/processing/global/types"; -import { setGlobalStats } from "~~/server/utils/storage"; export async function updateGlobalStats() { consola.log("fetching globalStats"); const data = await $modrinthFetch("/statistics"); - await setGlobalStats(data, new Date()); + await DB.GlobalStats.set(data, new Date()); } diff --git a/server/utils/processing/projects/processing.ts b/server/utils/processing/projects/processing.ts index 1da2a6a..a03d164 100644 --- a/server/utils/processing/projects/processing.ts +++ b/server/utils/processing/projects/processing.ts @@ -14,7 +14,6 @@ import type { ProjectStats, Version, } from "~~/server/utils/processing/projects/types"; -import { getGameVersions, setProjectStats } from "~~/server/utils/storage"; type StatsDataType = Map< string, @@ -75,13 +74,13 @@ async function updateStatistic(type: ProjectTypes) { } async function saveStats(stats: AllStats, type: ProjectTypes) { - await setProjectStats(stats.all.all, type, "all", false); - await setProjectStats(stats.all.minor, type, "minor", false); - await setProjectStats(stats.all.major, type, "major", false); + await DB.ProjectStats.set(stats.all.all, type, "all", false); + await DB.ProjectStats.set(stats.all.minor, type, "minor", false); + await DB.ProjectStats.set(stats.all.major, type, "major", false); - await setProjectStats(stats.exclusive.all, type, "all", true); - await setProjectStats(stats.exclusive.minor, type, "minor", true); - await setProjectStats(stats.exclusive.major, type, "major", true); + await DB.ProjectStats.set(stats.exclusive.all, type, "all", true); + await DB.ProjectStats.set(stats.exclusive.minor, type, "minor", true); + await DB.ProjectStats.set(stats.exclusive.major, type, "major", true); } async function getStatistics(type: ProjectTypes): Promise { @@ -91,7 +90,7 @@ async function getStatistics(type: ProjectTypes): Promise { exclusive: { all: new Map(), major: new Map(), minor: new Map() }, }; - const gameVersions = await getGameVersions(); + const gameVersions = await DB.GameVersions.get(); if (gameVersions instanceof Error) { return gameVersions; diff --git a/server/utils/storage.ts b/server/utils/storage.ts index 41854a6..41e69b0 100644 --- a/server/utils/storage.ts +++ b/server/utils/storage.ts @@ -5,49 +5,114 @@ import type { import type { GlobalStats } from "~~/server/utils/processing/global/types"; import type { ProjectStats } from "~~/server/utils/processing/projects/types"; -export async function setGameVersions(gameVersions: GameVersions) { - const storage = useStorage("metadata"); - await storage.setItem("gameVersions", gameVersions); -} - -export async function getGameVersions(): Promise { - return getFromStorage("metadata", "gameVersions"); -} - -export async function setLatestDate(date: Date) { - const storage = useStorage("metadata"); - await storage.setItem("latestDate", dateToKey(date)); -} - -export async function getLatestDate(): Promise { - return getFromStorage("metadata", "latestDate"); -} - -export async function setGlobalStats(data: GlobalStats, date: Date) { - const storage = useStorage("globalStatistics"); - const dateKey = dateToKey(date); - - await storage.setItem(`globalStats${dateKey}`, data); -} - -export async function getGlobalStatsBulk( - dates: Date[], -): Promise<(GlobalStats | Error)[]> { - const keys = dates.map((date) => { - const dateKey = dateToKey(date); - return `globalStats${dateKey}`; - }); - - return getFromStorageBulk("globalStatistics", keys); -} +export const DB = { + GameVersions: { + async set(gameVersions: GameVersions) { + const storage = useStorage("metadata"); + await storage.setItem("gameVersions", gameVersions); + }, + async get(): Promise { + return getFromStorage("metadata", "gameVersions"); + }, + }, + LatestDate: { + async set(date: Date) { + const storage = useStorage("metadata"); + await storage.setItem("latestDate", dateToKey(date)); + }, + async get(): Promise { + return getFromStorage("metadata", "latestDate"); + }, + }, + GlobalStats: { + async set(data: GlobalStats, date: Date) { + const storage = useStorage("metadata"); + const dateKey = dateToKey(date); + + await storage.setItem(`globalStats${dateKey}`, data); + }, + async getBulk(dates: Date[]): Promise<(GlobalStats | Error)[]> { + const keys = dates.map((date) => { + const dateKey = dateToKey(date); + return `globalStats${dateKey}`; + }); + + return getFromStorageBulk("globalStatistics", keys); + }, + async getLatest(): Promise { + const dateKey = await DB.LatestDate.get(); + if (dateKey instanceof Error) return dateKey; + + const key = `globalStats${dateKey}`; + return getFromStorage("globalStatistics", key); + }, + }, + ProjectStats: { + async set( + data: ProjectStats, + type: ProjectTypes, + versionCategory: VersionCategories, + exclusive: boolean, + ) { + const storage = useStorage("projectStatistics"); + + const dateKey = dateToKey(new Date()); + const key = getProjectStorageKey( + type, + versionCategory, + exclusive, + dateKey, + ); -export async function getLatestGlobalStats(): Promise { - const dateKey = await getLatestDate(); - if (dateKey instanceof Error) return dateKey; + await storage.setItem(key, data); + }, + async get( + date: Date, + type: ProjectTypes, + versionCategory: VersionCategories, + exclusive: boolean, + ): Promise { + const dateKey = dateToKey(date); + const key = getProjectStorageKey( + type, + versionCategory, + exclusive, + dateKey, + ); - const key = `globalStats${dateKey}`; - return getFromStorage("globalStatistics", key); -} + return getFromStorage("projectStatistics", key); + }, + async getBulk( + dates: Date[], + type: ProjectTypes, + versionCategory: VersionCategories, + exclusive: boolean, + ): Promise<(ProjectStats | Error)[]> { + const keys = dates.map((date) => { + const dateKey = dateToKey(date); + return getProjectStorageKey(type, versionCategory, exclusive, dateKey); + }); + + return getFromStorageBulk("projectStatistics", keys); + }, + async getLatest( + type: ProjectTypes, + versionCategory: VersionCategories, + exclusive: boolean, + ): Promise { + const dateKey = await DB.LatestDate.get(); + if (dateKey instanceof Error) return dateKey; + + const key = getProjectStorageKey( + type, + versionCategory, + exclusive, + dateKey, + ); + return getFromStorage("projectStatistics", key); + }, + }, +}; function getProjectStorageKey( type: ProjectTypes, @@ -66,58 +131,6 @@ function getProjectStorageKey( return key; } -export async function setProjectStats( - data: ProjectStats, - type: ProjectTypes, - versionCategory: VersionCategories, - exclusive: boolean, -) { - const storage = useStorage("projectStatistics"); - - const dateKey = dateToKey(new Date()); - const key = getProjectStorageKey(type, versionCategory, exclusive, dateKey); - - await storage.setItem(key, data); -} - -export async function getProjectStats( - date: Date, - type: ProjectTypes, - versionCategory: VersionCategories, - exclusive: boolean, -): Promise { - const dateKey = dateToKey(date); - const key = getProjectStorageKey(type, versionCategory, exclusive, dateKey); - - return getFromStorage("projectStatistics", key); -} - -export async function getProjectStatsBulk( - dates: Date[], - type: ProjectTypes, - versionCategory: VersionCategories, - exclusive: boolean, -): Promise<(ProjectStats | Error)[]> { - const keys = dates.map((date) => { - const dateKey = dateToKey(date); - return getProjectStorageKey(type, versionCategory, exclusive, dateKey); - }); - - return getFromStorageBulk("projectStatistics", keys); -} - -export async function getLatestProjectStats( - type: ProjectTypes, - versionCategory: VersionCategories, - exclusive: boolean, -): Promise { - const dateKey = await getLatestDate(); - if (dateKey instanceof Error) return dateKey; - - const key = getProjectStorageKey(type, versionCategory, exclusive, dateKey); - return getFromStorage("projectStatistics", key); -} - async function getFromStorage(storageName: string, key: string) { const storage = useStorage(storageName); const data = (await storage.getItem(key)) as t; -- 2.54.0