From f95bc3c797c48f2d0448ec2eb0fb6260a4fe52a1 Mon Sep 17 00:00:00 2001 From: Niklas Linnanen Date: Mon, 6 May 2024 16:58:25 +0000 Subject: [PATCH 1/2] Change structure of time-series data --- src/server/analytics.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/server/analytics.ts b/src/server/analytics.ts index f3b4d04..d132546 100644 --- a/src/server/analytics.ts +++ b/src/server/analytics.ts @@ -6,6 +6,8 @@ import { arrayToCSV } from "../common/utils"; import { getTimeSeriesData } from "../analytics/timeseries"; import entry from "../commands/entry"; import { GUILDS } from "../common/constants"; +import _ from "lodash"; +import { Guild } from "../common/types"; const router = express.Router({ mergeParams: true }); @@ -62,10 +64,20 @@ router.get("/time-series", async (req, res) => { const timeSeries = await getTimeSeriesData(); - const csv = arrayToCSV(["date", "guild", "totalPoints"], timeSeries); + const groupedSeries = _.groupBy(timeSeries, (e) => e.date); + const guildsAsColumns = _.map(groupedSeries, (entries, date) => { + return { + date, + ...(Object.fromEntries( + entries.map((e) => [e.guild, e.totalPoints]), + ) as Record), + }; + }); + + const csv = arrayToCSV(["date", ...GUILDS], guildsAsColumns); res.header("Content-Type", "text/csv"); - res.status(200).send(csv); + res.status(200).send(csv); }); // Middleware to validate the period start and end query parameters From edf15d09dafdd355810d96a6e204088d1d8d8f6b Mon Sep 17 00:00:00 2001 From: Niklas Linnanen Date: Mon, 6 May 2024 17:00:56 +0000 Subject: [PATCH 2/2] Move one middleware inside a function --- src/server/analytics.ts | 13 ++++++------- src/server/{middleware.ts => validators.ts} | 6 +++--- 2 files changed, 9 insertions(+), 10 deletions(-) rename src/server/{middleware.ts => validators.ts} (82%) diff --git a/src/server/analytics.ts b/src/server/analytics.ts index d132546..cde0b0a 100644 --- a/src/server/analytics.ts +++ b/src/server/analytics.ts @@ -1,5 +1,5 @@ import express from "express"; -import { validatePeriod } from "./middleware"; +import { validatePeriod } from "./validators"; import { calculateGuildStatistics } from "../analytics/statistics"; import topUsersByGuild from "../analytics/rankings"; import { arrayToCSV } from "../common/utils"; @@ -80,22 +80,21 @@ router.get("/time-series", async (req, res) => { res.status(200).send(csv); }); -// Middleware to validate the period start and end query parameters -router.use(validatePeriod); - router.get("/statistics", async (req, res: StatisticsResponse) => { if (req.query.pass !== process.env.ADMIN_PASSWORD) { console.log("Wrong password"); return res.status(401).send("Wrong password!"); } - const { periodStart, periodEnd } = res.locals; + const validatedRes = validatePeriod(req, res); + + const { periodStart, periodEnd } = validatedRes.locals; try { const statistics = await calculateGuildStatistics(periodStart, periodEnd); - res.json(Object.fromEntries(statistics)); + validatedRes.json(Object.fromEntries(statistics)); } catch (error) { console.error(error); - res.status(500).send("An error occurred while calculating statistics"); + validatedRes.status(500).send("An error occurred while calculating statistics"); } }); diff --git a/src/server/middleware.ts b/src/server/validators.ts similarity index 82% rename from src/server/middleware.ts rename to src/server/validators.ts index 5a94afc..13631d8 100644 --- a/src/server/middleware.ts +++ b/src/server/validators.ts @@ -1,6 +1,6 @@ -import type { NextFunction, Request, Response } from "express"; +import type { Request, Response } from "express"; -export const validatePeriod = (req: Request, res: Response, next: NextFunction) => { +export const validatePeriod = (req: Request, res: Response) => { const start = req.query.start; const end = req.query.end; @@ -26,5 +26,5 @@ export const validatePeriod = (req: Request, res: Response, next: NextFunction) res.locals.periodStart = startDate; res.locals.periodEnd = endDate; - next(); + return res } \ No newline at end of file