diff --git a/Server/controllers/maintenanceWindowController.js b/Server/controllers/maintenanceWindowController.js new file mode 100644 index 000000000..d94746fe3 --- /dev/null +++ b/Server/controllers/maintenanceWindowController.js @@ -0,0 +1,91 @@ +const { + createMaintenanceWindowParamValidation, + createMaintenanceWindowBodyValidation, + getMaintenanceWindowsByUserIdParamValidation, + getMaintenanceWindowsByMonitorIdParamValidation, +} = require("../validation/joi"); + +const SERVICE_NAME = "maintenanceWindowController"; +const { errorMessages, successMessages } = require("../utils/messages"); + +const createMaintenanceWindow = async (req, res, next) => { + try { + await createMaintenanceWindowParamValidation.validateAsync(req.params); + await createMaintenanceWindowBodyValidation.validateAsync(req.body); + } catch (error) { + error.status = 422; + error.service = SERVICE_NAME; + error.message = error.details[0].message; + next(error); + return; + } + + try { + const data = { + monitorId: req.params.monitorId, + ...req.body, + }; + + if (data.oneTime === true) { + data.expiry = data.end; + } + + const maintenanceWindow = await req.db.createMaintenanceWindow(data); + + return res.status(201).json({ + success: true, + msg: successMessages.MAINTENANCE_WINDOW_CREATE, + data: maintenanceWindow, + }); + } catch (error) { + error.service = SERVICE_NAME; + next(error); + } +}; + +const getMaintenanceWindowsByUserId = async (req, res, next) => { + try { + await getMaintenanceWindowsByUserIdParamValidation.validateAsync( + req.params + ); + + const maintenanceWindows = await req.db.getMaintenanceWindowsByUserId( + req.params.userId + ); + + return res.status(201).json({ + success: true, + msg: successMessages.MAINTEANCE_WINDOW_GET_BY_USER, + data: maintenanceWindows, + }); + } catch (error) { + error.service = SERVICE_NAME; + next(error); + } +}; + +const getMaintenanceWindowsByMonitorId = async (req, res, next) => { + try { + await getMaintenanceWindowsByMonitorIdParamValidation.validateAsync( + req.params + ); + + const maintenanceWindows = await req.db.getMaintenanceWindowsByMonitorId( + req.params.monitorId + ); + + return res.status(201).json({ + success: true, + msg: successMessages.MAINTEANCE_WINDOW_GET_BY_USER, + data: maintenanceWindows, + }); + } catch (error) { + error.service = SERVICE_NAME; + next(error); + } +}; +module.exports = { + createMaintenanceWindow, + getMaintenanceWindowsByUserId, + getMaintenanceWindowsByMonitorId, +}; diff --git a/Server/db/mongo/MongoDB.js b/Server/db/mongo/MongoDB.js index fbd281714..de2b3466e 100644 --- a/Server/db/mongo/MongoDB.js +++ b/Server/db/mongo/MongoDB.js @@ -108,6 +108,18 @@ const { deleteAlertByMonitorId, } = require("./modules/alertModule"); +//**************************************** +// Maintenance Window +//**************************************** +const { + createMaintenanceWindow, + getMaintenanceWindowsByUserId, + getMaintenanceWindowsByMonitorId, + deleteMaintenaceWindowById, + deleteMaintenanceWindowByMonitorId, + deleteMaintenanceWindowByUserId, +} = require("./modules/maintenaceWindowModule"); + module.exports = { connect, insertUser, @@ -144,4 +156,10 @@ module.exports = { createPageSpeedCheck, getPageSpeedChecks, deletePageSpeedChecks, + createMaintenanceWindow, + getMaintenanceWindowsByUserId, + getMaintenanceWindowsByMonitorId, + deleteMaintenaceWindowById, + deleteMaintenanceWindowByMonitorId, + deleteMaintenanceWindowByUserId, }; diff --git a/Server/db/mongo/modules/maintenaceWindowModule.js b/Server/db/mongo/modules/maintenaceWindowModule.js index 42798a5f7..6961bba90 100644 --- a/Server/db/mongo/modules/maintenaceWindowModule.js +++ b/Server/db/mongo/modules/maintenaceWindowModule.js @@ -54,7 +54,7 @@ const createMaintenanceWindow = async (maintenanceWindowData) => { * .then(maintenanceWindows => console.log(maintenanceWindows)) * .catch(error => console.error(error)); */ -const getMaintenanceWindowByUserId = async (userId) => { +const getMaintenanceWindowsByUserId = async (userId) => { try { const maintenanceWindows = await MaintenanceWindow.find({ userId: userId }); return maintenanceWindows; @@ -152,7 +152,7 @@ const deleteMaintenanceWindowByUserId = async (userId) => { module.exports = { createMaintenanceWindow, - getMaintenanceWindowByUserId, + getMaintenanceWindowsByUserId, getMaintenanceWindowsByMonitorId, deleteMaintenaceWindowById, deleteMaintenanceWindowByMonitorId, diff --git a/Server/index.js b/Server/index.js index 8fd8b82f9..e92a5bb45 100644 --- a/Server/index.js +++ b/Server/index.js @@ -11,6 +11,7 @@ const monitorRouter = require("./routes/monitorRoute"); const checkRouter = require("./routes/checkRoute"); const alertRouter = require("./routes/alertRoute"); const pageSpeedCheckRouter = require("./routes/pageSpeedCheckRoute"); +const maintenanceWindowRouter = require("./routes/maintenanceWindowRoute"); const { connectDbAndRunServer } = require("./configs/db"); const queueRouter = require("./routes/queueRoute"); @@ -71,6 +72,7 @@ const startApp = async () => { app.use("/api/v1/checks", verifyJWT, checkRouter); app.use("/api/v1/alerts", verifyJWT, alertRouter); app.use("/api/v1/pagespeed", verifyJWT, pageSpeedCheckRouter); + app.use("/api/v1/maintenance-window", verifyJWT, maintenanceWindowRouter); //Temporary route for testing, remove later app.use("/api/v1/job", queueRouter); diff --git a/Server/routes/maintenanceWindowRoute.js b/Server/routes/maintenanceWindowRoute.js new file mode 100644 index 000000000..876e9e668 --- /dev/null +++ b/Server/routes/maintenanceWindowRoute.js @@ -0,0 +1,23 @@ +const router = require("express").Router(); +const maintenanceWindowController = require("../controllers/maintenanceWindowController"); +const { verifyOwnership } = require("../middleware/verifyOwnership"); +const Monitor = require("../models/Monitor"); + +router.post( + "/:monitorId", + verifyOwnership(Monitor, "monitorId"), + maintenanceWindowController.createMaintenanceWindow +); + +router.get( + "/user/:userId", + maintenanceWindowController.getMaintenanceWindowsByUserId +); + +router.get( + "/monitor/:monitorId", + verifyOwnership(Monitor, "monitorId"), + maintenanceWindowController.getMaintenanceWindowsByMonitorId +); + +module.exports = router; diff --git a/Server/utils/messages.js b/Server/utils/messages.js index 19d9929ab..d04052607 100644 --- a/Server/utils/messages.js +++ b/Server/utils/messages.js @@ -78,6 +78,10 @@ const successMessages = { //Job Queue JOB_QUEUE_DELETE_JOB: "Job removed successfully", JOB_QUEUE_OBLITERATE: "Queue OBLITERATED!!!", + + //Maintenance Window Controller + MAINTENANCE_WINDOW_CREATE: "Maintenance Window created successfully", + MAINTEANCE_WINDOW_GET_BY_USER: "Got Maintenance Windows by User successfully", }; module.exports = { diff --git a/Server/validation/joi.js b/Server/validation/joi.js index dccad902b..5fdececfa 100644 --- a/Server/validation/joi.js +++ b/Server/validation/joi.js @@ -252,6 +252,30 @@ const deletePageSpeedCheckParamValidation = joi.object({ monitorId: joi.string().required(), }); +//**************************************** +// MaintenanceWindowValidation +//**************************************** +const createMaintenanceWindowParamValidation = joi.object({ + monitorId: joi.string().required(), +}); + +const createMaintenanceWindowBodyValidation = joi.object({ + userId: joi.string().required(), + active: joi.boolean().required(), + oneTime: joi.boolean().required(), + start: joi.date().required(), + end: joi.date().required(), + expiry: joi.date(), +}); + +const getMaintenanceWindowsByUserIdParamValidation = joi.object({ + userId: joi.string().required(), +}); + +const getMaintenanceWindowsByMonitorIdParamValidation = joi.object({ + monitorId: joi.string().required(), +}); + module.exports = { roleValidatior, loginValidation, @@ -287,4 +311,8 @@ module.exports = { createPageSpeedCheckParamValidation, deletePageSpeedCheckParamValidation, createPageSpeedCheckBodyValidation, + createMaintenanceWindowParamValidation, + createMaintenanceWindowBodyValidation, + getMaintenanceWindowsByUserIdParamValidation, + getMaintenanceWindowsByMonitorIdParamValidation, };