diff --git a/app/pages/charts.vue b/app/pages/charts.vue index 5945ad6..65c61b2 100644 --- a/app/pages/charts.vue +++ b/app/pages/charts.vue @@ -10,6 +10,9 @@ const versionGroup = useFilterItem("versionGroup", "major"); const time = useFilterItem("time", "current"); +const aggregate = useFilterItem("aggregate", "yes"); +const aggregateBool = computed(() => aggregate.value === "yes"); + const exclusive = useFilterItem("exclusive", "yes"); const exclusiveBool = computed(() => exclusive.value === "yes"); @@ -42,6 +45,7 @@ const data = useStatData(isGlobalStats, isRevenueStats, time, { versionTo: versionTo, versionFrom: versionFrom, version: version, + aggregate: aggregateBool, }); const explanation = computed(() => { @@ -79,6 +83,10 @@ const sideBarOpen = ref(false); + + diff --git a/nuxt.config.ts b/nuxt.config.ts index 90a5204..69a091d 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -52,6 +52,9 @@ export default defineNuxtConfig({ databaseName: `${process.env.MONGODB_DEV_DB}`, collectionName: "metadata", }, + cache: { + driver: "null", + }, }, experimental: { tasks: true, diff --git a/server/api/stats/time/global.ts b/server/api/stats/time/global.ts index bee5ff7..9809a1c 100644 --- a/server/api/stats/time/global.ts +++ b/server/api/stats/time/global.ts @@ -1,10 +1,12 @@ 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; + aggregate: string; }; export default defineCachedEventHandler( @@ -48,7 +50,12 @@ export default defineCachedEventHandler( } } - return exportGlobalStatsOverTime(dateKey, typeFn); + const data = await exportGlobalStatsOverTime(dateKey, typeFn); + + if (query.aggregate === "false") { + return fracture(data); + } + return data; }, { maxAge: 60 * 60 /* 1 hour */, swr: false }, ); diff --git a/server/api/stats/time/projects.ts b/server/api/stats/time/projects.ts index b596331..078de25 100644 --- a/server/api/stats/time/projects.ts +++ b/server/api/stats/time/projects.ts @@ -9,6 +9,7 @@ type QueryData = { type: ProjectTypes; exclusive: string; version: string; + aggregate: string; }; export default defineCachedEventHandler( @@ -16,7 +17,7 @@ export default defineCachedEventHandler( const query = getQuery(event); const typeFn = statStringToExtraction(query.stat); - return exportStatsOverTime( + const data = await exportStatsOverTime( query.mode as VersionCategories, query.type, query.exclusive === "true", @@ -24,6 +25,11 @@ export default defineCachedEventHandler( query.version, typeFn, ); + + if (query.aggregate === "false") { + return fracture(data); + } + return data; }, { maxAge: 60 * 60 /* 1 hour */, swr: false }, ); diff --git a/server/utils/processing/aggregate.ts b/server/utils/processing/aggregate.ts new file mode 100644 index 0000000..0198965 --- /dev/null +++ b/server/utils/processing/aggregate.ts @@ -0,0 +1,19 @@ +import { align } from "consola/utils"; +import type { StatExport } from "~~/shared/types/types"; + +export function fracture(data: StatExport): StatExport { + data.labels.splice(0, 1); + + data.data.map((value) => { + const data = []; + + for (let i = 0; i < value.data.length - 1; i++) { + data.push(value.data[i + 1] - value.data[i]); + } + value.data = data; + + return value; + }); + + return data; +}