diff --git a/dashboard/src/components/app/Backups.vue b/dashboard/src/components/app/Backups.vue index 108f70ab3..eda6645cf 100644 --- a/dashboard/src/components/app/Backups.vue +++ b/dashboard/src/components/app/Backups.vue @@ -276,7 +276,7 @@ async function refreshBackupList() { onMounted(async () => { autoBackupsEnabled.value = props.app.enableBackup; - const [error, result] = await backupSitesModel.list(); + const [error, result] = await appsModel.listBackupSites(props.app.id); if (error) return console.error(error); backupSites.value = result; diff --git a/dashboard/src/components/app/Location.vue b/dashboard/src/components/app/Location.vue index ab9cb6cee..c9e0999b3 100644 --- a/dashboard/src/components/app/Location.vue +++ b/dashboard/src/components/app/Location.vue @@ -261,6 +261,7 @@ onMounted(async () => {
+
diff --git a/dashboard/src/models/AppsModel.js b/dashboard/src/models/AppsModel.js index 02b2e6a81..d9201c71d 100644 --- a/dashboard/src/models/AppsModel.js +++ b/dashboard/src/models/AppsModel.js @@ -356,6 +356,18 @@ function create() { if (result.status !== 200) return [result]; return [null, result.body.backups]; }, + async listBackupSites(id) { + let result; + try { + result = await fetcher.get(`${API_ORIGIN}/api/v1/apps/${id}/backup_sites`, { access_token: accessToken }); + } catch (e) { + return [e]; + } + + if (result.status !== 200) return [result]; + return [null, result.body.backupSites]; + }, + async backup(id, backupSiteId) { let result; try { diff --git a/src/routes/apps.js b/src/routes/apps.js index 358f7e966..9e337a881 100644 --- a/src/routes/apps.js +++ b/src/routes/apps.js @@ -17,6 +17,7 @@ exports = module.exports = { getLogStream, listEventlog, listBackups, + listBackupSites, repair, setAccessRestriction, @@ -75,6 +76,7 @@ const apps = require('../apps.js'), appstore = require('../appstore.js'), assert = require('node:assert'), AuditSource = require('../auditsource.js'), + backupSites = require('../backupsites.js'), BoxError = require('../boxerror.js'), constants = require('../constants.js'), debug = require('debug')('box:routes/apps'), @@ -918,6 +920,15 @@ async function listBackups(req, res, next) { next(new HttpSuccess(200, { backups: result })); } +async function listBackupSites(req, res, next) { + assert.strictEqual(typeof req.resources.app, 'object'); + + const [error, result] = await safe(backupSites.list()); + if (error) return next(BoxError.toHttpError(error)); + + next(new HttpSuccess(200, { backupSites: result.map(backupSites.removePrivateFields) })); +} + async function updateBackup(req, res, next) { assert.strictEqual(typeof req.resources.app, 'object'); assert.strictEqual(typeof req.params.backupId, 'string'); diff --git a/src/server.js b/src/server.js index 6a891288d..526e1fd9d 100644 --- a/src/server.js +++ b/src/server.js @@ -303,6 +303,7 @@ async function initializeExpressSync() { router.post('/api/v1/apps/:id/export', json, token, routes.apps.load, authorizeOperator, routes.apps.exportApp); router.post('/api/v1/apps/:id/backup', json, token, routes.apps.load, authorizeOperator, routes.apps.backup); router.get ('/api/v1/apps/:id/backups', token, routes.apps.load, authorizeOperator, routes.apps.listBackups); + router.get ('/api/v1/apps/:id/backup_sites', token, routes.apps.load, authorizeOperator, routes.apps.listBackupSites); router.post('/api/v1/apps/:id/backups/:backupId', json, token, routes.apps.load, authorizeOperator, routes.apps.updateBackup); router.get ('/api/v1/apps/:id/backups/:backupId/download', token, routes.apps.load, authorizeOperator, routes.apps.downloadBackup); router.put ('/api/v1/apps/:id/checklist/:key', json, token, routes.apps.load, authorizeOperator, routes.apps.setChecklistItem);