add db utils

This commit is contained in:
Alex Holliday
2025-01-22 08:29:38 -08:00
parent 9a8ce41c95
commit 9ffe17e9eb
6 changed files with 61 additions and 11 deletions

View File

@@ -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;

View File

@@ -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 };

View File

@@ -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;

View File

@@ -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;

View File

@@ -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()

View File

@@ -75,6 +75,8 @@ class MonitorRoutes {
isAllowed(["admin", "superadmin"]),
this.monitorController.addDemoMonitors
);
this.router.post("/seed", isAllowed(["superadmin"]), this.monitorController.seedDb);
}
getRouter() {