diff --git a/src/apps.js b/src/apps.js index bdf1c676a..49fc21bb5 100644 --- a/src/apps.js +++ b/src/apps.js @@ -33,6 +33,7 @@ exports = module.exports = { restore, importApp, + exportApp, clone, update, @@ -1549,6 +1550,26 @@ function importApp(app, data, auditSource, callback) { }); } +function exportApp(app, data, auditSource, callback) { + assert.strictEqual(typeof app, 'object'); + assert.strictEqual(typeof callback, 'function'); + + const appId = app.id; + + let error = checkAppState(app, exports.ISTATE_PENDING_BACKUP); + if (error) return callback(error); + + const task = { + args: { snapshotOnly: true }, + values: {} + }; + addTask(appId, exports.ISTATE_PENDING_BACKUP, task, (error, result) => { + if (error) return callback(error); + + callback(null, { taskId: result.taskId }); + }); +} + function purchaseApp(data, callback) { assert.strictEqual(typeof data, 'object'); assert.strictEqual(typeof callback, 'function'); diff --git a/src/apptask.js b/src/apptask.js index 252865989..d8ab607f1 100644 --- a/src/apptask.js +++ b/src/apptask.js @@ -598,7 +598,7 @@ function backup(app, args, progressCallback, callback) { async.series([ progressCallback.bind(null, { percent: 10, message: 'Backing up' }), - backups.backupApp.bind(null, app, { /* options */ }, (progress) => { + backups.backupApp.bind(null, app, { snapshotOnly: !!args.snapshotOnly }, (progress) => { progressCallback({ percent: 30, message: progress.message }); }), diff --git a/src/backups.js b/src/backups.js index bf61f5976..cb5488aa2 100644 --- a/src/backups.js +++ b/src/backups.js @@ -1175,6 +1175,8 @@ function backupApp(app, options, progressCallback, callback) { assert.strictEqual(typeof progressCallback, 'function'); assert.strictEqual(typeof callback, 'function'); + if (options.snapshotOnly) return snapshotApp(app, progressCallback, callback); + const tag = (new Date()).toISOString().replace(/[T.]/g, '-').replace(/[:Z]/g,''); debug(`backupApp - Backing up ${app.fqdn} with tag ${tag}`); diff --git a/src/routes/apps.js b/src/routes/apps.js index 36e22dca8..35b6f0eef 100644 --- a/src/routes/apps.js +++ b/src/routes/apps.js @@ -8,6 +8,7 @@ exports = module.exports = { uninstall, restore, importApp, + exportApp, backup, update, getLogs, @@ -443,6 +444,17 @@ function importApp(req, res, next) { }); } +function exportApp(req, res, next) { + assert.strictEqual(typeof req.body, 'object'); + assert.strictEqual(typeof req.resource, 'object'); + + apps.exportApp(req.resource, {}, auditSource.fromRequest(req), function (error, result) { + if (error) return next(BoxError.toHttpError(error)); + + next(new HttpSuccess(202, { taskId: result.taskId })); + }); +} + function clone(req, res, next) { assert.strictEqual(typeof req.body, 'object'); assert.strictEqual(typeof req.resource, 'object'); diff --git a/src/server.js b/src/server.js index 78f34918d..ba5b07cfa 100644 --- a/src/server.js +++ b/src/server.js @@ -221,6 +221,7 @@ function initializeExpressSync() { router.post('/api/v1/apps/:id/update', json, token, authorizeAdmin, routes.apps.load, routes.apps.update); router.post('/api/v1/apps/:id/restore', json, token, authorizeAdmin, routes.apps.load, routes.apps.restore); router.post('/api/v1/apps/:id/import', json, token, authorizeAdmin, routes.apps.load, routes.apps.importApp); + router.post('/api/v1/apps/:id/export', json, token, authorizeAdmin, routes.apps.load, routes.apps.exportApp); router.post('/api/v1/apps/:id/backup', json, token, authorizeAdmin, routes.apps.load, routes.apps.backup); router.get ('/api/v1/apps/:id/backups', token, authorizeAdmin, routes.apps.load, routes.apps.listBackups); router.post('/api/v1/apps/:id/start', json, token, authorizeAdmin, routes.apps.load, routes.apps.start);