From a76b20c199319079f310b89c820f50389d0df1c8 Mon Sep 17 00:00:00 2001 From: SebClem Date: Tue, 13 Aug 2024 12:02:52 +0200 Subject: [PATCH] Add some error handling --- nextcloud_backup/backend/src/routes/config.ts | 33 ++++++++----------- .../BackupConfig/BackupConfigAutoBackup.vue | 10 +++++- .../BackupConfig/BackupConfigAutoClean.vue | 6 +++- .../components/settings/BackupConfigForm.vue | 11 ++++--- .../frontend/src/composable/ConfigForm.ts | 9 +++-- 5 files changed, 42 insertions(+), 27 deletions(-) diff --git a/nextcloud_backup/backend/src/routes/config.ts b/nextcloud_backup/backend/src/routes/config.ts index 397139c..5135b5b 100644 --- a/nextcloud_backup/backend/src/routes/config.ts +++ b/nextcloud_backup/backend/src/routes/config.ts @@ -22,24 +22,19 @@ configRouter.get("/backup", (req, res) => { configRouter.put("/backup", (req, res) => { validateBackupConfig(req.body as BackupConfig) - .then( - () => { - return saveBackupConfig(req.body as BackupConfig); - }, - (error: ValidationError) => { - res.status(400).json(error.details); + .then(() => { + return saveBackupConfig(req.body as BackupConfig); + }) + .then(() => { + res.status(204).send(); + }) + .catch((error: ValidationError) => { + if (error.details) { + res.status(400).json({ type: "validation", errors: error.details }); + } else { + res.status(400).json({ type: "cron", errors: [error.message] }); } - ) - .then( - () => { - res.status(204).send(); - }, - () => { - res.status(400).json({ - message: "Fail to init cron, please check cron config", - }); - } - ); + }); }); configRouter.get("/webdav", (req, res) => { @@ -58,9 +53,9 @@ configRouter.put("/webdav", (req, res) => { .catch((error: ValidationError) => { res.status(400); if (error.details) { - res.json(error.details); + res.json({ type: "validation", errors: error.details }); } else { - res.json(error); + res.json({ type: "validation", errors: error }); } }); }); diff --git a/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoBackup.vue b/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoBackup.vue index 4419a4f..ac83c9f 100644 --- a/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoBackup.vue +++ b/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoBackup.vue @@ -26,6 +26,14 @@ {{ CronModeFriendly[cron.mode] }} + + INVALID + (); +defineProps<{ loading: boolean, errors: string[] }>(); const backupConfigStore = useBackupConfigStore(); function removeCron(id: string) { diff --git a/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoClean.vue b/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoClean.vue index 35c8b12..9b2af1b 100644 --- a/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoClean.vue +++ b/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoClean.vue @@ -33,6 +33,8 @@ variant="outlined" color="orange" min="1" + :loading="loading" + :error-messages="errors.nbrToKeep" > @@ -66,6 +68,8 @@ variant="outlined" color="orange" min="1" + :loading="loading" + :error-messages="errors.nbrToKeep" > @@ -79,7 +83,7 @@ import { useBackupConfigStore } from "@/store/backupConfig"; import { storeToRefs } from "pinia"; -defineProps<{ loading: boolean }>(); +defineProps<{ loading: boolean, errors: any }>(); const backupConfigStore = useBackupConfigStore(); const { data } = storeToRefs(backupConfigStore); diff --git a/nextcloud_backup/frontend/src/components/settings/BackupConfigForm.vue b/nextcloud_backup/frontend/src/components/settings/BackupConfigForm.vue index d1e4025..da85c38 100644 --- a/nextcloud_backup/frontend/src/components/settings/BackupConfigForm.vue +++ b/nextcloud_backup/frontend/src/components/settings/BackupConfigForm.vue @@ -41,6 +41,8 @@ density="compact" variant="outlined" color="orange" + :loading="loading" + :error-messages="errors.backupType" > @@ -65,12 +67,12 @@ - + - + @@ -105,12 +107,13 @@ const backupConfigStore = useBackupConfigStore(); const { data } = storeToRefs(backupConfigStore); const errors = ref({ nameTemplate: [], - username: [], - password: [], + backupType: [], + nbrToKeep: [], backupDir: [], allowSelfSignedCerts: [], type: [], customEndpoint: [], + cron: [] }); const emit = defineEmits<{ diff --git a/nextcloud_backup/frontend/src/composable/ConfigForm.ts b/nextcloud_backup/frontend/src/composable/ConfigForm.ts index 598c1cf..cce7174 100644 --- a/nextcloud_backup/frontend/src/composable/ConfigForm.ts +++ b/nextcloud_backup/frontend/src/composable/ConfigForm.ts @@ -26,13 +26,18 @@ export function useConfigForm( .catch(async (reason) => { if (reason instanceof HTTPError) { const response = await reason.response.json(); - if (Array.isArray(response)) { - for (const elem of response) { + if (response["type"] == "validation") { + for (const elem of response["errors"]) { errorsRef.value[ elem.context.key as keyof typeof errorsRef.value ] = elem.message; } } + else if (response["type"] == "cron") { + for (const elem of response["errors"]) { + errorsRef.value["cron"].push(elem) + } + } } loading.value = false; emit("fail");