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);