From b8b66d5f55e1b0e3826e212463bbd81aca19c1e8 Mon Sep 17 00:00:00 2001 From: M M Date: Mon, 15 Jul 2024 22:11:43 -0700 Subject: [PATCH 01/21] Made the routes for the speedcheck route. --- Server/routes/pageSpeedCheckRoute.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 Server/routes/pageSpeedCheckRoute.js diff --git a/Server/routes/pageSpeedCheckRoute.js b/Server/routes/pageSpeedCheckRoute.js new file mode 100644 index 000000000..193f1a9d9 --- /dev/null +++ b/Server/routes/pageSpeedCheckRoute.js @@ -0,0 +1,24 @@ +const router = require("express").Router(); +const pageSpeedCheckController = require("../controllers/pageSpeedCheckController"); +const { verifyOwnership } = require("../middleware/verifyOwnership"); +const PageSpeedCheck = require("../models/PageSpeedCheck"); + +router.post( + "/:monitorId", + verifyOwnership(PageSpeedCheck, "monitorId"), + pageSpeedCheckController.createCheck +); + +router.get( + "/:monitorId", + verifyOwnership(PageSpeedCheck, "monitorId"), + pageSpeedCheckController.getChecks +); + +router.post( + "/delete/:monitorId", + verifyOwnership(PageSpeedCheck, "monitorId"), + pageSpeedCheckController.deleteChecks +); + +module.exports = router; From cebab6669d8fa0c20c02e6dc3b654059441f6260 Mon Sep 17 00:00:00 2001 From: M M Date: Mon, 15 Jul 2024 22:14:09 -0700 Subject: [PATCH 02/21] Added docs. --- Server/routes/pageSpeedCheckRoute.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Server/routes/pageSpeedCheckRoute.js b/Server/routes/pageSpeedCheckRoute.js index 193f1a9d9..f5b155fcf 100644 --- a/Server/routes/pageSpeedCheckRoute.js +++ b/Server/routes/pageSpeedCheckRoute.js @@ -3,18 +3,42 @@ const pageSpeedCheckController = require("../controllers/pageSpeedCheckControlle const { verifyOwnership } = require("../middleware/verifyOwnership"); const PageSpeedCheck = require("../models/PageSpeedCheck"); +/** + * @route POST /:monitorId + * @description Create a new PageSpeedCheck for a monitor + * @access Private + * @param {string} monitorId - The ID of the monitor + * @middleware verifyOwnership - Ensures the user owns the monitor + * @controller pageSpeedCheckController.createCheck + */ router.post( "/:monitorId", verifyOwnership(PageSpeedCheck, "monitorId"), pageSpeedCheckController.createCheck ); +/** + * @route GET /:monitorId + * @description Get all PageSpeedChecks for a monitor + * @access Private + * @param {string} monitorId - The ID of the monitor + * @middleware verifyOwnership - Ensures the user owns the monitor + * @controller pageSpeedCheckController.getChecks + */ router.get( "/:monitorId", verifyOwnership(PageSpeedCheck, "monitorId"), pageSpeedCheckController.getChecks ); +/** + * @route POST /delete/:monitorId + * @description Delete all PageSpeedChecks for a monitor + * @access Private + * @param {string} monitorId - The ID of the monitor + * @middleware verifyOwnership - Ensures the user owns the monitor + * @controller pageSpeedCheckController.deleteChecks + */ router.post( "/delete/:monitorId", verifyOwnership(PageSpeedCheck, "monitorId"), From 6dbc40db8e88f9bd0307575777149c787fdc1ad4 Mon Sep 17 00:00:00 2001 From: M M Date: Mon, 15 Jul 2024 22:24:10 -0700 Subject: [PATCH 03/21] Added some stub funcs until controller is complete. --- Server/routes/pageSpeedCheckRoute.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Server/routes/pageSpeedCheckRoute.js b/Server/routes/pageSpeedCheckRoute.js index f5b155fcf..e3b591ecc 100644 --- a/Server/routes/pageSpeedCheckRoute.js +++ b/Server/routes/pageSpeedCheckRoute.js @@ -1,5 +1,4 @@ const router = require("express").Router(); -const pageSpeedCheckController = require("../controllers/pageSpeedCheckController"); const { verifyOwnership } = require("../middleware/verifyOwnership"); const PageSpeedCheck = require("../models/PageSpeedCheck"); @@ -9,12 +8,13 @@ const PageSpeedCheck = require("../models/PageSpeedCheck"); * @access Private * @param {string} monitorId - The ID of the monitor * @middleware verifyOwnership - Ensures the user owns the monitor - * @controller pageSpeedCheckController.createCheck */ router.post( "/:monitorId", verifyOwnership(PageSpeedCheck, "monitorId"), - pageSpeedCheckController.createCheck + () => { + console.log("Create check"); + } ); /** @@ -23,12 +23,13 @@ router.post( * @access Private * @param {string} monitorId - The ID of the monitor * @middleware verifyOwnership - Ensures the user owns the monitor - * @controller pageSpeedCheckController.getChecks */ router.get( "/:monitorId", verifyOwnership(PageSpeedCheck, "monitorId"), - pageSpeedCheckController.getChecks + () => { + console.log("Get checks"); + } ); /** @@ -37,12 +38,13 @@ router.get( * @access Private * @param {string} monitorId - The ID of the monitor * @middleware verifyOwnership - Ensures the user owns the monitor - * @controller pageSpeedCheckController.deleteChecks */ router.post( "/delete/:monitorId", verifyOwnership(PageSpeedCheck, "monitorId"), - pageSpeedCheckController.deleteChecks + () => { + console.log("Delete checks"); + } ); module.exports = router; From 9be79a99b6229bafde05ff4c7db05e2db23e49c8 Mon Sep 17 00:00:00 2001 From: M M Date: Mon, 15 Jul 2024 22:27:05 -0700 Subject: [PATCH 04/21] Added route in index.js --- Server/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/index.js b/Server/index.js index eab64e36d..da511ba63 100644 --- a/Server/index.js +++ b/Server/index.js @@ -12,6 +12,7 @@ const { verifyJWT } = require("./middleware/verifyJWT"); const { handleErrors } = require("./middleware/handleErrors"); const queueRouter = require("./routes/queueRoute"); const JobQueue = require("./service/jobQueue"); +const pageSpeedCheckRoutes = require("./routes/pageSpeedCheckRoutes"); // Need to wrap server setup in a function to handle async nature of JobQueue const startApp = async () => { @@ -71,6 +72,7 @@ const startApp = async () => { app.use("/api/v1/monitors", verifyJWT, monitorRouter); app.use("/api/v1/checks", verifyJWT, checkRouter); app.use("/api/v1/alerts", verifyJWT, alertRouter); + app.use("/api/v1/pagespeed", verifyJWT, pageSpeedRouter); //Temporary route for testing, remove later app.use("/api/v1/job", queueRouter); From 2f4a03ee01b42487f08d684eae16139eb3171cc9 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Mon, 15 Jul 2024 22:28:03 -0700 Subject: [PATCH 05/21] implemented uptime duration calculation --- Client/src/Pages/Details/index.jsx | 34 ++++++++++++++++-------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/Client/src/Pages/Details/index.jsx b/Client/src/Pages/Details/index.jsx index 5e9e0b592..82b114254 100644 --- a/Client/src/Pages/Details/index.jsx +++ b/Client/src/Pages/Details/index.jsx @@ -31,28 +31,30 @@ const DetailsPage = () => { /** * Function to calculate uptime duration based on the most recent check. * @param {Array} checks Array of check objects. - * @returns {string} Uptime duration in hours, minutes, and seconds. - * TODO - NEED TO REVISIT THIS FOR PROPER LOGIC. + * @returns {number} Uptime duration in ms. */ const calculateUptimeDuration = (checks) => { if (!checks || checks.length === 0) { - return "N/A"; + return 0; } - const mostRecentCheck = checks[0]; - const currentTime = new Date(); - const lastCheckedTime = new Date(mostRecentCheck.createdAt); - let uptimeDuration = currentTime - lastCheckedTime; + let longestDuration = 0; + let lastDownTimestamp = null; + let currentDuration = longestDuration; - // Calculate hours, minutes, and seconds from uptime duration - // TODO - NEED TO REVISIT THIS FOR PROPER LOGIC. - let uptimeHours = Math.floor(uptimeDuration / (1000 * 60 * 60)); - uptimeDuration %= 1000 * 60 * 60; - let uptimeMinutes = Math.floor(uptimeDuration / (1000 * 60)); - uptimeDuration %= 1000 * 60; - let uptimeSeconds = Math.floor(uptimeDuration / 1000); - - return `${uptimeHours}h ${uptimeMinutes}m ${uptimeSeconds}s`; + // Loop over the checks to find the most recent uptime duration + checks.forEach((check) => { + if (check.status === false) { + lastDownTimestamp = check.createdAt; + } else if (check.status === true && lastDownTimestamp) { + currentDuration = check.createdAt - lastDownTimestamp; + if (currentDuration > longestDuration) { + longestDuration = currentDuration; + } + lastDownTimestamp = null; + } + }); + return longestDuration; }; /** From 6259b89b94fd5021ccc9bf73add761b21d62ce38 Mon Sep 17 00:00:00 2001 From: M M Date: Mon, 15 Jul 2024 22:43:20 -0700 Subject: [PATCH 06/21] Fixed import issues and some naming. --- Server/index.js | 2 +- Server/models/{Metrics.js => PageSpeedCheck.js} | 0 Server/routes/pageSpeedCheckRoute.js | 8 ++++---- 3 files changed, 5 insertions(+), 5 deletions(-) rename Server/models/{Metrics.js => PageSpeedCheck.js} (100%) diff --git a/Server/index.js b/Server/index.js index da511ba63..eac3c0022 100644 --- a/Server/index.js +++ b/Server/index.js @@ -72,7 +72,7 @@ const startApp = async () => { app.use("/api/v1/monitors", verifyJWT, monitorRouter); app.use("/api/v1/checks", verifyJWT, checkRouter); app.use("/api/v1/alerts", verifyJWT, alertRouter); - app.use("/api/v1/pagespeed", verifyJWT, pageSpeedRouter); + app.use("/api/v1/pagespeed", verifyJWT, pageSpeedCheckRouter); //Temporary route for testing, remove later app.use("/api/v1/job", queueRouter); diff --git a/Server/models/Metrics.js b/Server/models/PageSpeedCheck.js similarity index 100% rename from Server/models/Metrics.js rename to Server/models/PageSpeedCheck.js diff --git a/Server/routes/pageSpeedCheckRoute.js b/Server/routes/pageSpeedCheckRoute.js index e3b591ecc..e2b80d182 100644 --- a/Server/routes/pageSpeedCheckRoute.js +++ b/Server/routes/pageSpeedCheckRoute.js @@ -1,6 +1,6 @@ const router = require("express").Router(); const { verifyOwnership } = require("../middleware/verifyOwnership"); -const PageSpeedCheck = require("../models/PageSpeedCheck"); +const pageSpeedCheckRouter = require("./routes/pageSpeedCheckRoute") /** * @route POST /:monitorId @@ -11,7 +11,7 @@ const PageSpeedCheck = require("../models/PageSpeedCheck"); */ router.post( "/:monitorId", - verifyOwnership(PageSpeedCheck, "monitorId"), + verifyOwnership(Monitor, "monitorId"), () => { console.log("Create check"); } @@ -26,7 +26,7 @@ router.post( */ router.get( "/:monitorId", - verifyOwnership(PageSpeedCheck, "monitorId"), + verifyOwnership(Monitor, "monitorId"), () => { console.log("Get checks"); } @@ -41,7 +41,7 @@ router.get( */ router.post( "/delete/:monitorId", - verifyOwnership(PageSpeedCheck, "monitorId"), + verifyOwnership(Monitor, "monitorId"), () => { console.log("Delete checks"); } From b508efcb00737ced26ade297d54a89284ebf8a65 Mon Sep 17 00:00:00 2001 From: M M Date: Mon, 15 Jul 2024 22:43:55 -0700 Subject: [PATCH 07/21] Fixed import. --- Server/routes/pageSpeedCheckRoute.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/routes/pageSpeedCheckRoute.js b/Server/routes/pageSpeedCheckRoute.js index e2b80d182..0881a3bd5 100644 --- a/Server/routes/pageSpeedCheckRoute.js +++ b/Server/routes/pageSpeedCheckRoute.js @@ -1,6 +1,6 @@ const router = require("express").Router(); const { verifyOwnership } = require("../middleware/verifyOwnership"); -const pageSpeedCheckRouter = require("./routes/pageSpeedCheckRoute") +const Monitor = require("../models/Monitor"); /** * @route POST /:monitorId From f8bfe5d675e0b5a7362f85589569209f347f227e Mon Sep 17 00:00:00 2001 From: M M Date: Mon, 15 Jul 2024 22:51:24 -0700 Subject: [PATCH 08/21] Fixed import. --- Server/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/index.js b/Server/index.js index eac3c0022..dbaafe150 100644 --- a/Server/index.js +++ b/Server/index.js @@ -12,7 +12,7 @@ const { verifyJWT } = require("./middleware/verifyJWT"); const { handleErrors } = require("./middleware/handleErrors"); const queueRouter = require("./routes/queueRoute"); const JobQueue = require("./service/jobQueue"); -const pageSpeedCheckRoutes = require("./routes/pageSpeedCheckRoutes"); +const pageSpeedCheckRoutes = require("./routes/pageSpeedCheckRoute"); // Need to wrap server setup in a function to handle async nature of JobQueue const startApp = async () => { From 29dbba9002d19d226dc01738541e9d32e8eb9acc Mon Sep 17 00:00:00 2001 From: M M Date: Mon, 15 Jul 2024 22:53:15 -0700 Subject: [PATCH 09/21] Fix imports --- Server/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/index.js b/Server/index.js index dbaafe150..9cd8d57ec 100644 --- a/Server/index.js +++ b/Server/index.js @@ -12,7 +12,7 @@ const { verifyJWT } = require("./middleware/verifyJWT"); const { handleErrors } = require("./middleware/handleErrors"); const queueRouter = require("./routes/queueRoute"); const JobQueue = require("./service/jobQueue"); -const pageSpeedCheckRoutes = require("./routes/pageSpeedCheckRoute"); +const pageSpeedCheckRouter = require("./routes/pageSpeedCheckRoute"); // Need to wrap server setup in a function to handle async nature of JobQueue const startApp = async () => { From 5a4bac78a397ba40982cd6c1462f2f8a6dd4d530 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 16 Jul 2024 09:56:11 -0700 Subject: [PATCH 10/21] New coderabbit filter --- .coderabbit.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index fbe457426..873db5cfe 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -1,5 +1,5 @@ language: "en-CA" -tone_instructions: "Tale as old as time (ooh-ooh) Tune as old as song Bittersweet and strange Finding you can change Learning you were wrong Certain as the sun Rising in the east Tale as old as time Song as old as rhyme Beauty and the beast" +tone_instructions: "His palms are sweaty, knees weak, arms are heavy There’s vomit on his sweater already, mom’s spaghetti" early_access: false reviews: profile: "assertive" From 0383cca41936d373ccf68e5c273e719a238da5e6 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 16 Jul 2024 10:02:48 -0700 Subject: [PATCH 11/21] reset last timestamp --- Client/src/Pages/Details/index.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/Client/src/Pages/Details/index.jsx b/Client/src/Pages/Details/index.jsx index 82b114254..83ec33a3b 100644 --- a/Client/src/Pages/Details/index.jsx +++ b/Client/src/Pages/Details/index.jsx @@ -54,6 +54,7 @@ const DetailsPage = () => { lastDownTimestamp = null; } }); + lastDownTimestamp = null; return longestDuration; }; From 87c04cd89a73a50260434a73677b0809029fdcc6 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 16 Jul 2024 10:07:04 -0700 Subject: [PATCH 12/21] Add logic for remaining calculations --- Client/src/Pages/Details/index.jsx | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/Client/src/Pages/Details/index.jsx b/Client/src/Pages/Details/index.jsx index 5e9e0b592..1fc56a424 100644 --- a/Client/src/Pages/Details/index.jsx +++ b/Client/src/Pages/Details/index.jsx @@ -58,33 +58,29 @@ const DetailsPage = () => { /** * Helper function to get timestamp of the most recent check. * @param {Array} checks Array of check objects. - * @returns {string} Timestamp of the most recent check. - * TODO - NEED TO REVISIT THIS FOR PROPER LOGIC. + * @returns {number} Timestamp of the most recent check. */ const getLastCheckedTimestamp = (checks) => { if (!checks || checks.length === 0) { - return "N/A"; // Handle case when no checks are available + return 0; // Handle case when no checks are available } const mostRecentCheck = checks[0]; - return new Date(mostRecentCheck.createdAt).toLocaleString(); + return mostRecentCheck.createdAt; }; /** * Helper function to count incidents (checks with status === false). * @param {Array} checks Array of check objects. * @returns {number} Number of incidents. - * TODO - NEED TO REVISIT THIS FOR PROPER LOGIC. */ const countIncidents = (checks) => { if (!checks || checks.length === 0) { return 0; // Handle case when no checks are available } - - // Count checks with status === false - // TODO - NEED TO REVISIT THIS FOR PROPER LOGIC. - const incidentCount = checks.filter((check) => !check.status).length; - return incidentCount; + return checks.reduce((acc, check) => { + check.status === false ? (acc += 1) : acc; + }, 0); }; return ( From bc3a47e2647745cefef80c65a69dbe76ff0acea0 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 16 Jul 2024 10:14:25 -0700 Subject: [PATCH 13/21] correcetd route and method for delete route --- Server/routes/pageSpeedCheckRoute.js | 30 +++++++++------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/Server/routes/pageSpeedCheckRoute.js b/Server/routes/pageSpeedCheckRoute.js index 0881a3bd5..d4d06820a 100644 --- a/Server/routes/pageSpeedCheckRoute.js +++ b/Server/routes/pageSpeedCheckRoute.js @@ -9,13 +9,9 @@ const Monitor = require("../models/Monitor"); * @param {string} monitorId - The ID of the monitor * @middleware verifyOwnership - Ensures the user owns the monitor */ -router.post( - "/:monitorId", - verifyOwnership(Monitor, "monitorId"), - () => { - console.log("Create check"); - } -); +router.post("/:monitorId", verifyOwnership(Monitor, "monitorId"), () => { + console.log("Create check"); +}); /** * @route GET /:monitorId @@ -24,13 +20,9 @@ router.post( * @param {string} monitorId - The ID of the monitor * @middleware verifyOwnership - Ensures the user owns the monitor */ -router.get( - "/:monitorId", - verifyOwnership(Monitor, "monitorId"), - () => { - console.log("Get checks"); - } -); +router.get("/:monitorId", verifyOwnership(Monitor, "monitorId"), () => { + console.log("Get checks"); +}); /** * @route POST /delete/:monitorId @@ -39,12 +31,8 @@ router.get( * @param {string} monitorId - The ID of the monitor * @middleware verifyOwnership - Ensures the user owns the monitor */ -router.post( - "/delete/:monitorId", - verifyOwnership(Monitor, "monitorId"), - () => { - console.log("Delete checks"); - } -); +router.delete("/:monitorId", verifyOwnership(Monitor, "monitorId"), () => { + console.log("Delete checks"); +}); module.exports = router; From be7ff41b0e84f32548afe2601f1ad7888a207233 Mon Sep 17 00:00:00 2001 From: M M Date: Tue, 16 Jul 2024 10:53:19 -0700 Subject: [PATCH 14/21] setup the controller module for the page speed check. --- .../controllers/pageSpeedCheckController.js | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Server/controllers/pageSpeedCheckController.js diff --git a/Server/controllers/pageSpeedCheckController.js b/Server/controllers/pageSpeedCheckController.js new file mode 100644 index 000000000..21fc7b09c --- /dev/null +++ b/Server/controllers/pageSpeedCheckController.js @@ -0,0 +1,36 @@ +const PageSpeedCheck = require("../models/PageSpeedCheck"); +const { successMessages } = require("../utils/messages"); +const SERVICE_NAME = "pagespeed"; + +const getPageSpeedChecks = async (req, res, next) => { + try { + return res.status(200).json({ msg: "Hit getPageSpeedChecks" }); + } catch (error) { + error.service = SERVICE_NAME; + next(error); + } +}; + +const createPageSpeedCheck = async (req, res, next) => { + try { + return res.status(200).json({ msg: "Hit createPageSpeedCheck" }); + } catch (error) { + error.service = SERVICE_NAME; + next(error); + } +}; + +const deletePageSpeedCheck = async (req, res, next) => { + try { + return res.status(200).json({ msg: "Hit deletePageSpeedCheck" }); + } catch (error) { + error.service = SERVICE_NAME; + next(error); + } +}; + +module.exports = { + getPageSpeedChecks, + createPageSpeedCheck, + deletePageSpeedCheck, +}; From 519ef1404f5a3fa0b542cf3bbd2633f8bb86c483 Mon Sep 17 00:00:00 2001 From: M M Date: Tue, 16 Jul 2024 10:54:59 -0700 Subject: [PATCH 15/21] Added JS Docs. --- .../controllers/pageSpeedCheckController.js | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Server/controllers/pageSpeedCheckController.js b/Server/controllers/pageSpeedCheckController.js index 21fc7b09c..29cc10f95 100644 --- a/Server/controllers/pageSpeedCheckController.js +++ b/Server/controllers/pageSpeedCheckController.js @@ -2,6 +2,14 @@ const PageSpeedCheck = require("../models/PageSpeedCheck"); const { successMessages } = require("../utils/messages"); const SERVICE_NAME = "pagespeed"; +/** + * Gets all PageSpeedChecks for a monitor + * @async + * @param {Express.Request} req - The request object + * @param {Express.Response} res - The response object + * @param {Function} next - The next middleware function + * @returns {Promise} + */ const getPageSpeedChecks = async (req, res, next) => { try { return res.status(200).json({ msg: "Hit getPageSpeedChecks" }); @@ -11,6 +19,14 @@ const getPageSpeedChecks = async (req, res, next) => { } }; +/** + * Creates a new PageSpeedCheck for a monitor + * @async + * @param {Express.Request} req - The request object + * @param {Express.Response} res - The response object + * @param {Function} next - The next middleware function + * @returns {Promise} + */ const createPageSpeedCheck = async (req, res, next) => { try { return res.status(200).json({ msg: "Hit createPageSpeedCheck" }); @@ -20,6 +36,14 @@ const createPageSpeedCheck = async (req, res, next) => { } }; +/** + * Deletes all PageSpeedChecks for a monitor + * @async + * @param {Express.Request} req - The request object + * @param {Express.Response} res - The response object + * @param {Function} next - The next middleware function + * @returns {Promise} + */ const deletePageSpeedCheck = async (req, res, next) => { try { return res.status(200).json({ msg: "Hit deletePageSpeedCheck" }); From 784957bb25fed118324842b551e42d04b916494b Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 16 Jul 2024 11:06:28 -0700 Subject: [PATCH 16/21] Add listener to BasicTable --- Client/src/Components/BasicTable/index.jsx | 24 ++++++++++++++++++-- Client/src/Components/MonitorTable/index.jsx | 16 ++++++++++--- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Client/src/Components/BasicTable/index.jsx b/Client/src/Components/BasicTable/index.jsx index a80c7bfb6..7457b7abf 100644 --- a/Client/src/Components/BasicTable/index.jsx +++ b/Client/src/Components/BasicTable/index.jsx @@ -20,6 +20,7 @@ import PropTypes from "prop-types"; * @param {Array} props.headers - Array of header titles for the table. * @param {Array} props.rowItems - Array of row data objects for the table. * @param {boolean} props.paginated - Flag to enable pagination. + * @param {function} props.handleClick - Function to handle click on row. * * @example * @@ -47,6 +48,10 @@ import PropTypes from "prop-types"; * { id: 3, data:
5
}, * // More rows... * ]; + * + * ROW CLICK HANDLING + * If you want to set a listener for a row click, you can add a handleClick function to FIRST ITEM IN EACH ROW + * * */ @@ -94,7 +99,14 @@ const BasicTable = ({ headers, rowItems, paginated }) => { {paginated === false && Object.keys(groupedRowItems).map((key) => { return ( - + { + groupedRowItems[key].items[0].item.handleClick + ? groupedRowItems[key].items[0].item.handleClick() + : null; + }} + key={groupedRowItems[key].idx} + > {groupedRowItems[key].items.map(({ item }) => { return {item.data}; })} @@ -103,7 +115,14 @@ const BasicTable = ({ headers, rowItems, paginated }) => { })} {paginated === true && paginatedRowsKeys.map((key) => ( - + { + groupedRowItems[key].items[0].item.handleClick + ? groupedRowItems[key].items[0].item.handleClick() + : null; + }} + key={groupedRowItems[key].idx} + > {groupedRowItems[key].items.map(({ item }) => ( {item.data} ))} @@ -141,6 +160,7 @@ BasicTable.propTypes = { }) ).isRequired, paginated: PropTypes.bool, + handleClick: PropTypes.func, }; export default BasicTable; diff --git a/Client/src/Components/MonitorTable/index.jsx b/Client/src/Components/MonitorTable/index.jsx index 338ebb793..536c2c019 100644 --- a/Client/src/Components/MonitorTable/index.jsx +++ b/Client/src/Components/MonitorTable/index.jsx @@ -106,13 +106,23 @@ const MonitorTable = ({ monitors = [] }) => { ? "var(--env-var-color-17)" : "var(--env-var-color-19)", }; - data.push({ id: data.length + 1, data: }); - data.push({ id: data.length + 1, data: }); data.push({ id: data.length + 1, + data: , + handleClick: () => { + console.log(monitor._id); + }, + }); + data.push({ + id: data.length + 1, + data: , + }); + data.push({ + id: data.length + 1, + data: , }); - data.push({ id: data.length + 1, data: "TODO" }); + data.push({ id: data.length + 1, itemId: monitor._id, data: "TODO" }); }); return ; From 0b74175e9c0492bb5f3c018f96ee2621bd7c083c Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 16 Jul 2024 11:10:45 -0700 Subject: [PATCH 17/21] Merged chagnes --- Client/src/Components/MonitorTable/index.jsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Client/src/Components/MonitorTable/index.jsx b/Client/src/Components/MonitorTable/index.jsx index 338ebb793..6904978c8 100644 --- a/Client/src/Components/MonitorTable/index.jsx +++ b/Client/src/Components/MonitorTable/index.jsx @@ -3,6 +3,7 @@ import PropTypes from "prop-types"; import ResponseTimeChart from "../Charts/ResponseTimeChart"; import BasicTable from "../BasicTable"; import OpenInNewPage from "../../assets/icons/open-in-new-page.svg?react"; +import { useNavigate } from "react-router-dom"; /** * Host component. @@ -80,6 +81,8 @@ const Status = ({ params }) => { * @returns {React.Component} Returns a table with the monitor data. */ const MonitorTable = ({ monitors = [] }) => { + const navigate = useNavigate(); + const headers = [ { id: 1, name: "Host" }, { id: 2, name: "Status" }, @@ -106,8 +109,17 @@ const MonitorTable = ({ monitors = [] }) => { ? "var(--env-var-color-17)" : "var(--env-var-color-19)", }; - data.push({ id: data.length + 1, data: }); - data.push({ id: data.length + 1, data: }); + data.push({ + id: data.length + 1, + data: , + handleClick: () => { + navigate(`/monitors/${monitor._id}`); + }, + }); + data.push({ + id: data.length + 1, + data: , + }); data.push({ id: data.length + 1, data: , From cc9c439c8d8d4f08bc01736b259165d1d2e1e252 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 16 Jul 2024 13:21:45 -0700 Subject: [PATCH 18/21] Excised insanity from Basic Table --- Client/src/Components/BasicTable/index.jsx | 161 +++++++++---------- Client/src/Components/MonitorTable/index.jsx | 58 +++---- Client/src/Pages/Details/index.jsx | 1 - 3 files changed, 95 insertions(+), 125 deletions(-) diff --git a/Client/src/Components/BasicTable/index.jsx b/Client/src/Components/BasicTable/index.jsx index 7457b7abf..705872033 100644 --- a/Client/src/Components/BasicTable/index.jsx +++ b/Client/src/Components/BasicTable/index.jsx @@ -17,45 +17,52 @@ import PropTypes from "prop-types"; * * @component * @param {Object} props - Component props. - * @param {Array} props.headers - Array of header titles for the table. - * @param {Array} props.rowItems - Array of row data objects for the table. - * @param {boolean} props.paginated - Flag to enable pagination. - * @param {function} props.handleClick - Function to handle click on row. + * @param {Object} props.data - Data for the table including columns and rows. + * @param {Array} props.data.cols - Array of objects for column headers. + * @param {number} props.data.cols[].id - Unique identifier for the column. + * @param {string} props.data.cols[].name - Name of the column to display as header. + * @param {Array} props.data.rows - Array of row objects. + * @param {number} props.data.rows[].id - Unique identifier for the row. + * @param {Array} props.data.rows[].data - Array of cell data objects for the row. + * @param {number} props.data.rows[].data[].id - Unique identifier for the cell. + * @param {JSX.Element} props.data.rows[].data[].data - The content to display in the cell. + * @param {functio} props.data.rows.data.handleClick - Function to call when the row is clicked. + * @param {boolean} [props.paginated=false] - Flag to enable pagination. * * @example + * const data = { + * cols: [ + * { id: 1, name: "First Col" }, + * { id: 2, name: "Second Col" }, + * { id: 3, name: "Third Col" }, + * { id: 4, name: "Fourth Col" }, + * ], + * rows: [ + * { + * id: 1, + * data: [ + * { id: 1, data:
Data for Row 1 Col 1
}, + * { id: 2, data:
Data for Row 1 Col 2
}, + * { id: 3, data:
Data for Row 1 Col 3
}, + * { id: 4, data:
Data for Row 1 Col 4
}, + * ], + * }, + * { + * id: 2, + * data: [ + * { id: 5, data:
Data for Row 2 Col 1
}, + * { id: 6, data:
Data for Row 2 Col 2
}, + * { id: 7, data:
Data for Row 2 Col 3
}, + * { id: 8, data:
Data for Row 2 Col 4
}, + * ], + * }, + * ], + * }; * - * Headers is an array of objets that have a unique ID and a name - * Rows is an array of objects that have a unique ID and some data to display - * Row data can be any valid React node - * Rows are split into groups according to the number of headers, so if you have 3 headers then - * Rows will go under the index % 3 column. - * ie: Row 0 -> col 0 % 3 = 0 - * ie: Row 1 -> col 1 % 3 = 1 - * ie: Row 2 -> col 2 % 3 = 2 - * ie: Row 3 -> col 3 % 3 = 0 - * - * Thus items are put in their correct columns - * - * - * const headers = [ - * { id: 1, name: "ID" }, - * { id: 2, name: "Name" }, - * { id: 3, name: "Age" }, - * ]; - * const rows = [ - * { id: 1, data: 999 }, - * { id: 2, data:
Alex Holliday
}, - * { id: 3, data:
5
}, - * // More rows... - * ]; - * - * ROW CLICK HANDLING - * If you want to set a listener for a row click, you can add a handleClick function to FIRST ITEM IN EACH ROW - * - * + * */ -const BasicTable = ({ headers, rowItems, paginated }) => { +const BasicTable = ({ data, paginated }) => { // Add headers to props validation const [page, setPage] = useState(0); @@ -70,19 +77,13 @@ const BasicTable = ({ headers, rowItems, paginated }) => { setPage(0); // Reset to first page after changing rows per page }; - const numOfCols = headers.length; - - const groupedRowItems = rowItems.reduce((acc, item, idx) => { - const rowIndex = Math.floor((item.id - 1) / numOfCols); - if (!acc[rowIndex]) acc[rowIndex] = { items: [], idx }; - acc[rowIndex].items.push({ item }); - return acc; - }, {}); - - const paginatedRowsKeys = Object.keys(groupedRowItems).slice( - page * rowsPerPage, - page * rowsPerPage + rowsPerPage - ); + let paginatedData = []; + if (paginated) { + paginatedData = data.rows.slice( + page * rowsPerPage, + page * rowsPerPage + rowsPerPage + ); + } return ( <> @@ -90,56 +91,52 @@ const BasicTable = ({ headers, rowItems, paginated }) => { - {headers.map((header) => { - return {header.name}; - })} + {data.cols.map((col) => ( + {col.name} + ))} {paginated === false && - Object.keys(groupedRowItems).map((key) => { + data.rows.map((row) => { return ( { - groupedRowItems[key].items[0].item.handleClick - ? groupedRowItems[key].items[0].item.handleClick() - : null; - }} - key={groupedRowItems[key].idx} + sx={{ cursor: row.handleClick ? "pointer" : "default" }} + key={row.id} + onClick={row.handleClick ? row.handleClick : null} > - {groupedRowItems[key].items.map(({ item }) => { - return {item.data}; + {row.data.map((cell) => { + return {cell.data}; })} ); })} {paginated === true && - paginatedRowsKeys.map((key) => ( - { - groupedRowItems[key].items[0].item.handleClick - ? groupedRowItems[key].items[0].item.handleClick() - : null; - }} - key={groupedRowItems[key].idx} - > - {groupedRowItems[key].items.map(({ item }) => ( - {item.data} - ))} - - ))} + paginatedData.map((row) => { + return ( + + {row.data.map((cell) => { + return {cell.data}; + })} + + ); + })}
{paginated === true && ( )} @@ -147,20 +144,8 @@ const BasicTable = ({ headers, rowItems, paginated }) => { }; BasicTable.propTypes = { - headers: PropTypes.arrayOf( - PropTypes.shape({ - id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, - name: PropTypes.string.isRequired, - }) - ).isRequired, - rowItems: PropTypes.arrayOf( - PropTypes.shape({ - id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, - data: PropTypes.node, - }) - ).isRequired, + data: PropTypes.object.isRequired, paginated: PropTypes.bool, - handleClick: PropTypes.func, }; export default BasicTable; diff --git a/Client/src/Components/MonitorTable/index.jsx b/Client/src/Components/MonitorTable/index.jsx index f26b44a78..35b7a0fca 100644 --- a/Client/src/Components/MonitorTable/index.jsx +++ b/Client/src/Components/MonitorTable/index.jsx @@ -83,14 +83,17 @@ const Status = ({ params }) => { const MonitorTable = ({ monitors = [] }) => { const navigate = useNavigate(); - const headers = [ - { id: 1, name: "Host" }, - { id: 2, name: "Status" }, - { id: 3, name: "Response Time" }, - { id: 4, name: "Actions" }, - ]; - const data = []; - monitors.forEach((monitor) => { + const data = { + cols: [ + { id: 1, name: "Host" }, + { id: 2, name: "Status" }, + { id: 3, name: "Response Time" }, + { id: 4, name: "Actions" }, + ], + rows: [], + }; + + data.rows = monitors.map((monitor, idx) => { const params = { url: monitor.url, title: monitor.name, @@ -109,37 +112,20 @@ const MonitorTable = ({ monitors = [] }) => { ? "var(--env-var-color-17)" : "var(--env-var-color-19)", }; - data.push({ - id: data.length + 1, - data: , - handleClick: () => { - navigate(`/monitors/${monitor._id}`); - }, - }); - data.push({ - id: data.length + 1, - data: , - }); - data.push({ - id: data.length + 1, - data: , - handleClick: () => { - console.log(monitor._id); - }, - }); - data.push({ - id: data.length + 1, - data: , - }); - data.push({ - id: data.length + 1, - data: , - }); - data.push({ id: data.length + 1, itemId: monitor._id, data: "TODO" }); + return { + id: monitor._id, + handleClick: () => navigate(`/monitors/${monitor._id}`), + data: [ + { id: idx, data: }, + { id: idx + 1, data: }, + { id: idx + 2, data: }, + { id: idx + 3, data: "TODO" }, + ], + }; }); - return ; + return ; }; MonitorTable.propTypes = { diff --git a/Client/src/Pages/Details/index.jsx b/Client/src/Pages/Details/index.jsx index 488b2b6ab..201a32524 100644 --- a/Client/src/Pages/Details/index.jsx +++ b/Client/src/Pages/Details/index.jsx @@ -27,7 +27,6 @@ const DetailsPage = () => { const theme = useTheme(); - // Example monitor data (replace with actual data or fetch from API) /** * Function to calculate uptime duration based on the most recent check. * @param {Array} checks Array of check objects. From e0d3dd0331dc48045225eaa15d772d99ab55f1f1 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 16 Jul 2024 13:27:58 -0700 Subject: [PATCH 19/21] Further simplified --- Client/src/Components/BasicTable/index.jsx | 51 +++++++--------------- 1 file changed, 16 insertions(+), 35 deletions(-) diff --git a/Client/src/Components/BasicTable/index.jsx b/Client/src/Components/BasicTable/index.jsx index 705872033..f006a3a48 100644 --- a/Client/src/Components/BasicTable/index.jsx +++ b/Client/src/Components/BasicTable/index.jsx @@ -77,13 +77,9 @@ const BasicTable = ({ data, paginated }) => { setPage(0); // Reset to first page after changing rows per page }; - let paginatedData = []; - if (paginated) { - paginatedData = data.rows.slice( - page * rowsPerPage, - page * rowsPerPage + rowsPerPage - ); - } + let displayData = paginated + ? data.rows.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage) + : data.rows; return ( <> @@ -97,34 +93,19 @@ const BasicTable = ({ data, paginated }) => {
- {paginated === false && - data.rows.map((row) => { - return ( - - {row.data.map((cell) => { - return {cell.data}; - })} - - ); - })} - {paginated === true && - paginatedData.map((row) => { - return ( - - {row.data.map((cell) => { - return {cell.data}; - })} - - ); - })} + {displayData.map((row) => { + return ( + + {row.data.map((cell) => { + return {cell.data}; + })} + + ); + })} From f985884cea986d69693a2d8481ff8f846fe60082 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 16 Jul 2024 13:30:11 -0700 Subject: [PATCH 20/21] Fix typo --- Client/src/Components/BasicTable/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/src/Components/BasicTable/index.jsx b/Client/src/Components/BasicTable/index.jsx index f006a3a48..a1c3afef2 100644 --- a/Client/src/Components/BasicTable/index.jsx +++ b/Client/src/Components/BasicTable/index.jsx @@ -26,7 +26,7 @@ import PropTypes from "prop-types"; * @param {Array} props.data.rows[].data - Array of cell data objects for the row. * @param {number} props.data.rows[].data[].id - Unique identifier for the cell. * @param {JSX.Element} props.data.rows[].data[].data - The content to display in the cell. - * @param {functio} props.data.rows.data.handleClick - Function to call when the row is clicked. + * @param {function} props.data.rows.data.handleClick - Function to call when the row is clicked. * @param {boolean} [props.paginated=false] - Flag to enable pagination. * * @example From ce200eeb20a4da2a860ef7a5b4a294b95443dfea Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 16 Jul 2024 14:06:51 -0700 Subject: [PATCH 21/21] Reset password returns a token --- Server/controllers/authController.js | 4 ++-- Server/db/MongoDB.js | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index 979a0b87e..a4fe598d1 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -309,11 +309,11 @@ const validateRecoveryTokenController = async (req, res, next) => { const resetPasswordController = async (req, res, next) => { try { await newPasswordValidation.validateAsync(req.body); - user = await req.db.resetPassword(req, res); + const token = await req.db.resetPassword(req, res); res.status(200).json({ success: true, msg: successMessages.AUTH_RESET_PASSWORD, - data: user, + data: token, }); } catch (error) { error.service = SERVICE_NAME; diff --git a/Server/db/MongoDB.js b/Server/db/MongoDB.js index c0b0948a2..1170134de 100644 --- a/Server/db/MongoDB.js +++ b/Server/db/MongoDB.js @@ -220,7 +220,8 @@ const resetPassword = async (req, res) => { }) .select("-password") .select("-profileImage"); - return userWithoutPassword; + const token = issueToken(userWithoutPassword); + return token; } else { throw new Error(errorMessages.DB_USER_NOT_FOUND); }