From 9ffe17e9ebd82b7ecf27f70ded8126e673188c88 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Wed, 22 Jan 2025 08:29:38 -0800 Subject: [PATCH] add db utils --- Server/controllers/monitorController.js | 10 ++++++++- Server/db/models/Check.js | 1 + Server/db/mongo/modules/checkModule.js | 26 +++++++++++++++++---- Server/db/mongo/utils/seedDb.js | 30 ++++++++++++++++++++----- Server/index.js | 3 +++ Server/routes/monitorRoute.js | 2 ++ 6 files changed, 61 insertions(+), 11 deletions(-) diff --git a/Server/controllers/monitorController.js b/Server/controllers/monitorController.js index 097172854..5b880f2c6 100644 --- a/Server/controllers/monitorController.js +++ b/Server/controllers/monitorController.js @@ -20,7 +20,7 @@ import { getTokenFromHeaders } from "../utils/utils.js"; import logger from "../utils/logger.js"; import { handleError, handleValidationError } from "./controllerUtils.js"; import axios from "axios"; - +import seedDb from "../db/mongo/utils/seedDb.js"; const SERVICE_NAME = "monitorController"; class MonitorController { @@ -495,6 +495,14 @@ class MonitorController { next(handleError(error, SERVICE_NAME, "getMonitorsByTeamId")); } }; + + seedDb = async (req, res, next) => { + try { + await seedDb(userId, teamId); + } catch (error) { + next(handleError(error, SERVICE_NAME, "seedDb")); + } + }; } export default MonitorController; diff --git a/Server/db/models/Check.js b/Server/db/models/Check.js index dba47a12e..af9f797b2 100644 --- a/Server/db/models/Check.js +++ b/Server/db/models/Check.js @@ -76,6 +76,7 @@ const CheckSchema = mongoose.Schema({ ...BaseCheckSchema.obj }, { timestamps: tr CheckSchema.index({ createdAt: 1 }); CheckSchema.index({ monitorId: 1, createdAt: 1 }); CheckSchema.index({ monitorId: 1, createdAt: -1 }); +CheckSchema.index({ teamId: 1, createdAt: -1 }); export default mongoose.model("Check", CheckSchema); export { BaseCheckSchema }; diff --git a/Server/db/mongo/modules/checkModule.js b/Server/db/mongo/modules/checkModule.js index 870011d9f..edc70e5d6 100644 --- a/Server/db/mongo/modules/checkModule.js +++ b/Server/db/mongo/modules/checkModule.js @@ -68,10 +68,9 @@ const createCheck = async (checkData) => { const getChecksByMonitor = async (req) => { try { const { monitorId } = req.params; - let { sortOrder, limit, dateRange, filter, page, rowsPerPage } = req.query; + let { sortOrder, dateRange, filter, page, rowsPerPage } = req.query; page = parseInt(page); rowsPerPage = parseInt(rowsPerPage); - // Match const matchStage = { monitorId: ObjectId.createFromHexString(monitorId), @@ -138,10 +137,10 @@ const getChecksByMonitor = async (req) => { const getChecksByTeam = async (req) => { try { - let { sortOrder, limit, dateRange, filter, page, rowsPerPage } = req.query; + let { sortOrder, dateRange, filter, page, rowsPerPage } = req.query; page = parseInt(page); rowsPerPage = parseInt(rowsPerPage); - + !dateRange && (dateRange = "day"); const { teamId } = req.params; const matchStage = { teamId: ObjectId.createFromHexString(teamId), @@ -184,6 +183,7 @@ const getChecksByTeam = async (req) => { const checks = await Check.aggregate([ { $match: matchStage }, { $sort: { createdAt: sortOrder } }, + { $facet: { summary: [{ $count: "checksCount" }], @@ -197,6 +197,24 @@ const getChecksByTeam = async (req) => { }, }, ]); + + const queryPlan = await Check.aggregate([ + { $match: matchStage }, + { $sort: { createdAt: sortOrder } }, + { + $facet: { + summary: [{ $count: "checksCount" }], + checks: [{ $skip: skip }, { $limit: rowsPerPage }], + }, + }, + { + $project: { + checksCount: { $arrayElemAt: ["$summary.checksCount", 0] }, + checks: "$checks", + }, + }, + ]).explain("executionStats"); + console.log(queryPlan); return checks[0]; } catch (error) { error.service = SERVICE_NAME; diff --git a/Server/db/mongo/utils/seedDb.js b/Server/db/mongo/utils/seedDb.js index 2d9ea4df8..b67276027 100644 --- a/Server/db/mongo/utils/seedDb.js +++ b/Server/db/mongo/utils/seedDb.js @@ -1,5 +1,8 @@ -import Monitor from "../models/Monitor"; -import Check from "../models/Check"; +import Monitor from "../../models/Monitor.js"; +import Check from "../../models/Check.js"; +import { ObjectId } from "mongodb"; +const FAKE_TEAM_ID = "67034bceb4c4ea3e8f75fa93"; +const FAKE_USER_ID = "67034bceb4c4ea3e8f75fa95"; const generateRandomUrl = () => { const domains = ["example.com", "test.org", "demo.net", "sample.io", "mock.dev"]; @@ -18,6 +21,7 @@ const generateChecks = (monitorId, count) => { checks.push({ monitorId, + teamId: FAKE_TEAM_ID, status, responseTime: Math.floor(Math.random() * 1000), // Random response time between 0-1000ms createdAt: timestamp, @@ -30,13 +34,27 @@ const generateChecks = (monitorId, count) => { const seedDb = async () => { try { + console.log("Deleting all monitors and checks"); await Monitor.deleteMany({}); await Check.deleteMany({}); + console.log("Adding monitors"); + for (let i = 0; i < 300; i++) { + const monitor = await Monitor.create({ + name: `Monitor ${i}`, + url: generateRandomUrl(), + type: "http", + userId: FAKE_USER_ID, + teamId: FAKE_TEAM_ID, + interval: 60000, + active: true, + }); + console.log(`Adding monitor and checks for monitor ${i}`); + const checks = generateChecks(monitor._id, 10000); + await Check.insertMany(checks); + } } catch (error) { console.error(error); } - - for (let i = 0; i < 300; i++) { - const monitor = await Monitor.create({}); - } }; + +export default seedDb; diff --git a/Server/index.js b/Server/index.js index 7a4129bc9..a4b67386e 100644 --- a/Server/index.js +++ b/Server/index.js @@ -74,6 +74,8 @@ import MongoDB from "./db/mongo/MongoDB.js"; import IORedis from "ioredis"; +import seedDb from "./db/mongo/utils/seedDb.js"; + const SERVICE_NAME = "Server"; const SHUTDOWN_TIMEOUT = 1000; let isShuttingDown = false; @@ -262,6 +264,7 @@ const startApp = async () => { ); // Init job queue await jobQueue.initJobQueue(); + // await seedDb(); // Middleware app.use( cors() diff --git a/Server/routes/monitorRoute.js b/Server/routes/monitorRoute.js index 92b529417..964bbee7a 100644 --- a/Server/routes/monitorRoute.js +++ b/Server/routes/monitorRoute.js @@ -75,6 +75,8 @@ class MonitorRoutes { isAllowed(["admin", "superadmin"]), this.monitorController.addDemoMonitors ); + + this.router.post("/seed", isAllowed(["superadmin"]), this.monitorController.seedDb); } getRouter() {