🐛 Fixed crashing on boot with revoked Stripe keys

no-issue

The refactor of Stripe boot logic missed catching any errors from the
migrations running or the webhooks initialising. This adds try/catches
to the services so that we can log the errors.
This commit is contained in:
Fabien "egg" O'Carroll 2022-01-24 16:38:16 +02:00 committed by Fabien 'egg' O'Carroll
parent bb10fedacd
commit 91df910dbb
3 changed files with 64 additions and 54 deletions

View File

@ -148,7 +148,11 @@ module.exports = {
}
})();
await stripeService.migrations.execute();
try {
await stripeService.migrations.execute();
} catch (err) {
logging.error(err);
}
},
contentGating: require('./content-gating'),

View File

@ -1,53 +1 @@
const _ = require('lodash');
const StripeService = require('@tryghost/members-stripe-service');
const membersService = require('../members');
const config = require('../../../shared/config');
const settings = require('../../../shared/settings-cache');
const urlUtils = require('../../../shared/url-utils');
const events = require('../../lib/common/events');
const models = require('../../models');
const {getConfig} = require('./config');
function configureApi() {
const cfg = getConfig(settings, config, urlUtils);
if (cfg) {
module.exports.configure(cfg);
return true;
}
return false;
}
const debouncedConfigureApi = _.debounce(() => {
configureApi();
}, 600);
module.exports = new StripeService({
membersService,
models: _.pick(models, ['Product', 'StripePrice', 'StripeCustomerSubscription', 'StripeProduct', 'MemberStripeCustomer', 'Offer', 'Settings']),
StripeWebhook: {
async get() {
return {
webhook_id: settings.get('members_stripe_webhook_id'),
secret: settings.get('members_stripe_webhook_secret')
};
},
async save(data) {
await models.Settings.edit([{
key: 'members_stripe_webhook_id',
value: data.webhook_id
}, {
key: 'members_stripe_webhook_secret',
value: data.secret
}]);
}
}
});
module.exports.init = async function init() {
configureApi();
events.on('settings.edited', function (model) {
if (['stripe_publishable_key', 'stripe_secret_key', 'stripe_connect_publishable_key', 'stripe_connect_secret_key'].includes(model.get('key'))) {
debouncedConfigureApi();
}
});
};
module.exports = require('./service');

View File

@ -0,0 +1,58 @@
const _ = require('lodash');
const StripeService = require('@tryghost/members-stripe-service');
const logging = require('@tryghost/logging');
const membersService = require('../members');
const config = require('../../../shared/config');
const settings = require('../../../shared/settings-cache');
const urlUtils = require('../../../shared/url-utils');
const events = require('../../lib/common/events');
const models = require('../../models');
const {getConfig} = require('./config');
async function configureApi() {
const cfg = getConfig(settings, config, urlUtils);
if (cfg) {
await module.exports.configure(cfg);
return true;
}
return false;
}
const debouncedConfigureApi = _.debounce(() => {
configureApi();
}, 600);
module.exports = new StripeService({
membersService,
models: _.pick(models, ['Product', 'StripePrice', 'StripeCustomerSubscription', 'StripeProduct', 'MemberStripeCustomer', 'Offer', 'Settings']),
StripeWebhook: {
async get() {
return {
webhook_id: settings.get('members_stripe_webhook_id'),
secret: settings.get('members_stripe_webhook_secret')
};
},
async save(data) {
await models.Settings.edit([{
key: 'members_stripe_webhook_id',
value: data.webhook_id
}, {
key: 'members_stripe_webhook_secret',
value: data.secret
}]);
}
}
});
module.exports.init = async function init() {
try {
await configureApi();
} catch (err) {
logging.error(err);
}
events.on('settings.edited', function (model) {
if (['stripe_publishable_key', 'stripe_secret_key', 'stripe_connect_publishable_key', 'stripe_connect_secret_key'].includes(model.get('key'))) {
debouncedConfigureApi();
}
});
};