From ce74cb0a868b931ecde81d960d641fd89b495aa6 Mon Sep 17 00:00:00 2001 From: tobinio Date: Sat, 26 Oct 2024 09:52:20 +0200 Subject: [PATCH] improving typing --- server/api/stats/projects.ts | 27 ++++--------------- server/api/stats/time/projects.ts | 27 ++++--------------- server/utils/api/project.ts | 25 +++++++++++++++++ server/utils/export/projectStats.ts | 5 ++-- server/utils/processing/gameVersions/types.ts | 13 +++------ server/utils/storage.ts | 26 +++++++++--------- 6 files changed, 55 insertions(+), 68 deletions(-) create mode 100644 server/utils/api/project.ts diff --git a/server/api/stats/projects.ts b/server/api/stats/projects.ts index 07b9188..2ceab09 100644 --- a/server/api/stats/projects.ts +++ b/server/api/stats/projects.ts @@ -1,7 +1,6 @@ -import type { - ProjectStatCategory, - ProjectStatsValue, -} from "~~/server/utils/processing/projects/types"; +import { statStringToExtraction } from "~~/server/utils/api/project"; +import type { VersionCategories } from "~~/server/utils/processing/gameVersions/types"; +import type { ProjectStatCategory } from "~~/server/utils/processing/projects/types"; type QueryData = { stat: ProjectStatCategory; @@ -15,26 +14,10 @@ type QueryData = { export default defineCachedEventHandler( async (event): Promise => { const query = getQuery(event); - - let typeFn: (value: ProjectStatsValue) => number; - - switch (query.stat) { - case "versions": { - typeFn = (value) => value.versions; - break; - } - case "count": { - typeFn = (value) => value.count; - break; - } - default: { - typeFn = (value) => value.downloads; - break; - } - } + const typeFn = statStringToExtraction(query.stat); return exportStats( - query.mode as "all" | "major" | "minor", + query.mode as VersionCategories, query.type, query.exclusive === "true", typeFn, diff --git a/server/api/stats/time/projects.ts b/server/api/stats/time/projects.ts index 18d7e6c..6e79643 100644 --- a/server/api/stats/time/projects.ts +++ b/server/api/stats/time/projects.ts @@ -1,7 +1,6 @@ -import type { - ProjectStatCategory, - ProjectStatsValue, -} from "~~/server/utils/processing/projects/types"; +import { statStringToExtraction } from "~~/server/utils/api/project"; +import type { VersionCategories } from "~~/server/utils/processing/gameVersions/types"; +import type { ProjectStatCategory } from "~~/server/utils/processing/projects/types"; type QueryData = { stat: ProjectStatCategory; @@ -14,26 +13,10 @@ type QueryData = { export default defineCachedEventHandler( async (event): Promise => { const query = getQuery(event); - - let typeFn: (value: ProjectStatsValue) => number; - - switch (query.stat) { - case "versions": { - typeFn = (value) => value.versions; - break; - } - case "count": { - typeFn = (value) => value.count; - break; - } - default: { - typeFn = (value) => value.downloads; - break; - } - } + const typeFn = statStringToExtraction(query.stat); return exportStatsOverTime( - query.mode as "all" | "major" | "minor", + query.mode as VersionCategories, query.type, query.exclusive === "true", new Date(), diff --git a/server/utils/api/project.ts b/server/utils/api/project.ts new file mode 100644 index 0000000..0a52125 --- /dev/null +++ b/server/utils/api/project.ts @@ -0,0 +1,25 @@ +import type { + ProjectStatCategory, + ProjectStatsValue, +} from "~~/server/utils/processing/projects/types"; + +export function statStringToExtraction(stat: ProjectStatCategory) { + let typeFn: (value: ProjectStatsValue) => number; + + switch (stat) { + case "versions": { + typeFn = (value) => value.versions; + break; + } + case "count": { + typeFn = (value) => value.count; + break; + } + default: { + typeFn = (value) => value.downloads; + break; + } + } + + return typeFn; +} diff --git a/server/utils/export/projectStats.ts b/server/utils/export/projectStats.ts index 55190f6..d4b03be 100644 --- a/server/utils/export/projectStats.ts +++ b/server/utils/export/projectStats.ts @@ -1,4 +1,5 @@ import consola from "consola"; +import type { VersionCategories } from "~~/server/utils/processing/gameVersions/types"; import type { ProjectStats, ProjectStatsValue, @@ -54,7 +55,7 @@ function filterVersions( } export async function exportStats( - versionCategory: "all" | "major" | "minor", + versionCategory: VersionCategories, type: ProjectTypes, exclusive: boolean, fn: (value: ProjectStatsValue) => number, @@ -80,7 +81,7 @@ export async function exportStats( } export async function exportStatsOverTime( - versionCategory: "all" | "major" | "minor", + versionCategory: VersionCategories, type: ProjectTypes, exclusive: boolean, firstDate: Date, diff --git a/server/utils/processing/gameVersions/types.ts b/server/utils/processing/gameVersions/types.ts index 6a9bb06..70a5c73 100644 --- a/server/utils/processing/gameVersions/types.ts +++ b/server/utils/processing/gameVersions/types.ts @@ -5,14 +5,7 @@ export type GameVersion = { export type GameVersionData = { name: string; contains: string[] }[]; -export type GameVersions = { - all: GameVersionData; - major: GameVersionData; - minor: GameVersionData; -}; +export type VersionCategories = "all" | "major" | "minor"; -export type SupportedVersions = { - all: string[]; - major: string[]; - minor: string[]; -}; +export type GameVersions = Record; +export type SupportedVersions = Record; diff --git a/server/utils/storage.ts b/server/utils/storage.ts index fe7b423..39bc7f6 100644 --- a/server/utils/storage.ts +++ b/server/utils/storage.ts @@ -1,4 +1,7 @@ -import type { GameVersions } from "~~/server/utils/processing/gameVersions/types"; +import type { + GameVersions, + VersionCategories, +} from "~~/server/utils/processing/gameVersions/types"; import type { GlobalStats } from "~~/server/utils/processing/global/types"; import type { ProjectStats } from "~~/server/utils/processing/projects/types"; @@ -27,23 +30,24 @@ export async function setGlobalStats(data: GlobalStats, date: Date) { await storage.setItem(`globalStats${dateKey}`, data); } -export async function getLatestGlobalStats(): Promise { - const dateKey = await getLatestDate(); +export async function getGlobalStats(date: Date): Promise { + const dateKey = dateToKey(date); const key = `globalStats${dateKey}`; return getFromStorage("globalStatistics", key); } -export async function getGlobalStats(date: Date): Promise { - const dateKey = dateToKey(date); - const key = `globalStats${dateKey}`; +export async function getLatestGlobalStats(): Promise { + const dateKey = await getLatestDate(); + if (dateKey instanceof Error) return dateKey; + const key = `globalStats${dateKey}`; return getFromStorage("globalStatistics", key); } function getProjectStorageKey( type: ProjectTypes, - versionCategory: "all" | "major" | "minor", + versionCategory: VersionCategories, exclusive: boolean, dateKey: string, ) { @@ -61,7 +65,7 @@ function getProjectStorageKey( export async function setProjectStats( data: ProjectStats, type: ProjectTypes, - versionCategory: "all" | "major" | "minor", + versionCategory: VersionCategories, exclusive: boolean, ) { const storage = useStorage("projectStatistics"); @@ -75,7 +79,7 @@ export async function setProjectStats( export async function getProjectStats( date: Date, type: ProjectTypes, - versionCategory: "all" | "major" | "minor", + versionCategory: VersionCategories, exclusive: boolean, ): Promise { const dateKey = dateToKey(date); @@ -86,15 +90,13 @@ export async function getProjectStats( export async function getLatestProjectStats( type: ProjectTypes, - versionCategory: "all" | "major" | "minor", + 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); } -- 2.51.2