53 lines
1.5 KiB
TypeScript
Raw Normal View History

2023-10-27 15:54:11 +01:00
import express from "express";
import { INFLUXDB_BUCKET, InfluxQueryAPI } from "../index";
2023-10-27 16:13:51 +01:00
import { formatString } from "../utils/stringUtils";
2023-10-27 15:54:11 +01:00
const app = express();
const port = process.env.PORT || 3000;
// Query to get the player count history for tge last 24 hours in 1 hour intervals
const getPlayerHistoryQuery = `from(bucket: "${INFLUXDB_BUCKET}")
2023-10-27 16:13:51 +01:00
|> range(start: {})
2023-10-27 15:54:11 +01:00
|> filter(fn: (r) => r["_measurement"] == "scoresaber")
|> filter(fn: (r) => r["_field"] == "value")
|> filter(fn: (r) => r["type"] == "player_count")
|> aggregateWindow(every: 1h, fn: mean)
|> yield()
`;
app.get("/", (req, res) => {
res.send("Hello!");
});
app.get("/analytics", async (req, res) => {
const before = new Date().getTime();
2023-10-27 16:13:51 +01:00
const timeQuery = req.query.time || "24h";
const timeInMs = parseTimeToMilliseconds(timeQuery.toString());
if (timeInMs > 30 * 24 * 60 * 60 * 1000) {
return res.status(400).json({
error: "Time range too large. Max time range is 30 days.",
});
}
const rows = await InfluxQueryAPI.collectRows(
formatString(getPlayerHistoryQuery, false, timeQuery)
);
2023-10-27 15:54:11 +01:00
let history = rows.map((row: any) => ({
time: row._time,
2023-10-27 15:56:42 +01:00
value: row._value !== null ? row._value.toFixed(0) : null,
2023-10-27 15:54:11 +01:00
}));
history = history.sort(
(a: any, b: any) => new Date(a.time).getTime() - new Date(b.time).getTime()
);
return res.json({
2023-10-27 15:56:42 +01:00
serverTimeTaken: new Date().getTime() - before + "ms",
2023-10-27 15:54:11 +01:00
history: history,
});
});
app.listen(port, () => {
console.log(`API Server is running on http://localhost:${port}`);
});