From 4b621a228f217f49c6e70db4efb15b41b40bdaf8 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 13 Jun 2025 14:54:59 +0800 Subject: [PATCH] remove monitors from status page on delete --- client/src/Components/Fallback/index.jsx | 2 +- .../TextLink/index.jsx} | 0 .../{useFetchSettings.js => settingsHooks.js} | 0 client/src/Pages/Auth/Login/index.jsx | 2 +- client/src/Pages/Settings/index.jsx | 2 +- client/src/Pages/StatusPage/Status/index.jsx | 22 +++++++++++++++++++ client/src/Pages/Uptime/Create/index.jsx | 3 +-- server/db/models/Monitor.js | 4 ++++ server/db/mongo/modules/monitorModule.js | 2 ++ server/db/mongo/modules/statusPageModule.js | 19 ++++++++++++---- 10 files changed, 47 insertions(+), 9 deletions(-) rename client/src/{Pages/Auth/components/TextLink.jsx => Components/TextLink/index.jsx} (100%) rename client/src/Hooks/{useFetchSettings.js => settingsHooks.js} (100%) diff --git a/client/src/Components/Fallback/index.jsx b/client/src/Components/Fallback/index.jsx index b00ddbecc..47497ba02 100644 --- a/client/src/Components/Fallback/index.jsx +++ b/client/src/Components/Fallback/index.jsx @@ -11,7 +11,7 @@ import { useSelector } from "react-redux"; import Alert from "../Alert"; import { useTranslation } from "react-i18next"; import "./index.css"; -import { useFetchSettings } from "../../Hooks/useFetchSettings"; +import { useFetchSettings } from "../../Hooks/settingsHooks"; import { useState } from "react"; /** * Fallback component to display a fallback UI with a title, a list of checks, and a navigation button. diff --git a/client/src/Pages/Auth/components/TextLink.jsx b/client/src/Components/TextLink/index.jsx similarity index 100% rename from client/src/Pages/Auth/components/TextLink.jsx rename to client/src/Components/TextLink/index.jsx diff --git a/client/src/Hooks/useFetchSettings.js b/client/src/Hooks/settingsHooks.js similarity index 100% rename from client/src/Hooks/useFetchSettings.js rename to client/src/Hooks/settingsHooks.js diff --git a/client/src/Pages/Auth/Login/index.jsx b/client/src/Pages/Auth/Login/index.jsx index a969706e7..098fbbf08 100644 --- a/client/src/Pages/Auth/Login/index.jsx +++ b/client/src/Pages/Auth/Login/index.jsx @@ -5,7 +5,7 @@ import Button from "@mui/material/Button"; import TextInput from "../../../Components/Inputs/TextInput"; import { PasswordEndAdornment } from "../../../Components/Inputs/TextInput/Adornments"; import { loginCredentials } from "../../../Validation/validation"; -import TextLink from "../components/TextLink"; +import TextLink from "../../../Components/TextLink"; import Typography from "@mui/material/Typography"; // Utils diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx index e7a50e321..a3cd88fca 100644 --- a/client/src/Pages/Settings/index.jsx +++ b/client/src/Pages/Settings/index.jsx @@ -18,7 +18,7 @@ import { useSelector, useDispatch } from "react-redux"; import { setTimezone, setMode, setLanguage, setShowURL } from "../../Features/UI/uiSlice"; import SettingsStats from "./SettingsStats"; -import { useFetchSettings, useSaveSettings } from "../../Hooks/useFetchSettings"; +import { useFetchSettings, useSaveSettings } from "../../Hooks/settingsHooks"; import { useIsAdmin } from "../../Hooks/useIsAdmin"; import { useAddDemoMonitors, diff --git a/client/src/Pages/StatusPage/Status/index.jsx b/client/src/Pages/StatusPage/Status/index.jsx index ee1ec436c..727daeeb1 100644 --- a/client/src/Pages/StatusPage/Status/index.jsx +++ b/client/src/Pages/StatusPage/Status/index.jsx @@ -8,6 +8,7 @@ import StatusBar from "./Components/StatusBar"; import MonitorsList from "./Components/MonitorsList"; import Dialog from "../../../Components/Dialog"; import Breadcrumbs from "../../../Components/Breadcrumbs/index.jsx"; +import TextLink from "../../../Components/TextLink"; // Utils import { useStatusPageFetch } from "./Hooks/useStatusPageFetch"; @@ -30,6 +31,7 @@ const PublicStatus = () => { const { t } = useTranslation(); const location = useLocation(); const navigate = useNavigate(); + const isAdmin = useIsAdmin(); const [statusPage, monitors, isLoading, networkError, fetchStatusPage] = useStatusPageFetch(false, url); @@ -60,6 +62,26 @@ const PublicStatus = () => { return ; } + if (monitors.length === 0) { + return ( + + + {"Theres nothing here yet"} + + {isAdmin && ( + + )} + + ); + } + // Error fetching data if (networkError === true) { return ( diff --git a/client/src/Pages/Uptime/Create/index.jsx b/client/src/Pages/Uptime/Create/index.jsx index e2d51153c..6527334ab 100644 --- a/client/src/Pages/Uptime/Create/index.jsx +++ b/client/src/Pages/Uptime/Create/index.jsx @@ -142,8 +142,7 @@ const CreateMonitor = () => { notifications: monitor.notifications, }; - console.log(JSON.stringify(form, null, 2)); - // await createMonitor({ monitor: form, redirect: "/uptime" }); + await createMonitor({ monitor: form, redirect: "/uptime" }); }; const onChange = (event) => { diff --git a/server/db/models/Monitor.js b/server/db/models/Monitor.js index 26a79b815..7bb38f520 100755 --- a/server/db/models/Monitor.js +++ b/server/db/models/Monitor.js @@ -3,6 +3,7 @@ import HardwareCheck from "./HardwareCheck.js"; import PageSpeedCheck from "./PageSpeedCheck.js"; import Check from "./Check.js"; import MonitorStats from "./MonitorStats.js"; +import StatusPage from "./StatusPage.js"; const MonitorSchema = mongoose.Schema( { @@ -105,6 +106,9 @@ MonitorSchema.pre("findOneAndDelete", async function (next) { await Check.deleteMany({ monitorId: doc._id }); } + // Deal with status pages + await StatusPage.updateMany({ monitors: doc._id }, { $pull: { monitors: doc._id } }); + await MonitorStats.deleteMany({ monitorId: doc._id.toString() }); next(); } catch (error) { diff --git a/server/db/mongo/modules/monitorModule.js b/server/db/mongo/modules/monitorModule.js index 6c03dcd4c..32ed8b146 100755 --- a/server/db/mongo/modules/monitorModule.js +++ b/server/db/mongo/modules/monitorModule.js @@ -710,9 +710,11 @@ const deleteMonitor = async ({ monitorId }) => { const stringService = ServiceRegistry.get(StringService.SERVICE_NAME); try { const monitor = await Monitor.findByIdAndDelete(monitorId); + if (!monitor) { throw new Error(stringService.getDbFindMonitorById(monitorId)); } + return monitor; } catch (error) { error.service = SERVICE_NAME; diff --git a/server/db/mongo/modules/statusPageModule.js b/server/db/mongo/modules/statusPageModule.js index b2f7ef7d6..d6331fcf8 100755 --- a/server/db/mongo/modules/statusPageModule.js +++ b/server/db/mongo/modules/statusPageModule.js @@ -106,7 +106,10 @@ const getStatusPage = async (url) => { }, }, { - $unwind: "$monitors", + $unwind: { + path: "$monitors", + preserveNullAndEmptyArrays: true, + }, }, { $lookup: { @@ -153,9 +156,17 @@ const getStatusPage = async (url) => { url: 1, }, monitors: { - $sortArray: { - input: "$monitors", - sortBy: { orderIndex: 1 }, + $filter: { + input: { + $sortArray: { + input: "$monitors", + sortBy: { orderIndex: 1 }, + }, + }, + as: "monitor", + cond: { + $ne: ["$$monitor.orderIndex", -1], + }, }, }, },