diff --git a/src/apps.js b/src/apps.js index d9c5dbee8..59f302611 100644 --- a/src/apps.js +++ b/src/apps.js @@ -385,6 +385,33 @@ function purchase(appId, appstoreId, callback) { }); } +function unpurchase(appId, callback) { + assert.strictEqual(typeof appId, 'string'); + assert.strictEqual(typeof callback, 'function'); + + // Skip for caas at the moment + if (config.provider() === 'caas') return callback(null); + + settings.getAppstoreConfig(function (error, result) { + if (error) return callback(new AppsError(AppsError.INTERNAL_ERROR, error)); + if (!result.token) return callback(new AppsError(AppsError.BILLING_REQUIRED)); + + var url = config.apiServerOrigin() + '/api/v1/users/' + result.userId + '/cloudrons/' + result.cloudronId + '/apps/' + appId; + + superagent.get(url).query({ accessToken: result.token }).end(function (error, result) { + if (error && !error.response) return callback(new AppsError(AppsError.EXTERNAL_ERROR, error)); + if (result.statusCode === 404) return callback(null); // was never purchased + + superagent.del(url).query({ accessToken: result.token }).end(function (error, result) { + if (error && !error.response) return callback(new AppsError(AppsError.EXTERNAL_ERROR, error)); + if (result.statusCode !== 204) return callback(new AppsError(AppsError.EXTERNAL_ERROR, util.format('App unpurchase failed. %s %j', result.status, result.body))); + + callback(null); + }); + }); + }); +} + function downloadManifest(appStoreId, manifest, callback) { if (!appStoreId && !manifest) return callback(new AppsError(AppsError.BAD_FIELD, 'Neither manifest nor appStoreId provided')); @@ -820,14 +847,18 @@ function uninstall(appId, auditSource, callback) { debug('Will uninstall app with id:%s', appId); - taskmanager.stopAppTask(appId, function () { - appdb.setInstallationCommand(appId, appdb.ISTATE_PENDING_UNINSTALL, function (error) { - if (error && error.reason === DatabaseError.NOT_FOUND) return callback(new AppsError(AppsError.NOT_FOUND, 'No such app')); - if (error) return callback(new AppsError(AppsError.INTERNAL_ERROR, error)); + unpurchase(appId, function (error) { + if (error) return callback(error); - eventlog.add(eventlog.ACTION_APP_UNINSTALL, auditSource, { appId: appId }); + taskmanager.stopAppTask(appId, function () { + appdb.setInstallationCommand(appId, appdb.ISTATE_PENDING_UNINSTALL, function (error) { + if (error && error.reason === DatabaseError.NOT_FOUND) return callback(new AppsError(AppsError.NOT_FOUND, 'No such app')); + if (error) return callback(new AppsError(AppsError.INTERNAL_ERROR, error)); - taskmanager.startAppTask(appId, callback); + eventlog.add(eventlog.ACTION_APP_UNINSTALL, auditSource, { appId: appId }); + + taskmanager.startAppTask(appId, callback); + }); }); }); }