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

151 lines
3.6 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 check = await new Check({ ...checkData }).save();
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;
2024-08-08 16:18:46 -07:00
console.log(filter);
2024-08-08 13:19:37 -07:00
// 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-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
if (limit === undefined) limit = 0;
// Default sort order is newest -> oldest
if (sortOrder === "asc") {
sortOrder = 1;
} else if (sortOrder === "desc") {
sortOrder = -1;
} else sortOrder = -1;
// 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-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;
}
};
/**
* Delete all checks for a monitor
* @async
* @param {string} monitorId
* @returns {number}
* @throws {Error}
*/
2024-08-08 14:27:01 -07:00
const getUserChecks = async (req) => {
const { userId } = req.params;
try {
const objectId = mongoose.Types.ObjectId.createFromHexString(userId);
const checks = await Check.aggregate([
{
$lookup: {
from: "monitors", // The name of the Monitor collection
localField: "monitorId",
foreignField: "_id",
as: "monitorDetails",
},
},
{
$unwind: "$monitorDetails",
},
{
$match: {
"monitorDetails.userId": objectId,
},
},
]);
return checks;
} catch (error) {
throw error;
}
};
2024-07-26 18:25:20 -07:00
const deleteChecks = async (monitorId) => {
try {
const result = await Check.deleteMany({ monitorId });
return result.deletedCount;
} catch (error) {
throw error;
}
};
2024-08-08 14:27:01 -07:00
module.exports = {
createCheck,
getChecksCount,
getChecks,
getUserChecks,
deleteChecks,
};