diff --git a/dashboard/src/components/app/Backups.vue b/dashboard/src/components/app/Backups.vue index 723618ca7..45f1bb53c 100644 --- a/dashboard/src/components/app/Backups.vue +++ b/dashboard/src/components/app/Backups.vue @@ -50,6 +50,7 @@ const importBusy = ref(false); const autoBackupsEnabled = ref(false); const backups = ref([]); const editDialog = useTemplateRef('editDialog'); +const restoreDialog = useTemplateRef('restoreDialog'); watch(autoBackupsEnabled, async (newValue) => { const [error] = await appsModel.configure(props.app.id, 'automatic_backup', { enable: newValue }); @@ -118,6 +119,27 @@ async function onDownloadConfig(backup) { download(filename, JSON.stringify(tmp, null, 4)); } +const restoreBusy = ref(false); +const restoreBackup = ref({}); + +async function onRestore(backup) { + restoreBusy.value = false; + restoreBackup.value = backup; + restoreDialog.value.open(); +} + +async function onRestoreSubmit() { + restoreBusy.value = true; + + const [error] = await appsModel.restore(props.app.id, restoreBackup.value.id); + if (error) { + restoreBusy.value = false; + return console.error(error); + } + + restoreDialog.value.close(); +} + async function refresh() { const [error, result] = await appsModel.backups(props.app.id); if (error) return console.error(error); @@ -183,6 +205,22 @@ onMounted(async () => { + +
{{ $t('app.backups.backups.description') }}
diff --git a/dashboard/src/models/AppsModel.js b/dashboard/src/models/AppsModel.js index 6c12368a4..6f3bd2878 100644 --- a/dashboard/src/models/AppsModel.js +++ b/dashboard/src/models/AppsModel.js @@ -338,6 +338,17 @@ function create() { if (result.status !== 200) return [result]; return [null]; }, + async restore(id, backupId) { + let result; + try { + result = await fetcher.post(`${origin}/api/v1/apps/${id}/restore`, { backupId }, { access_token: accessToken }); + } catch (e) { + return [e]; + } + + if (result.status !== 202) return [result]; + return [null]; + }, }; }