diff --git a/src/appstore.js b/src/appstore.js index 9b6c22166..4a258dee9 100644 --- a/src/appstore.js +++ b/src/appstore.js @@ -95,6 +95,7 @@ function isFreePlan(subscription) { return !subscription || subscription.plan.id === 'free'; } +// See app.js install it will create a db record first but remove it again if appstore purchase fails function purchase(appId, appstoreId, callback) { assert.strictEqual(typeof appId, 'string'); assert.strictEqual(typeof appstoreId, 'string'); @@ -102,41 +103,20 @@ function purchase(appId, appstoreId, callback) { if (appstoreId === '') return callback(null); - function doThePurchase() { - 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)); - if (result.statusCode === 404) return callback(new AppstoreError(AppstoreError.NOT_FOUND)); - if (result.statusCode === 403 || result.statusCode === 401) return callback(new AppstoreError(AppstoreError.BILLING_REQUIRED)); - if (result.statusCode === 402) return callback(new AppstoreError(AppstoreError.BILLING_REQUIRED, result.body.message)); - if (result.statusCode !== 201 && result.statusCode !== 200) return callback(new AppstoreError(AppstoreError.EXTERNAL_ERROR, util.format('App purchase failed. %s %j', result.status, result.body))); - - callback(null); - }); - }); - } - - getSubscription(function (error, result) { + getAppstoreConfig(function (error, appstoreConfig) { if (error) return callback(error); - // only check for app install count if on the free plan - if (result.id !== 'free') return doThePurchase(); + var url = config.apiServerOrigin() + '/api/v1/users/' + appstoreConfig.userId + '/cloudrons/' + appstoreConfig.cloudronId + '/apps/' + appId; + var data = { appstoreId: appstoreId }; - appdb.getAppStoreIds(function (error, result) { - if (error) return callback(new AppstoreError(AppstoreError.INTERNAL_ERROR, error)); + 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)); + if (result.statusCode === 404) return callback(new AppstoreError(AppstoreError.NOT_FOUND)); + if (result.statusCode === 403 || result.statusCode === 401) return callback(new AppstoreError(AppstoreError.BILLING_REQUIRED)); + if (result.statusCode === 402) return callback(new AppstoreError(AppstoreError.BILLING_REQUIRED, result.body.message)); + if (result.statusCode !== 201 && result.statusCode !== 200) return callback(new AppstoreError(AppstoreError.EXTERNAL_ERROR, util.format('App purchase failed. %s %j', result.status, result.body))); - var count = result.filter(function (a) { return !!a.appStoreId; }).length; - - // we only allow max of 2 app installations without a subscription - // WARNING install and clone in apps.js will first add the db record and then call purchase() so we test for more than 2 here - if (count > 2) return callback(new AppstoreError(AppstoreError.BILLING_REQUIRED, 'Too many apps installed')); - - doThePurchase(); + callback(null); }); }); } diff --git a/src/test/appstore-test.js b/src/test/appstore-test.js index a2225ef0f..7510636cc 100644 --- a/src/test/appstore-test.js +++ b/src/test/appstore-test.js @@ -129,14 +129,9 @@ describe('Appstore', function () { .post(`/api/v1/users/${APPSTORE_USER_ID}/cloudrons/${CLOUDRON_ID}/apps/${APP_ID}?accessToken=${APPSTORE_TOKEN}`, function () { return true; }) .reply(201, {}); - var scope2 = nock('http://localhost:6060') - .get(`/api/v1/users/${APPSTORE_USER_ID}/cloudrons/${CLOUDRON_ID}/subscription?accessToken=${APPSTORE_TOKEN}`, function () { return true; }) - .reply(200, { subscription: { id: 'basic' }}); - appstore.purchase(APP_ID, APPSTORE_APP_ID, function (error) { expect(error).to.not.be.ok(); expect(scope1.isDone()).to.be.ok(); - expect(scope2.isDone()).to.be.ok(); done(); });