Skip to content

Commit

Permalink
Merge pull request #47 from Prodeko/analytics-timeseries
Browse files Browse the repository at this point in the history
Analytics timeseries
  • Loading branch information
nlinnanen committed May 6, 2024
2 parents 7c7f585 + edf15d0 commit c90c62a
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 12 deletions.
29 changes: 20 additions & 9 deletions src/server/analytics.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
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";
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 });

Expand Down Expand Up @@ -62,28 +64,37 @@ 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<Guild, number>),
};
});

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
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");
}
});

Expand Down
6 changes: 3 additions & 3 deletions src/server/middleware.ts → src/server/validators.ts
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -26,5 +26,5 @@ export const validatePeriod = (req: Request, res: Response, next: NextFunction)
res.locals.periodStart = startDate;
res.locals.periodEnd = endDate;

next();
return res
}

0 comments on commit c90c62a

Please sign in to comment.