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;
+}