From a6c3c56d0bca064eab89255ce28bbf19428fed0c Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 3 Sep 2024 15:00:30 -0700 Subject: [PATCH 1/4] add getMonitorStatsByIdValidation --- Server/validation/joi.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Server/validation/joi.js b/Server/validation/joi.js index ccc8da9f6..7e16fa21f 100644 --- a/Server/validation/joi.js +++ b/Server/validation/joi.js @@ -1,4 +1,5 @@ const joi = require("joi"); +const { normalize } = require("path"); //**************************************** // Custom Validators @@ -177,6 +178,18 @@ const getMonitorsByTeamIdQueryValidation = joi.object({ ), }); +getMonitorStatsByIdParamValidation = joi.object({ + monitorId: joi.string().required(), +}); +getMonitorStatsByIdQueryValidation = joi.object({ + status: joi.string(), + limit: joi.number(), + sortOrder: joi.string().valid("asc", "desc"), + dateRange: joi.string().valid("day", "week", "month"), + numToDisplay: joi.number(), + normalize: joi.boolean(), +}); + const createMonitorBodyValidation = joi.object({ _id: joi.string(), userId: joi.string().required(), From cece932e451cc199e1a117bf3ecc4390afd04451 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 3 Sep 2024 15:07:11 -0700 Subject: [PATCH 2/4] Implement validation --- Server/controllers/monitorController.js | 4 ++++ Server/validation/joi.js | 2 ++ 2 files changed, 6 insertions(+) diff --git a/Server/controllers/monitorController.js b/Server/controllers/monitorController.js index f33ddcf10..c0243adac 100644 --- a/Server/controllers/monitorController.js +++ b/Server/controllers/monitorController.js @@ -6,6 +6,8 @@ const { editMonitorBodyValidation, getMonitorsByTeamIdQueryValidation, pauseMonitorParamValidation, + getMonitorStatsByIdParamValidation, + getMonitorStatsByIdQueryValidation, } = require("../validation/joi"); const sslChecker = require("ssl-checker"); @@ -46,6 +48,8 @@ const getAllMonitors = async (req, res, next) => { const getMonitorStatsById = async (req, res, next) => { try { //Validation + await getMonitorStatsByIdParamValidation.validateAsync(req.params); + await getMonitorStatsByIdQueryValidation.validateAsync(req.query); } catch (error) { error.status = 422; error.message = diff --git a/Server/validation/joi.js b/Server/validation/joi.js index 7e16fa21f..921831b5e 100644 --- a/Server/validation/joi.js +++ b/Server/validation/joi.js @@ -370,6 +370,8 @@ module.exports = { getMonitorByIdQueryValidation, getMonitorsByTeamIdValidation, getMonitorsByTeamIdQueryValidation, + getMonitorStatsByIdParamValidation, + getMonitorStatsByIdQueryValidation, editMonitorBodyValidation, pauseMonitorParamValidation, editUserParamValidation, From 8bac81fb09397f0f77f8b73203cb293b17ad3aaf Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 3 Sep 2024 15:11:17 -0700 Subject: [PATCH 3/4] Add validation for certificate request --- Server/controllers/monitorController.js | 5 ++--- Server/validation/joi.js | 9 +++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Server/controllers/monitorController.js b/Server/controllers/monitorController.js index c0243adac..9576f3064 100644 --- a/Server/controllers/monitorController.js +++ b/Server/controllers/monitorController.js @@ -8,12 +8,12 @@ const { pauseMonitorParamValidation, getMonitorStatsByIdParamValidation, getMonitorStatsByIdQueryValidation, + getCertificateParamValidation, } = require("../validation/joi"); const sslChecker = require("ssl-checker"); const SERVICE_NAME = "monitorController"; const { errorMessages, successMessages } = require("../utils/messages"); -const { runInNewContext } = require("vm"); /** * Returns all monitors @@ -47,7 +47,6 @@ const getAllMonitors = async (req, res, next) => { */ const getMonitorStatsById = async (req, res, next) => { try { - //Validation await getMonitorStatsByIdParamValidation.validateAsync(req.params); await getMonitorStatsByIdQueryValidation.validateAsync(req.query); } catch (error) { @@ -73,7 +72,7 @@ const getMonitorStatsById = async (req, res, next) => { const getMonitorCertificate = async (req, res, next) => { try { - //validation + await getCertificateParamValidation.validateAsync(req.params); } catch (error) { error.status = 422; error.message = diff --git a/Server/validation/joi.js b/Server/validation/joi.js index 921831b5e..f6a3aba68 100644 --- a/Server/validation/joi.js +++ b/Server/validation/joi.js @@ -178,10 +178,10 @@ const getMonitorsByTeamIdQueryValidation = joi.object({ ), }); -getMonitorStatsByIdParamValidation = joi.object({ +const getMonitorStatsByIdParamValidation = joi.object({ monitorId: joi.string().required(), }); -getMonitorStatsByIdQueryValidation = joi.object({ +const getMonitorStatsByIdQueryValidation = joi.object({ status: joi.string(), limit: joi.number(), sortOrder: joi.string().valid("asc", "desc"), @@ -190,6 +190,10 @@ getMonitorStatsByIdQueryValidation = joi.object({ normalize: joi.boolean(), }); +const getCertificateParamValidation = joi.object({ + monitorId: joi.string().required(), +}); + const createMonitorBodyValidation = joi.object({ _id: joi.string(), userId: joi.string().required(), @@ -372,6 +376,7 @@ module.exports = { getMonitorsByTeamIdQueryValidation, getMonitorStatsByIdParamValidation, getMonitorStatsByIdQueryValidation, + getCertificateParamValidation, editMonitorBodyValidation, pauseMonitorParamValidation, editUserParamValidation, From 02c2689e1e243035b810b5dfe0da98ed2e84aa85 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 3 Sep 2024 21:05:36 -0700 Subject: [PATCH 4/4] Add pending state to monitors and config screens --- Client/src/Components/Label/index.jsx | 10 +- Client/src/Pages/Monitors/Configure/index.jsx | 29 ++--- Client/src/Pages/Monitors/Details/index.jsx | 107 +++--------------- .../src/Pages/Monitors/Details/skeleton.jsx | 73 ++++++++++++ .../src/Pages/Monitors/Home/monitorData.jsx | 2 +- 5 files changed, 112 insertions(+), 109 deletions(-) create mode 100644 Client/src/Pages/Monitors/Details/skeleton.jsx diff --git a/Client/src/Components/Label/index.jsx b/Client/src/Components/Label/index.jsx index 96468ffd6..330c6de0a 100644 --- a/Client/src/Components/Label/index.jsx +++ b/Client/src/Components/Label/index.jsx @@ -139,10 +139,10 @@ const StatusLabel = ({ status, text, customStyles }) => { bgColor: theme.palette.error.bg, borderColor: theme.palette.error.light, }, - unknown: { - dotColor: theme.palette.unresolved.main, - bgColor: theme.palette.unresolved.bg, - borderColor: theme.palette.unresolved.light, + pending: { + dotColor: theme.palette.warning.main, + bgColor: theme.palette.warning.bg, + borderColor: theme.palette.warning.light, }, "cannot resolve": { dotColor: theme.palette.unresolved.main, @@ -176,7 +176,7 @@ const StatusLabel = ({ status, text, customStyles }) => { }; StatusLabel.propTypes = { - status: PropTypes.oneOf(["up", "down", "unknown", "cannot resolve"]), + status: PropTypes.oneOf(["up", "down", "pending", "cannot resolve"]), text: PropTypes.string, customStyles: PropTypes.object, }; diff --git a/Client/src/Pages/Monitors/Configure/index.jsx b/Client/src/Pages/Monitors/Configure/index.jsx index 6e3caeff7..7dd6a1e8f 100644 --- a/Client/src/Pages/Monitors/Configure/index.jsx +++ b/Client/src/Pages/Monitors/Configure/index.jsx @@ -53,7 +53,6 @@ const Configure = () => { const [monitor, setMonitor] = useState({}); const [errors, setErrors] = useState({}); const { monitorId } = useParams(); - console.log(monitor); const idMap = { "monitor-url": "url", "monitor-name": "name", @@ -190,6 +189,18 @@ const Configure = () => { const parsedUrl = parseUrl(monitor?.url); const protocol = parsedUrl?.protocol?.replace(":", "") || ""; + const statusColor = { + true: theme.palette.success.main, + false: theme.palette.error.main, + undefined: theme.palette.warning.main, + }; + + const statusMsg = { + true: "Your site is up.", + false: "Your site is down.", + undefined: "Pending...", + }; + return ( {Object.keys(monitor).length === 0 ? ( @@ -211,13 +222,7 @@ const Configure = () => { flex={1} > - + {parsedUrl?.host ? ( { - Your site is {monitor?.status ? "up" : "down"}. + {statusMsg[monitor?.status ?? undefined]} { @@ -71,76 +65,6 @@ StatBox.propTypes = { value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), }; -/** - * Renders a skeleton layout. - * - * @returns {JSX.Element} - */ -const SkeletonLayout = () => { - const theme = useTheme(); - - return ( - <> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -}; - /** * Details page component displaying monitor details and related information. * @component @@ -195,6 +119,19 @@ const DetailsPage = ({ isAdmin }) => { }, [authToken, monitorId, monitor]); let loading = Object.keys(monitor).length === 0; + + const statusColor = { + true: theme.palette.success.main, + false: theme.palette.error.main, + undefined: theme.palette.warning.main, + }; + + const statusMsg = { + true: "Your site is up.", + false: "Your site is down.", + undefined: "Pending...", + }; + return ( {loading ? ( @@ -209,13 +146,7 @@ const DetailsPage = ({ isAdmin }) => { /> - + { - Your site is {monitor?.status ? "up" : "down"}. + {statusMsg[monitor?.status ?? undefined]} {" "} Checking every {formatDurationRounded(monitor?.interval)}. diff --git a/Client/src/Pages/Monitors/Details/skeleton.jsx b/Client/src/Pages/Monitors/Details/skeleton.jsx new file mode 100644 index 000000000..b267f413e --- /dev/null +++ b/Client/src/Pages/Monitors/Details/skeleton.jsx @@ -0,0 +1,73 @@ +import { Box, Skeleton, Stack, useTheme } from "@mui/material"; + +/** + * Renders a skeleton layout. + * + * @returns {JSX.Element} + */ +const SkeletonLayout = () => { + const theme = useTheme(); + + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default SkeletonLayout; diff --git a/Client/src/Pages/Monitors/Home/monitorData.jsx b/Client/src/Pages/Monitors/Home/monitorData.jsx index 2351a59e9..afe943f4e 100644 --- a/Client/src/Pages/Monitors/Home/monitorData.jsx +++ b/Client/src/Pages/Monitors/Home/monitorData.jsx @@ -66,7 +66,7 @@ export const buildData = (monitors, isAdmin, navigate) => { percentageColor, status: monitor.status === undefined - ? "unknown" + ? "pending" : monitor.status === true ? "up" : "down",