53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
import express from "express";
|
|
import { INFLUXDB_BUCKET, InfluxQueryAPI } from "../index";
|
|
import { formatString } from "../utils/stringUtils";
|
|
|
|
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}")
|
|
|> range(start: {})
|
|
|> 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();
|
|
|
|
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)
|
|
);
|
|
let history = rows.map((row: any) => ({
|
|
time: row._time,
|
|
value: row._value !== null ? row._value.toFixed(0) : null,
|
|
}));
|
|
history = history.sort(
|
|
(a: any, b: any) => new Date(a.time).getTime() - new Date(b.time).getTime()
|
|
);
|
|
|
|
return res.json({
|
|
serverTimeTaken: new Date().getTime() - before + "ms",
|
|
history: history,
|
|
});
|
|
});
|
|
|
|
app.listen(port, () => {
|
|
console.log(`API Server is running on http://localhost:${port}`);
|
|
});
|