From 5b453e9e2ac6ba00d0ad7728a850a8ae307ee2c5 Mon Sep 17 00:00:00 2001 From: Juan Cruz Vincenti Date: Tue, 14 Dec 2021 21:56:40 -0300 Subject: [PATCH] Add duplicate check when adding a monitor * Add socket to validate duplicated monitor * Add validation of duplicate name or url when creating * Add spanish and english translation for confirm component * Closes: #378 --- server/server.js | 24 ++++++++++++++++++++++++ src/languages/en.js | 2 ++ src/languages/es-ES.js | 2 ++ src/mixins/socket.js | 4 ++++ src/pages/EditMonitor.vue | 20 +++++++++++++++++++- 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/server/server.js b/server/server.js index 868bbd5ef..e11254df2 100644 --- a/server/server.js +++ b/server/server.js @@ -556,6 +556,30 @@ exports.entryPage = "dashboard"; } }); + // Verify if monitor is duplicated + socket.on("isDuplicatedMonitor", async (monitor, callback) => { + try { + let monitorList = await sendMonitorList(socket); + for (let monitorId in monitorList) { + if (monitorList[monitorId].name === monitor.name) { + throw new Error("duplicatedMonitorNameWarning"); + } + if (monitorList[monitorId].url === monitor.url) { + throw new Error("duplicatedMonitorUrlWarning"); + } + } + callback({ + ok: true, + msg: "No duplicate for this monitor" + }); + } catch (e) { + callback({ + ok: false, + msg: e.message + }); + } + }); + // Edit a monitor socket.on("editMonitor", async (monitor, callback) => { try { diff --git a/src/languages/en.js b/src/languages/en.js index fee80a760..25200a641 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -26,6 +26,8 @@ export default { tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + duplicatedMonitorUrlWarningKey: "The monitor's url is duplicated. Are you sure you want to add it?", + duplicatedMonitorNameWarningKey: "The monitor's name is duplicated. Are you sure you want to add it?", Settings: "Settings", Dashboard: "Dashboard", "New Update": "New Update", diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js index d772db060..b19a6fc14 100644 --- a/src/languages/es-ES.js +++ b/src/languages/es-ES.js @@ -15,6 +15,8 @@ export default { resoverserverDescription: "Cloudflare es el servidor por defecto, puedes cambiar el servidor de resolución en cualquier momento.", rrtypeDescription: "Selecciona el tipo de registro que quieres monitorizar", pauseMonitorMsg: "¿Seguro que quieres pausar?", + duplicatedMonitorUrlWarningKey: "La url del monitor se encuentra duplicada. ¿Deseas agregarlo?", + duplicatedMonitorNameWarningKey: "El nombre del monitor se encuentra duplicado. ¿Deseas agregarlo?", Settings: "Ajustes", Dashboard: "Panel", "New Update": "Nueva actualización", diff --git a/src/mixins/socket.js b/src/mixins/socket.js index affac4f82..0e1c15487 100644 --- a/src/mixins/socket.js +++ b/src/mixins/socket.js @@ -313,6 +313,10 @@ export default { socket.emit("add", monitor, callback); }, + isDuplicatedMonitor(monitor, callback) { + socket.emit("isDuplicatedMonitor", monitor, callback); + }, + deleteMonitor(monitorID, callback) { socket.emit("deleteMonitor", monitorID, callback); }, diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index 4a0d0408b..6a165ae2b 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -2,7 +2,7 @@

{{ pageName }}

-
+
@@ -283,6 +283,12 @@
+ + {{ $t('duplicatedMonitorUrlWarningKey') }} + + + {{ $t('duplicatedMonitorNameWarningKey') }} +
@@ -293,6 +299,7 @@ import NotificationDialog from "../components/NotificationDialog.vue"; import TagsManager from "../components/TagsManager.vue"; import CopyableInput from "../components/CopyableInput.vue"; +import Confirm from "../components/Confirm.vue"; import { useToast } from "vue-toastification"; import VueMultiselect from "vue-multiselect"; @@ -306,6 +313,7 @@ export default { NotificationDialog, TagsManager, VueMultiselect, + Confirm, }, data() { @@ -483,6 +491,16 @@ export default { return true; }, + isDuplicatedMonitor() { + this.$root.isDuplicatedMonitor(this.monitor, async (res) => { + if (res.ok) { + this.submit(); + } else { + this.$refs[res.msg].show(); + } + }); + }, + async submit() { this.processing = true;