mirror of
https://github.com/gnmyt/myspeed.git
synced 2026-04-22 19:49:29 -05:00
Updated the speedtests.js controller
This commit is contained in:
@@ -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: {
|
||||
|
||||
Reference in New Issue
Block a user