Files
Checkmate/Server/db/mongo/modules/checkModule.js
T

244 lines
5.7 KiB
JavaScript
Raw Normal View History

2024-07-26 18:25:20 -07:00
const Check = require("../../../models/Check");
2024-08-08 14:27:01 -07:00
const Monitor = require("../../../models/Monitor");
const mongoose = require("mongoose");
const dateRangeLookup = {
2024-08-08 13:19:37 -07:00
day: new Date(new Date().setDate(new Date().getDate() - 1)),
week: new Date(new Date().setDate(new Date().getDate() - 7)),
month: new Date(new Date().setMonth(new Date().getMonth() - 1)),
};
2024-07-26 18:25:20 -07:00
/**
* Create a check for a monitor
* @async
* @param {Object} checkData
* @param {string} checkData.monitorId
* @param {boolean} checkData.status
* @param {number} checkData.responseTime
* @param {number} checkData.statusCode
* @param {string} checkData.message
* @returns {Promise<Check>}
* @throws {Error}
*/
const createCheck = async (checkData) => {
try {
const { monitorId, status } = checkData;
const n = await Check.countDocuments({ monitorId }) + 1;
2024-08-31 22:46:28 -07:00
const check = await new Check({ ...checkData }).save();
const monitor = await Monitor.findById(monitorId);
if (!monitor) {
throw new Error("Monitor not found");
}
if (monitor.uptimePercentage === undefined) {
2024-08-31 20:13:34 -07:00
monitor.uptimePercentage = (status === true) ? 1 : 0;
} else {
monitor.uptimePercentage =
2024-08-31 20:13:34 -07:00
(monitor.uptimePercentage * (n - 1) + (status === true ? 1: 0)) / n;
}
await monitor.save();
2024-07-26 18:25:20 -07:00
return check;
} catch (error) {
throw error;
}
};
2024-08-08 13:19:37 -07:00
const getChecksCount = async (req) => {
const monitorId = req.params.monitorId;
2024-08-08 16:18:46 -07:00
const dateRange = req.query.dateRange;
2024-08-08 13:19:37 -07:00
const filter = req.query.filter;
// Build query
const checksQuery = { monitorId: monitorId };
// Filter checks by "day", "week", or "month"
2024-08-08 16:18:46 -07:00
if (dateRange !== undefined) {
checksQuery.createdAt = { $gte: dateRangeLookup[dateRange] };
}
2024-08-08 13:19:37 -07:00
if (filter !== undefined) {
2024-08-08 16:18:46 -07:00
checksQuery.status = false;
2024-08-09 09:41:39 -07:00
switch (filter) {
case "all":
break;
case "down":
break;
case "resolve":
2024-08-09 09:53:50 -07:00
checksQuery.statusCode = 5000;
2024-08-09 09:41:39 -07:00
break;
default:
console.log("default");
break;
}
2024-08-08 13:19:37 -07:00
}
2024-08-08 16:18:46 -07:00
2024-08-08 13:19:37 -07:00
const count = await Check.countDocuments(checksQuery);
return count;
};
2024-07-26 18:25:20 -07:00
/**
* Get all checks for a monitor
* @async
* @param {string} monitorId
* @returns {Promise<Array<Check>>}
* @throws {Error}
*/
2024-08-08 12:37:02 -07:00
const getChecks = async (req) => {
2024-07-26 18:25:20 -07:00
try {
2024-08-08 12:37:02 -07:00
const { monitorId } = req.params;
let { sortOrder, limit, dateRange, filter, page, rowsPerPage } = req.query;
2024-08-08 12:37:02 -07:00
// Default limit to 0 if not provided
limit = limit === "undefined" ? 0 : limit;
2024-08-08 12:37:02 -07:00
// Default sort order is newest -> oldest
sortOrder = sortOrder === "asc" ? 1 : -1;
2024-08-08 12:37:02 -07:00
// Build query
const checksQuery = { monitorId: monitorId };
// Filter checks by "day", "week", or "month"
if (dateRange !== undefined) {
checksQuery.createdAt = { $gte: dateRangeLookup[dateRange] };
}
// Fitler checks by status
2024-08-08 12:37:02 -07:00
if (filter !== undefined) {
checksQuery.status = false;
2024-08-09 09:53:50 -07:00
switch (filter) {
case "all":
break;
case "down":
break;
case "resolve":
checksQuery.statusCode = 5000;
break;
default:
console.log("default");
break;
}
2024-08-08 12:37:02 -07:00
}
2024-08-08 13:19:37 -07:00
// Need to skip and limit here
let skip = 0;
if (page && rowsPerPage) {
skip = page * rowsPerPage;
}
2024-08-08 12:37:02 -07:00
const checks = await Check.find(checksQuery)
2024-08-08 13:19:37 -07:00
.skip(skip)
.limit(rowsPerPage)
2024-08-08 12:37:02 -07:00
.sort({ createdAt: sortOrder });
2024-07-26 18:25:20 -07:00
return checks;
} catch (error) {
throw error;
}
};
const getTeamChecks = async (req) => {
const { teamId } = req.params;
let { sortOrder, limit, dateRange, filter, page, rowsPerPage } = req.query;
// Get monitorIDs
const userMonitors = await Monitor.find({ teamId: teamId });
const monitorIds = userMonitors.map((monitor) => monitor._id);
//Build check query
// Default limit to 0 if not provided
limit = limit === "undefined" ? 0 : limit;
// Default sort order is newest -> oldest
sortOrder = sortOrder === "asc" ? 1 : -1;
checksQuery = { monitorId: { $in: monitorIds } };
if (filter !== undefined) {
checksQuery.status = false;
switch (filter) {
case "all":
break;
case "down":
break;
case "resolve":
checksQuery.statusCode = 5000;
break;
default:
console.log("default");
break;
}
}
if (dateRange !== undefined) {
checksQuery.createdAt = { $gte: dateRangeLookup[dateRange] };
}
// Skip and limit for pagination
let skip = 0;
if (page && rowsPerPage) {
skip = page * rowsPerPage;
}
const checksCount = await Check.countDocuments(checksQuery);
const checks = await Check.find(checksQuery)
.skip(skip)
.limit(rowsPerPage)
.sort({ createdAt: sortOrder });
return { checksCount, checks };
};
2024-07-26 18:25:20 -07:00
/**
2024-08-30 09:41:27 -07:00
* Delete all checks for a monitor
2024-07-26 18:25:20 -07:00
* @async
* @param {string} monitorId
* @returns {number}
* @throws {Error}
*/
const deleteChecks = async (monitorId) => {
try {
const result = await Check.deleteMany({ monitorId });
return result.deletedCount;
} catch (error) {
throw error;
}
};
2024-08-30 09:41:27 -07:00
/**
* Delete all checks for a team
* @async
* @param {string} monitorId
* @returns {number}
* @throws {Error}
*/
2024-08-30 10:04:47 -07:00
const deleteChecksByTeamId = async (teamId) => {
2024-08-30 09:41:27 -07:00
try {
const teamMonitors = await Monitor.find({ teamId: teamId });
let totalDeletedCount = 0;
await Promise.all(
teamMonitors.map(async (monitor) => {
const result = await Check.deleteMany({ monitorId: monitor._id });
totalDeletedCount += result.deletedCount;
monitor.status = true;
await monitor.save();
})
);
return totalDeletedCount;
2024-08-30 09:41:27 -07:00
} catch (error) {
throw error;
}
};
2024-08-08 14:27:01 -07:00
module.exports = {
createCheck,
getChecksCount,
getChecks,
getTeamChecks,
2024-08-08 14:27:01 -07:00
deleteChecks,
2024-08-30 10:04:47 -07:00
deleteChecksByTeamId,
2024-08-08 14:27:01 -07:00
};