diff --git a/src/apps.js b/src/apps.js index 02578cd6e..d5a18be09 100644 --- a/src/apps.js +++ b/src/apps.js @@ -428,10 +428,13 @@ function unpurchase(appId, appstoreId, callback) { superagent.get(url).query({ accessToken: appstoreConfig.token }).timeout(30 * 1000).end(function (error, result) { if (error && !error.response) return callback(new AppsError(AppsError.EXTERNAL_ERROR, error)); + if (result.statusCode === 403 || result.statusCode === 401) return callback(new AppsError(AppsError.BILLING_REQUIRED)); if (result.statusCode === 404) return callback(null); // was never purchased + if (result.statusCode !== 201 && result.statusCode !== 200) return callback(new AppsError(AppsError.EXTERNAL_ERROR, util.format('App purchase failed. %s %j', result.status, result.body))); superagent.del(url).query({ accessToken: appstoreConfig.token }).timeout(30 * 1000).end(function (error, result) { if (error && !error.response) return callback(new AppsError(AppsError.EXTERNAL_ERROR, error)); + if (result.statusCode === 403 || result.statusCode === 401) return callback(new AppsError(AppsError.BILLING_REQUIRED)); if (result.statusCode !== 204) return callback(new AppsError(AppsError.EXTERNAL_ERROR, util.format('App unpurchase failed. %s %j', result.status, result.body))); callback(null); diff --git a/src/routes/apps.js b/src/routes/apps.js index 7ae71b3bb..7895f1820 100644 --- a/src/routes/apps.js +++ b/src/routes/apps.js @@ -249,6 +249,7 @@ function uninstallApp(req, res, next) { debug('Uninstalling app id:%s', req.params.id); apps.uninstall(req.params.id, auditSource(req), function (error) { + if (error && error.reason === AppsError.BILLING_REQUIRED) return next(new HttpError(402, 'Billing required')); if (error && error.reason === AppsError.NOT_FOUND) return next(new HttpError(404, 'No such app')); if (error) return next(new HttpError(500, error)); diff --git a/webadmin/src/views/apps.js b/webadmin/src/views/apps.js index 3d34b0dc6..bbf10003f 100644 --- a/webadmin/src/views/apps.js +++ b/webadmin/src/views/apps.js @@ -353,6 +353,8 @@ angular.module('Application').controller('AppsController', ['$scope', '$location $scope.appUninstall.error.password = true; $scope.appUninstallForm.password.$setPristine(); $('#appUninstallPasswordInput').focus(); + } else if (error && error.statusCode === 402) { // unpurchase failed + Client.error('Relogin to Cloudron App Store'); } else if (error) { Client.error(error); } else {