diff --git a/server/db/models/NetworkCheck.js b/server/db/models/NetworkCheck.js new file mode 100644 index 000000000..eca69eef9 --- /dev/null +++ b/server/db/models/NetworkCheck.js @@ -0,0 +1,46 @@ +import mongoose from "mongoose"; +import { BaseCheckSchema } from "./Check.js"; + +const networkInterfaceSchema = mongoose.Schema({ + name: { type: String, required: true }, + bytes_sent: { type: Number, default: 0 }, + bytes_recv: { type: Number, default: 0 }, + packets_sent: { type: Number, default: 0 }, + packets_recv: { type: Number, default: 0 }, + err_in: { type: Number, default: 0 }, + err_out: { type: Number, default: 0 }, + drop_in: { type: Number, default: 0 }, + drop_out: { type: Number, default: 0 }, + fifo_in: { type: Number, default: 0 }, + fifo_out: { type: Number, default: 0 }, +}); + +const captureSchema = mongoose.Schema({ + version: { type: String, default: "" }, + mode: { type: String, default: "" }, +}); + +const NetworkCheckSchema = mongoose.Schema( + { + ...BaseCheckSchema.obj, + data: { + type: [networkInterfaceSchema], + default: () => [], + }, + capture: { + type: captureSchema, + default: () => ({}), + }, + errors: { + type: mongoose.Schema.Types.Mixed, + default: null, + }, + }, + { timestamps: true } +); + +NetworkCheckSchema.index({ createdAt: 1 }); +NetworkCheckSchema.index({ monitorId: 1, createdAt: 1 }); +NetworkCheckSchema.index({ monitorId: 1, createdAt: -1 }); + +export default mongoose.model("NetworkCheck", NetworkCheckSchema); diff --git a/server/db/mongo/modules/networkCheckModule.js b/server/db/mongo/modules/networkCheckModule.js new file mode 100644 index 000000000..53c55c7e3 --- /dev/null +++ b/server/db/mongo/modules/networkCheckModule.js @@ -0,0 +1,46 @@ +import NetworkCheck from "../../models/NetworkCheck.js"; + +const SERVICE_NAME = "networkCheckModule"; + +/** + * Creates and saves a new network check document to the database. + * @async + * @param {object} networkCheckData - The data for the new network check. This should conform to the NetworkCheckSchema. + * @param {string} networkCheckData.monitorId - The ID of the monitor associated with this check. + * @returns {Promise} A promise that resolves to the newly created network check document. + * @throws {Error} Throws an error if the database operation fails. + */ +const createNetworkCheck = async (networkCheckData) => { + try { + const networkCheck = await new NetworkCheck(networkCheckData); + await networkCheck.save(); + return networkCheck; + } catch (error) { + error.service = SERVICE_NAME; + error.method = "createNetworkCheck"; + throw error; + } +}; + +/** + * Retrieves a list of network checks for a specific monitor, sorted by most recent. + * @async + * @param {string} monitorId - The ID of the monitor to retrieve checks for. + * @param {number} [limit=100] - The maximum number of checks to return. Defaults to 100. + * @returns {Promise>} A promise that resolves to an array of network check documents. + * @throws {Error} Throws an error if the database operation fails. + */ +const getNetworkChecksByMonitorId = async (monitorId, limit = 100) => { + try { + const networkChecks = await NetworkCheck.find({ monitorId }) + .sort({ createdAt: -1 }) + .limit(limit); + return networkChecks; + } catch (error) { + error.service = SERVICE_NAME; + error.method = "getNetworkChecksByMonitorId"; + throw error; + } +}; + +export { createNetworkCheck, getNetworkChecksByMonitorId };