diff --git a/src/apps.js b/src/apps.js index c3845a33e..2d5cc4121 100644 --- a/src/apps.js +++ b/src/apps.js @@ -622,7 +622,7 @@ function install(data, user, auditSource, callback) { if (error && error.reason === DatabaseError.NOT_FOUND) return callback(new AppsError(AppsError.NOT_FOUND, error.message)); if (error) return callback(new AppsError(AppsError.INTERNAL_ERROR, error)); - appstore.purchase(appId, appStoreId, function (appstoreError) { + appstore.purchase(appId, { appStoreId: appStoreId, manifestId: manifest.id }, function (appstoreError) { // if purchase failed, rollback the appdb record if (appstoreError) { appdb.del(appId, function (error) { @@ -1031,7 +1031,7 @@ function clone(appId, data, user, auditSource, callback) { if (error && error.reason === DatabaseError.ALREADY_EXISTS) return callback(getDuplicateErrorDetails(location, portBindings, error)); if (error) return callback(new AppsError(AppsError.INTERNAL_ERROR, error)); - appstore.purchase(newAppId, app.appStoreId, function (appstoreError) { + appstore.purchase(newAppId, { appstoreId: app.appStoreId, manifestId: manifest.id }, function (appstoreError) { // if purchase failed, rollback the appdb record if (appstoreError) { appdb.del(newAppId, function (error) { @@ -1074,7 +1074,7 @@ function uninstall(appId, auditSource, callback) { get(appId, function (error, app) { if (error) return callback(error); - appstore.unpurchase(appId, app.appStoreId, function (error) { + appstore.unpurchase(appId, { appStoreId: app.appStoreId, manifestId: app.manifest.id }, function (error) { if (error && error.reason === AppstoreError.NOT_FOUND) return callback(new AppsError(AppsError.NOT_FOUND)); if (error && error.reason === AppstoreError.BILLING_REQUIRED) return callback(new AppsError(AppsError.BILLING_REQUIRED, error.message)); if (error && error.reason === AppstoreError.EXTERNAL_ERROR) return callback(new AppsError(AppsError.EXTERNAL_ERROR, error.message)); diff --git a/src/appstore.js b/src/appstore.js index 4a258dee9..77dab9124 100644 --- a/src/appstore.js +++ b/src/appstore.js @@ -19,8 +19,7 @@ exports = module.exports = { AppstoreError: AppstoreError }; -var appdb = require('./appdb.js'), - apps = require('./apps.js'), +var apps = require('./apps.js'), assert = require('assert'), async = require('async'), config = require('./config.js'), @@ -96,18 +95,16 @@ function isFreePlan(subscription) { } // See app.js install it will create a db record first but remove it again if appstore purchase fails -function purchase(appId, appstoreId, callback) { +function purchase(appId, data, callback) { assert.strictEqual(typeof appId, 'string'); - assert.strictEqual(typeof appstoreId, 'string'); + assert.strictEqual(typeof data, 'object'); + assert(data.appStoreId || data.manifestId); assert.strictEqual(typeof callback, 'function'); - if (appstoreId === '') return callback(null); - getAppstoreConfig(function (error, appstoreConfig) { if (error) return callback(error); var url = config.apiServerOrigin() + '/api/v1/users/' + appstoreConfig.userId + '/cloudrons/' + appstoreConfig.cloudronId + '/apps/' + appId; - var data = { appstoreId: appstoreId }; superagent.post(url).send(data).query({ accessToken: appstoreConfig.token }).timeout(30 * 1000).end(function (error, result) { if (error && !error.response) return callback(new AppstoreError(AppstoreError.EXTERNAL_ERROR, error.message)); @@ -121,13 +118,12 @@ function purchase(appId, appstoreId, callback) { }); } -function unpurchase(appId, appstoreId, callback) { +function unpurchase(appId, data, callback) { assert.strictEqual(typeof appId, 'string'); - assert.strictEqual(typeof appstoreId, 'string'); + assert.strictEqual(typeof data, 'object'); + assert(data.appStoreId || data.manifestId); assert.strictEqual(typeof callback, 'function'); - if (appstoreId === '') return callback(null); - getAppstoreConfig(function (error, appstoreConfig) { if (error) return callback(error); @@ -139,7 +135,7 @@ function unpurchase(appId, appstoreId, callback) { if (result.statusCode === 404) return callback(null); // was never purchased if (result.statusCode !== 201 && result.statusCode !== 200) return callback(new AppstoreError(AppstoreError.EXTERNAL_ERROR, util.format('App unpurchase failed. %s %j', result.status, result.body))); - superagent.del(url).query({ accessToken: appstoreConfig.token }).timeout(30 * 1000).end(function (error, result) { + superagent.del(url).send(data).query({ accessToken: appstoreConfig.token }).timeout(30 * 1000).end(function (error, result) { if (error && !error.response) return callback(new AppstoreError(AppstoreError.EXTERNAL_ERROR, error)); if (result.statusCode === 403 || result.statusCode === 401) return callback(new AppstoreError(AppstoreError.BILLING_REQUIRED)); if (result.statusCode !== 204) return callback(new AppstoreError(AppstoreError.EXTERNAL_ERROR, util.format('App unpurchase failed. %s %j', result.status, result.body))); diff --git a/src/test/appstore-test.js b/src/test/appstore-test.js index 7510636cc..ab151d8ac 100644 --- a/src/test/appstore-test.js +++ b/src/test/appstore-test.js @@ -129,7 +129,7 @@ describe('Appstore', function () { .post(`/api/v1/users/${APPSTORE_USER_ID}/cloudrons/${CLOUDRON_ID}/apps/${APP_ID}?accessToken=${APPSTORE_TOKEN}`, function () { return true; }) .reply(201, {}); - appstore.purchase(APP_ID, APPSTORE_APP_ID, function (error) { + appstore.purchase(APP_ID, { appStoreId: APPSTORE_APP_ID, manifestId: APPSTORE_APP_ID }, function (error) { expect(error).to.not.be.ok(); expect(scope1.isDone()).to.be.ok(); @@ -146,7 +146,7 @@ describe('Appstore', function () { .delete(`/api/v1/users/${APPSTORE_USER_ID}/cloudrons/${CLOUDRON_ID}/apps/${APP_ID}?accessToken=${APPSTORE_TOKEN}`, function () { return true; }) .reply(204, {}); - appstore.unpurchase(APP_ID, APPSTORE_APP_ID, function (error) { + appstore.unpurchase(APP_ID, { appStoreId: APPSTORE_APP_ID, manifestId: APPSTORE_APP_ID }, function (error) { expect(error).to.not.be.ok(); expect(scope1.isDone()).to.be.ok(); expect(scope2.isDone()).to.not.be.ok(); @@ -164,7 +164,7 @@ describe('Appstore', function () { .delete(`/api/v1/users/${APPSTORE_USER_ID}/cloudrons/${CLOUDRON_ID}/apps/${APP_ID}?accessToken=${APPSTORE_TOKEN}`, function () { return true; }) .reply(204, {}); - appstore.unpurchase(APP_ID, APPSTORE_APP_ID, function (error) { + appstore.unpurchase(APP_ID, { appStoreId: APPSTORE_APP_ID, manifestId: APPSTORE_APP_ID }, function (error) { expect(error).to.not.be.ok(); expect(scope1.isDone()).to.be.ok(); expect(scope2.isDone()).to.be.ok();