Updated the speedtests.js controller

This commit is contained in:
Mathias Wagner
2023-11-30 12:32:29 +01:00
parent 8ee4e61d86
commit ef1b461475
+15 -49
View File
@@ -1,33 +1,30 @@
const tests = require('../models/Speedtests');
const {Op, Sequelize} = require("sequelize");
const {mapFixed, mapRounded, calculateTestAverages} = require("../util/helpers");
// Inserts a new speedtest into the database
module.exports.create = async (ping, download, upload, time, type = "auto", error = null) => {
return (await tests.create({ping, download, upload, error, type, time})).id;
}
// Gets a specific speedtest by id
module.exports.get = async (id) => {
module.exports.getOne = async (id) => {
let speedtest = await tests.findByPk(id);
if (speedtest === null) return null;
if (speedtest.error === null) delete speedtest.error;
return speedtest
}
// Lists all speedtests from the database
module.exports.list = async (hours = 24, start, limit) => {
module.exports.listTests = async (hours = 24, start, limit) => {
const whereClause = start ? {id: {[Op.lt]: start}} : undefined;
let dbEntries = (await tests.findAll({where: whereClause, order: [["created", "DESC"]], limit}))
.filter((entry) => new Date(entry.created) > new Date().getTime() - hours * 3600000);
for (let dbEntry of dbEntries)
if (dbEntry.error === null) delete dbEntry.error
if (dbEntry.error === null) delete dbEntry.error;
return dbEntries;
}
// Lists all speedtests from the database grouped by days
module.exports.listByDays = async (days) => {
let dbEntries = (await tests.findAll({order: [["created", "DESC"]]})).filter((entry) => entry.error === null)
.filter((entry) => new Date(entry.created) > new Date().getTime() - days * 24 * 3600000);
@@ -42,7 +39,6 @@ module.exports.listByDays = async (days) => {
return averages;
}
// Calculates the average speedtests and lists them
module.exports.listAverage = async (days) => {
const averages = await this.listByDays(days);
let result = [];
@@ -51,22 +47,15 @@ module.exports.listAverage = async (days) => {
result.push(averages[Object.keys(averages)[0]][0]);
for (let day in averages) {
let avgNumbers = {ping: 0, down: 0, up: 0, time: 0};
let currentDay = averages[day];
currentDay.forEach((current) => {
avgNumbers.ping += current.ping;
avgNumbers.down += current.download;
avgNumbers.up += current.upload;
avgNumbers.time += current.time;
});
let avgNumbers = calculateTestAverages(currentDay);
const created = new Date(currentDay[0].created);
result.push({
ping: Math.round(avgNumbers["ping"] / currentDay.length),
download: parseFloat((avgNumbers["down"] / currentDay.length).toFixed(2)),
upload: parseFloat((avgNumbers["up"] / currentDay.length).toFixed(2)),
time: Math.round(avgNumbers["time"] / currentDay.length),
ping: Math.round(avgNumbers["ping"]),
download: parseFloat((avgNumbers["down"]).toFixed(2)),
upload: parseFloat((avgNumbers["up"]).toFixed(2)),
time: Math.round(avgNumbers["time"]),
type: "average",
amount: currentDay.length,
created: created.getFullYear() + "-" + (created.getMonth() + 1) + "-" + created.getDate()
@@ -76,18 +65,6 @@ module.exports.listAverage = async (days) => {
return result;
}
const mapFixed = (entries, type) => ({
min: Math.min(...entries.map((entry) => entry[type])),
max: Math.max(...entries.map((entry) => entry[type])),
avg: parseFloat((entries.reduce((a, b) => a + b[type], 0) / entries.length).toFixed(2))
});
const mapRounded = (entries, type) => ({
min: Math.min(...entries.map((entry) => entry[type])),
max: Math.max(...entries.map((entry) => entry[type])),
avg: Math.round(entries.reduce((a, b) => a + b[type], 0) / entries.length)
});
module.exports.listStatistics = async (days) => {
let dbEntries = (await tests.findAll({order: [["created", "DESC"]]}))
.filter((entry) => new Date(entry.created) > new Date().getTime() - (days <= 30 ? days : 30 ) * 24 * 3600000);
@@ -97,6 +74,9 @@ module.exports.listStatistics = async (days) => {
let notFailed = dbEntries.filter((entry) => entry.error === null);
let data = ["ping", "download", "upload", "time"]
.map((item) => days >= 3 ? avgEntries.map(entry => entry[item]) : notFailed.map(entry => entry[item]));
return {
tests: {
total: dbEntries.length,
@@ -107,32 +87,18 @@ module.exports.listStatistics = async (days) => {
download: mapFixed(notFailed, "download"),
upload: mapFixed(notFailed, "upload"),
time: mapRounded(notFailed, "time"),
data: {
ping: days >= 3 ? avgEntries.map((entry) => entry.ping) : notFailed.map((entry) => entry.ping),
download: days >= 3 ? avgEntries.map((entry) => entry.download) : notFailed.map((entry) => entry.download),
upload: days >= 3 ? avgEntries.map((entry) => entry.upload) : notFailed.map((entry) => entry.upload),
time: days >= 3 ? avgEntries.map((entry) => entry.time) : notFailed.map((entry) => entry.time)
},
data,
labels: days >= 3 ? avgEntries.map((entry) => new Date(entry.created).toLocaleDateString())
: notFailed.map((entry) => new Date(entry.created).toLocaleTimeString([], {hour: "2-digit", minute: "2-digit"}))
};
}
// Gets the latest speedtest from the database
module.exports.latest = async () => {
let speedtest = await tests.findOne({order: [["created", "DESC"]]});
if (speedtest != null && speedtest.error === null) delete speedtest.error;
return speedtest
}
// Deletes a specific speedtest
module.exports.delete = async (id) => {
if (await this.get(id) === null) return false;
module.exports.deleteOne = async (id) => {
if (await this.getOne(id) === null) return false;
await tests.destroy({where: {id: id}});
return true;
}
// Removes speedtests older than 30 days
module.exports.removeOld = async () => {
await tests.destroy({
where: {