diff --git a/Client/src/Components/CurrentMonitors/index.jsx b/Client/src/Components/CurrentMonitors/index.jsx deleted file mode 100644 index 2357c850e..000000000 --- a/Client/src/Components/CurrentMonitors/index.jsx +++ /dev/null @@ -1,38 +0,0 @@ -import SearchTextField from "../TextFields/Search/SearchTextField"; -import "./index.css"; -import HostsTable from "../HostsTable"; -import Pagination from "../Pagination"; -import PropTypes from "prop-types"; - -/** - * CurrentMonitors displays the current status of monitor - * - * @component - * @param {Array} monitors - An array of monitor objects to be displayed. - */ - -const CurrentMonitors = ({ monitors }) => { - return ( -
-
-
-
Current monitors
-
{monitors.length}
-
-
- -
-
-
- -
- -
- ); -}; - -CurrentMonitors.propTypes = { - monitors: PropTypes.arrayOf(PropTypes.object).isRequired, -}; - -export default CurrentMonitors; diff --git a/Client/src/Components/TabPanels/Account/PasswordPanel.jsx b/Client/src/Components/TabPanels/Account/PasswordPanel.jsx index 14b9a016f..1e04ecaea 100644 --- a/Client/src/Components/TabPanels/Account/PasswordPanel.jsx +++ b/Client/src/Components/TabPanels/Account/PasswordPanel.jsx @@ -1,6 +1,7 @@ import TabPanel from "@mui/lab/TabPanel"; import React, { useState } from "react"; -import AnnouncementsDualButtonWithIcon from "../../Announcements/AnnouncementsDualButtonWithIcon/AnnouncementsDualButtonWithIcon"; +// import AnnouncementsDualButtonWithIcon from "../../Announcements/AnnouncementsDualButtonWithIcon/AnnouncementsDualButtonWithIcon"; +import AnnouncementsDualButtonWithIcon from "../../Toast/AnnouncementsDualButtonWithIcon/AnnouncementsDualButtonWithIcon"; import { useTheme } from "@emotion/react"; import { Box, Divider, Stack, Typography } from "@mui/material"; import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined"; diff --git a/Client/src/Components/Announcements/AnnouncementUpdateSubscription/AnnouncementUpdateSubscription.jsx b/Client/src/Components/Toast/AnnouncementUpdateSubscription/AnnouncementUpdateSubscription.jsx similarity index 100% rename from Client/src/Components/Announcements/AnnouncementUpdateSubscription/AnnouncementUpdateSubscription.jsx rename to Client/src/Components/Toast/AnnouncementUpdateSubscription/AnnouncementUpdateSubscription.jsx diff --git a/Client/src/Components/Announcements/AnnouncementUpdateSubscription/announcementUpdateSubscription.css b/Client/src/Components/Toast/AnnouncementUpdateSubscription/announcementUpdateSubscription.css similarity index 100% rename from Client/src/Components/Announcements/AnnouncementUpdateSubscription/announcementUpdateSubscription.css rename to Client/src/Components/Toast/AnnouncementUpdateSubscription/announcementUpdateSubscription.css diff --git a/Client/src/Components/Announcements/AnnouncementsDualButton/AnnouncementsDualButton.jsx b/Client/src/Components/Toast/AnnouncementsDualButton/AnnouncementsDualButton.jsx similarity index 100% rename from Client/src/Components/Announcements/AnnouncementsDualButton/AnnouncementsDualButton.jsx rename to Client/src/Components/Toast/AnnouncementsDualButton/AnnouncementsDualButton.jsx diff --git a/Client/src/Components/Announcements/AnnouncementsDualButton/announcementsDualButton.css b/Client/src/Components/Toast/AnnouncementsDualButton/announcementsDualButton.css similarity index 100% rename from Client/src/Components/Announcements/AnnouncementsDualButton/announcementsDualButton.css rename to Client/src/Components/Toast/AnnouncementsDualButton/announcementsDualButton.css diff --git a/Client/src/Components/Announcements/AnnouncementsDualButtonWithIcon/AnnouncementsDualButtonWithIcon.jsx b/Client/src/Components/Toast/AnnouncementsDualButtonWithIcon/AnnouncementsDualButtonWithIcon.jsx similarity index 100% rename from Client/src/Components/Announcements/AnnouncementsDualButtonWithIcon/AnnouncementsDualButtonWithIcon.jsx rename to Client/src/Components/Toast/AnnouncementsDualButtonWithIcon/AnnouncementsDualButtonWithIcon.jsx diff --git a/Client/src/Components/Announcements/AnnouncementsDualButtonWithIcon/announcementsDualButtonWithIcon.css b/Client/src/Components/Toast/AnnouncementsDualButtonWithIcon/announcementsDualButtonWithIcon.css similarity index 100% rename from Client/src/Components/Announcements/AnnouncementsDualButtonWithIcon/announcementsDualButtonWithIcon.css rename to Client/src/Components/Toast/AnnouncementsDualButtonWithIcon/announcementsDualButtonWithIcon.css diff --git a/Client/src/Components/Announcements/AnnouncementsMessageBar/AnnouncementsMessageBar.jsx b/Client/src/Components/Toast/AnnouncementsMessageBar/AnnouncementsMessageBar.jsx similarity index 100% rename from Client/src/Components/Announcements/AnnouncementsMessageBar/AnnouncementsMessageBar.jsx rename to Client/src/Components/Toast/AnnouncementsMessageBar/AnnouncementsMessageBar.jsx diff --git a/Client/src/Components/Announcements/AnnouncementsMessageBar/announcementsMessageBar.css b/Client/src/Components/Toast/AnnouncementsMessageBar/announcementsMessageBar.css similarity index 100% rename from Client/src/Components/Announcements/AnnouncementsMessageBar/announcementsMessageBar.css rename to Client/src/Components/Toast/AnnouncementsMessageBar/announcementsMessageBar.css diff --git a/Client/src/Components/Toast/index.jsx b/Client/src/Components/Toast/index.jsx index 87e6c2ea9..41367ec11 100644 --- a/Client/src/Components/Toast/index.jsx +++ b/Client/src/Components/Toast/index.jsx @@ -1,6 +1,6 @@ import PropTypes from "prop-types"; import ComplexAlert from "../../Components/Icons/ComplexAlert/ComplexAlert"; -import AnnouncementsDualButtonWithIcon from "../../Components/Announcements/AnnouncementsDualButtonWithIcon/AnnouncementsDualButtonWithIcon"; +import AnnouncementsDualButtonWithIcon from "./AnnouncementsDualButtonWithIcon/AnnouncementsDualButtonWithIcon"; import "react-toastify/dist/ReactToastify.css"; import { toast, ToastContainer } from "react-toastify"; import "./index.css"; diff --git a/Client/src/Pages/Monitors/CurrentStats.jsx b/Client/src/Pages/Monitors/CurrentStats.jsx deleted file mode 100644 index ef15ae6cc..000000000 --- a/Client/src/Pages/Monitors/CurrentStats.jsx +++ /dev/null @@ -1,65 +0,0 @@ -import Button from "../../Components/Button"; -import ServerStatus from "../../Components/Charts/Servers/ServerStatus"; -import CurrentMonitors from "../../Components/CurrentMonitors"; -import PropTypes from "prop-types"; -import { useSelector } from "react-redux"; -import { useNavigate } from "react-router-dom"; - -/** - * CurrentStats displays the current status of monitor - * - * @component - * @param {Array} monitors - An array of monitor objects to be displayed. - */ - -const CurrentStats = ({ monitors }) => { - const navigate = useNavigate(); - const authState = useSelector((state) => state.auth); - const up = monitors.reduce((acc, cur) => { - if (cur.checks.length > 0) { - return cur.checks[cur.checks.length - 1].status === true ? acc + 1 : acc; - } - return 0; - }, 0); - - const down = monitors.reduce((acc, cur) => { - if (cur.checks.length > 0) { - return cur.checks[cur.checks.length - 1].status === false ? acc + 1 : acc; - } - return 0; - }, 0); - - return ( -
-
-
-
-
- Hello, {authState.user.firstname} -
-
-
-
- - - -
-
- -
- ); -}; - -CurrentStats.propTypes = { - monitors: PropTypes.arrayOf(PropTypes.object).isRequired, -}; - -export default CurrentStats; diff --git a/Client/src/Pages/Monitors/index.css b/Client/src/Pages/Monitors/index.css index 6efd05617..987bbd7cd 100644 --- a/Client/src/Pages/Monitors/index.css +++ b/Client/src/Pages/Monitors/index.css @@ -9,6 +9,7 @@ } .monitors-bar { + margin-top: calc(2 * var(--env-var-spacing-2)); display: flex; justify-content: space-between; align-items: center; @@ -20,6 +21,7 @@ } .monitors-stats { + margin-top: var(--env-var-spacing-2); display: flex; gap: 24px; } diff --git a/Client/src/Pages/Monitors/index.jsx b/Client/src/Pages/Monitors/index.jsx index 5f7b4b9af..049d758ac 100644 --- a/Client/src/Pages/Monitors/index.jsx +++ b/Client/src/Pages/Monitors/index.jsx @@ -1,22 +1,69 @@ -import CurrentStats from "./CurrentStats"; import "./index.css"; +import "./monitors.css"; import { useEffect } from "react"; -import { useSelector } from "react-redux"; -import { useDispatch } from "react-redux"; +import { useSelector, useDispatch } from "react-redux"; import { getMonitorsByUserId } from "../../Features/Monitors/monitorsSlice"; - +import { useNavigate } from "react-router-dom"; +import Button from "../../Components/Button"; +import ServerStatus from "../../Components/Charts/Servers/ServerStatus"; +import SearchTextField from "../../Components/TextFields/Search/SearchTextField"; +import HostsTable from "../../Components/HostsTable"; +import Pagination from "../../Components/Pagination"; const Monitors = () => { + const navigate = useNavigate(); const monitorState = useSelector((state) => state.monitors); - const authstate = useSelector((state) => state.auth); + const authState = useSelector((state) => state.auth); const dispatch = useDispatch(); useEffect(() => { - dispatch(getMonitorsByUserId(authstate.authToken)); + dispatch(getMonitorsByUserId(authState.authToken)); }, []); + const up = monitorState.monitors.reduce((acc, cur) => { + return cur.status === true ? acc + 1 : acc; + }, 0); + + const down = monitorState.monitors.length - up; + return (
- +
+
+ Hello, {authState.user.firstname} +
+
+ +
+ + + +
+ +
+
+
+
Current monitors
+
+ {monitorState.monitors.length} +
+
+
+ +
+
+
+ +
+ +
); }; diff --git a/Client/src/Components/CurrentMonitors/index.css b/Client/src/Pages/Monitors/monitors.css similarity index 98% rename from Client/src/Components/CurrentMonitors/index.css rename to Client/src/Pages/Monitors/monitors.css index 8580bfcd0..c2ed8532f 100644 --- a/Client/src/Components/CurrentMonitors/index.css +++ b/Client/src/Pages/Monitors/monitors.css @@ -1,4 +1,5 @@ .current-monitors { + margin-top: var(--env-var-spacing-2); border: 1px solid #eaecf0; padding: 40px; border-radius: 4px; diff --git a/Client/src/Pages/PlayGround/PlayGround.jsx b/Client/src/Pages/PlayGround/PlayGround.jsx index 5f46af08d..bde0b6761 100644 --- a/Client/src/Pages/PlayGround/PlayGround.jsx +++ b/Client/src/Pages/PlayGround/PlayGround.jsx @@ -4,12 +4,12 @@ import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline"; import HelpOutlineIcon from "@mui/icons-material/HelpOutline"; import WebsiteTextField from "../../Components/TextFields/Website/WebsiteTextField"; import DescriptionTextField from "../../Components/TextFields/Description/DescriptionTextField"; -import AnnouncementsDualButton from "../../Components/Announcements/AnnouncementsDualButton/AnnouncementsDualButton"; -import AnnouncementsDualButtonWithIcon from "../../Components/Announcements/AnnouncementsDualButtonWithIcon/AnnouncementsDualButtonWithIcon"; +import AnnouncementsDualButton from "../../Components/Toast/AnnouncementsDualButton/AnnouncementsDualButton"; +import AnnouncementsDualButtonWithIcon from "../../Components/Toast/AnnouncementsDualButtonWithIcon/AnnouncementsDualButtonWithIcon"; import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined"; import ComplexAlert from "../../Components/Icons/ComplexAlert/ComplexAlert"; -import AnnouncementsMessageBar from "../../Components/Announcements/AnnouncementsMessageBar/AnnouncementsMessageBar"; -import AnnouncementUpdateSubscription from "../../Components/Announcements/AnnouncementUpdateSubscription/AnnouncementUpdateSubscription"; +import AnnouncementsMessageBar from "../../Components/Toast/AnnouncementsMessageBar/AnnouncementsMessageBar"; +import AnnouncementUpdateSubscription from "../../Components/Toast/AnnouncementUpdateSubscription/AnnouncementUpdateSubscription"; import PlayGroundCharts from "./PlayGround-Charts"; import PlayGroundPopupModals from "./PlayGround-Popup-Modals"; import PlayGroundTooltips from "./PlayGround-Tooltips"; diff --git a/Server/controllers/monitorController.js b/Server/controllers/monitorController.js index 800ec994c..3cb1711c7 100644 --- a/Server/controllers/monitorController.js +++ b/Server/controllers/monitorController.js @@ -214,6 +214,10 @@ const editMonitor = async (req, res, next) => { try { const editedMonitor = await req.db.editMonitor(req, res); + // Delete the old job(editedMonitor has the same ID as the old monitor) + await req.jobQueue.deleteJob(editedMonitor); + // Add the new job back to the queue + await req.jobQueue.addJob(editedMonitor._id, editedMonitor); return res.status(200).json({ success: true, msg: successMessages.MONITOR_EDIT, diff --git a/Server/db/MongoDB.js b/Server/db/MongoDB.js index 6f090662d..232532ba4 100644 --- a/Server/db/MongoDB.js +++ b/Server/db/MongoDB.js @@ -42,7 +42,9 @@ const insertUser = async (req, res) => { } const newUser = new UserModel(userData); await newUser.save(); - return await UserModel.findOne({ _id: newUser._id }).select("-password"); // .select() doesn't work with create, need to save then find + return await UserModel.findOne({ _id: newUser._id }) + .select("-password") + .select("-profileImage"); // .select() doesn't work with create, need to save then find } catch (error) { if (error.code === DUPLICATE_KEY_CODE) { throw new Error(errorMessages.DB_USER_EXISTS); @@ -66,7 +68,9 @@ const getUserByEmail = async (req, res) => { try { // Need the password to be able to compare, removed .select() // We can strip the hash before returing the user - const user = await UserModel.findOne({ email: req.body.email }); + const user = await UserModel.findOne( + { email: req.body.email }.select("-profileImage") + ); if (user) { return user; } else { @@ -102,7 +106,9 @@ const updateUser = async (req, res) => { candidateUserId, candidateUser, { new: true } // Returns updated user instead of pre-update user - ).select("-password"); + ) + .select("-password") + .select("-profileImage"); return updatedUser; } catch (error) { throw error; @@ -190,7 +196,9 @@ const resetPassword = async (req, res) => { // Fetch the user again without the password const userWithoutPassword = await UserModel.findOne({ email: recoveryToken.email, - }).select("-password"); + }) + .select("-password") + .select("-profileImage"); return userWithoutPassword; } else { throw new Error(errorMessages.DB_USER_NOT_FOUND);