diff --git a/server/controller/speedtests.js b/server/controller/speedtests.js index f80ea28e..1c1428fd 100644 --- a/server/controller/speedtests.js +++ b/server/controller/speedtests.js @@ -1,6 +1,6 @@ const tests = require('../models/Speedtests'); const {Op, Sequelize} = require("sequelize"); -const {mapFixed, mapRounded, calculateTestAverages} = require("../util/helpers"); +const {mapFixed, mapRounded} = require("../util/helpers"); module.exports.create = async (ping, download, upload, time, serverId, type = "auto", resultId = null, error = null) => { return (await tests.create({ping, download, upload, error, serverId, type, resultId, time, created: new Date().toISOString()})).id; @@ -23,12 +23,18 @@ module.exports.listAll = async () => { return dbEntries; } -module.exports.listTests = async (hours = 24, start, limit) => { +module.exports.listTests = async (afterId, limit) => { limit = parseInt(limit) || 10; - 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); + let whereClause = {}; + + if (afterId) whereClause.id = {[Op.lt]: afterId}; + + let dbEntries = await tests.findAll({ + where: Object.keys(whereClause).length > 0 ? whereClause : undefined, + order: [["created", "DESC"]], + limit + }); for (let dbEntry of dbEntries) { if (dbEntry.error === null) delete dbEntry.error; @@ -38,46 +44,6 @@ module.exports.listTests = async (hours = 24, start, limit) => { return dbEntries; } -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); - - let averages = {}; - dbEntries.forEach((entry) => { - const day = new Date(entry.created).toLocaleDateString(); - if (!averages[day]) averages[day] = []; - averages[day].push(entry); - }); - - return averages; -} - -module.exports.listAverage = async (days) => { - const averages = await this.listByDays(days); - let result = []; - - if (Object.keys(averages).length !== 0) - result.push(averages[Object.keys(averages)[0]][0]); - - for (let day in averages) { - let currentDay = averages[day]; - let avgNumbers = calculateTestAverages(currentDay); - - const created = new Date(currentDay[0].created); - result.push({ - 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.toISOString() - }); - } - - return result; -} - module.exports.deleteTests = async () => { await tests.destroy({where: {}}); return true; @@ -107,17 +73,13 @@ 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); - let avgEntries = []; - if (days >= 3) avgEntries = await this.listAverage(days); - let notFailed = dbEntries.filter((entry) => entry.error === null); let data = {}; ["ping", "download", "upload", "time"].forEach(item => { - data[item] = days >= 3 ? avgEntries.map(entry => entry[item]) : notFailed.map(entry => entry[item]); + data[item] = notFailed.map(entry => entry[item]); }); - return { tests: { total: dbEntries.length, @@ -129,8 +91,7 @@ module.exports.listStatistics = async (days) => { upload: mapFixed(notFailed, "upload"), time: mapRounded(notFailed, "time"), data, - labels: days >= 3 ? avgEntries.map((entry) => new Date(entry.created).toISOString()) - : notFailed.map((entry) => new Date(entry.created).toISOString()) + labels: notFailed.map((entry) => new Date(entry.created).toISOString()) }; } @@ -151,13 +112,6 @@ module.exports.removeOld = async () => { return true; } -module.exports.getLatest = async () => { - let latest = await tests.findOne({order: [["created", "DESC"]]}); - if (latest.error === null) delete latest.error; - if (latest.resultId === null) delete latest.resultId; - return latest; -} - module.exports.getLatest = async () => { let latest = await tests.findOne({order: [["created", "DESC"]]}); if (latest === null) return undefined; diff --git a/server/routes/speedtests.js b/server/routes/speedtests.js index 10f61060..b53b4dcf 100644 --- a/server/routes/speedtests.js +++ b/server/routes/speedtests.js @@ -9,11 +9,10 @@ app.get("/", password(true), async (req, res) => { if (req.query.limit && /[^0-9]/.test(req.query.limit)) return res.status(400).json({message: "You need to provide a correct number in the limit parameter"}); - res.json(await tests.listTests(req.query.hours || 24, req.query.start, req.query.limit)); -}); + if (req.query.afterId && /[^0-9]/.test(req.query.afterId)) + return res.status(400).json({message: "You need to provide a correct number in the afterId parameter"}); -app.get("/averages", password(true), async (req, res) => { - res.json(await tests.listAverage(req.query.days || 7)); + res.json(await tests.listTests(req.query.afterId, req.query.limit)); }); app.get("/statistics", password(true), async (req, res) => {