const Monitor = require("../../../models/Monitor"); const Check = require("../../../models/Check"); const { errorMessages } = require("../../../utils/messages"); /** * Get all monitors * @async * @param {Express.Request} req * @param {Express.Response} res * @returns {Promise>} * @throws {Error} */ const getAllMonitors = async (req, res) => { try { const monitors = await Monitor.find({ isActive: true }); return monitors; } catch (error) { throw error; } }; /** * Get a monitor by ID * @async * @param {Express.Request} req * @param {Express.Response} res * @returns {Promise} * @throws {Error} */ const getMonitorById = async (req, res) => { try { const monitor = await Monitor.findById(req.params.monitorId); const checks = await Check.find({ monitorId: monitor._id }).sort({ createdAt: 1, }); const monitorWithChecks = { ...monitor.toObject(), checks }; return monitorWithChecks; } catch (error) { throw error; } }; /** * Get monitors by UserID * @async * @param {Express.Request} req * @param {Express.Response} res * @returns {Promise>} * @throws {Error} */ const getMonitorsByUserId = async (req, res) => { try { const limit = req.query ? req.query.limit : undefined; const monitors = await Monitor.find({ userId: req.params.userId }); console.log("monitors", monitors); // Map each monitor to include its associated checks const monitorsWithChecks = await Promise.all( monitors.map(async (monitor) => { if (limit) { // Checks are order newest -> oldest const checks = await Check.find({ monitorId: monitor._id }) .sort({ createdAt: -1, }) .limit(limit); return { ...monitor.toObject(), checks }; } else { const checks = await Check.find({ monitorId: monitor._id }).sort({ createdAt: -1, }); return { ...monitor.toObject(), checks }; } }) ); return monitorsWithChecks; } catch (error) { throw error; } }; /** * Get monitors by UserID * @async * @param {Express.Request} req * @param {Express.Response} res * @returns {Promise} * @throws {Error} */ const getMonitorByIdForIncidents = async (req, res, next) => { try { const monitor = await Monitor.findById(req.params.monitorId); const checks = await Check.find({ monitorId: monitor._id, status: false, }).sort({ createdAt: 1, }); const monitorWithChecks = { ...monitor.toObject(), checks }; return monitorWithChecks; } catch (error) { throw error; } }; /** * Get monitors by UserID * @async * @param {Express.Request} req * @param {Express.Response} res * @returns {Promise>} * @throws {Error} */ const getMonitorsByUserIdForIncidents = async (req, res) => { try { const monitors = await Monitor.find({ userId: req.params.userId }); // Map each monitor to include its associated checks const monitorsWithChecks = await Promise.all( monitors.map(async (monitor) => { const checks = await Check.find({ monitorId: monitor._id, status: false, }).sort({ createdAt: 1, }); return { ...monitor.toObject(), checks }; }) ); return monitorsWithChecks; } catch (error) { throw error; } }; /** * Create a monitor * @async * @param {Express.Request} req * @param {Express.Response} res * @returns {Promise} * @throws {Error} */ const createMonitor = async (req, res) => { try { const monitor = new Monitor({ ...req.body }); monitor.userId = req.user._id; await monitor.save(); return monitor; } catch (error) { throw error; } }; /** * Delete a monitor by ID * @async * @param {Express.Request} req * @param {Express.Response} res * @returns {Promise} * @throws {Error} */ const deleteMonitor = async (req, res) => { const monitorId = req.params.monitorId; try { const monitor = await Monitor.findByIdAndDelete(monitorId); if (!monitor) { throw new Error(errorMessages.DB_FIND_MONTIOR_BY_ID(monitorId)); } return monitor; } catch (error) { throw error; } }; /** * DELETE ALL MONITORS (TEMP) */ const deleteAllMonitors = async (req, res) => { try { const deletedCount = await Monitor.deleteMany({}); return deletedCount.deletedCount; } catch (error) { throw error; } }; /** * Delete all monitors associated with a user ID * @async * @param {string} userId - The ID of the user whose monitors are to be deleted. * @returns {Promise} A promise that resolves when the operation is complete. */ const deleteMonitorsByUserId = async (userId) => { try { const result = await Monitor.deleteMany({ userId: userId }); return result; } catch (error) { throw error; } }; /** * Edit a monitor by ID * @async * @param {Express.Request} req * @param {Express.Response} res * @returns {Promise} * @throws {Error} */ const editMonitor = async (req, res) => { const candidateId = req.params.monitorId; const candidateMonitor = req.body; try { const editedMonitor = await Monitor.findByIdAndUpdate( candidateId, candidateMonitor, { new: true } ); return editedMonitor; } catch (error) { throw error; } }; module.exports = { getAllMonitors, getMonitorById, getMonitorsByUserId, getMonitorByIdForIncidents, getMonitorsByUserIdForIncidents, createMonitor, deleteMonitor, deleteAllMonitors, deleteMonitorsByUserId, editMonitor, };