diff --git a/client/src/Hooks/monitorHooks.js b/client/src/Hooks/monitorHooks.js index 8df0faa3b..d88132dae 100644 --- a/client/src/Hooks/monitorHooks.js +++ b/client/src/Hooks/monitorHooks.js @@ -411,7 +411,7 @@ const useDeleteAllMonitors = () => { return [deleteAllMonitors, isLoading]; }; -const UseDeleteMonitorStats = () => { +const useDeleteMonitorStats = () => { const { t } = useTranslation(); const [isLoading, setIsLoading] = useState(false); const deleteMonitorStats = async () => { @@ -429,6 +429,29 @@ const UseDeleteMonitorStats = () => { return [deleteMonitorStats, isLoading]; }; +const useCreateBulkMonitors = () => { + const [isLoading, setIsLoading] = useState(false); + + const createBulkMonitors = async (file, user) => { + setIsLoading(true); + + const formData = new FormData(); + formData.append("csvFile", file); + + try { + const response = await networkService.createBulkMonitors(formData); + return [true, response.data, null]; // [success, data, error] + } catch (err) { + const errorMessage = err?.response?.data?.msg || err.message; + return [false, null, errorMessage]; + } finally { + setIsLoading(false); + } + }; + + return [createBulkMonitors, isLoading]; +}; + export { useFetchMonitorsWithSummary, useFetchMonitorsWithChecks, @@ -443,5 +466,6 @@ export { usePauseMonitor, useAddDemoMonitors, useDeleteAllMonitors, - UseDeleteMonitorStats, + useDeleteMonitorStats, + useCreateBulkMonitors, }; diff --git a/client/src/Hooks/useBulkMonitors.js b/client/src/Hooks/useBulkMonitors.js deleted file mode 100644 index ba9086dac..000000000 --- a/client/src/Hooks/useBulkMonitors.js +++ /dev/null @@ -1,25 +0,0 @@ -import { useState } from "react"; -import { networkService } from "../main"; - -export const useBulkMonitors = () => { - const [isLoading, setIsLoading] = useState(false); - - const createBulkMonitors = async (file, user) => { - setIsLoading(true); - - const formData = new FormData(); - formData.append("csvFile", file); - - try { - const response = await networkService.createBulkMonitors(formData); - return [true, response.data, null]; // [success, data, error] - } catch (err) { - const errorMessage = err?.response?.data?.msg || err.message; - return [false, null, errorMessage]; - } finally { - setIsLoading(false); - } - }; - - return [createBulkMonitors, isLoading]; -}; diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx index 11e432e17..e7a50e321 100644 --- a/client/src/Pages/Settings/index.jsx +++ b/client/src/Pages/Settings/index.jsx @@ -23,7 +23,7 @@ import { useIsAdmin } from "../../Hooks/useIsAdmin"; import { useAddDemoMonitors, useDeleteAllMonitors, - UseDeleteMonitorStats, + useDeleteMonitorStats, } from "../../Hooks/monitorHooks"; // Constants const BREADCRUMBS = [{ name: `Settings`, path: "/settings" }]; @@ -45,7 +45,7 @@ const Settings = () => { const [isSaving, saveError, saveSettings] = useSaveSettings(); const [deleteAllMonitors, isDeletingMonitors] = useDeleteAllMonitors(); - const [deleteMonitorStats, isDeletingMonitorStats] = UseDeleteMonitorStats(); + const [deleteMonitorStats, isDeletingMonitorStats] = useDeleteMonitorStats(); // Setup const isAdmin = useIsAdmin(); diff --git a/client/src/Pages/Uptime/BulkImport/index.jsx b/client/src/Pages/Uptime/BulkImport/index.jsx index 99a6d51d8..e7fa75665 100644 --- a/client/src/Pages/Uptime/BulkImport/index.jsx +++ b/client/src/Pages/Uptime/BulkImport/index.jsx @@ -12,7 +12,7 @@ import UploadFile from "./Upload"; import { useSelector } from "react-redux"; import { useNavigate } from "react-router"; import { Trans, useTranslation } from "react-i18next"; -import { useBulkMonitors } from "../../../Hooks/useBulkMonitors"; +import { useCreateBulkMonitors } from "../../../Hooks/monitorHooks"; const BulkImport = () => { const theme = useTheme(); @@ -26,7 +26,7 @@ const BulkImport = () => { { name: t("bulkImport.title"), path: `/uptime/bulk-import` }, ]; - const [createBulkMonitors, hookLoading] = useBulkMonitors(); + const [createBulkMonitors, hookLoading] = useCreateBulkMonitors(); const handleSubmit = async () => { if (!selectedFile) { diff --git a/server/validation/joi.js b/server/validation/joi.js index 60f462280..622cb9148 100755 --- a/server/validation/joi.js +++ b/server/validation/joi.js @@ -186,7 +186,12 @@ const createMonitorBodyValidation = joi.object({ matchMethod: joi.string(), }); -const createMonitorsBodyValidation = joi.array().items(createMonitorBodyValidation); +const createMonitorsBodyValidation = joi.array().items( + createMonitorBodyValidation.keys({ + userId: joi.string().required(), + teamId: joi.string().required(), + }) +); const editMonitorBodyValidation = joi.object({ name: joi.string(),