Skip to content

Commit

Permalink
Achalhii/dev 6251/add services error handler (#292)
Browse files Browse the repository at this point in the history
* Revert "Revert "feat: add error handler for services""

This reverts commit acaef20.

* Revert "Revert "improvement: change the default error handler of billing""

This reverts commit 305611b.

* fix: add express error handler for campsi services

* fix: add express error handler for campsi services
  • Loading branch information
Achalhii committed May 15, 2024
1 parent e73d6a6 commit dfef054
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 30 deletions.
5 changes: 5 additions & 0 deletions lib/service.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ class CampsiService {
this.config = config;
this.options = config.options;
this.router = Router();
this.errorHandler = (err, req, res, next) => {
req.campsi.logger.error(err, `[${this.constructor.name}] ${err.message}`);
next(err);
};
return this;
}

Expand All @@ -38,6 +42,7 @@ class CampsiService {
* @returns {Promise} Return a promise, resolved when service initialization is done
*/
initialize() {
this.router.use(this.errorHandler);
return new Promise(resolve => resolve());
}

Expand Down
64 changes: 34 additions & 30 deletions services/stripe-billing/lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,15 @@ module.exports = class StripeBillingService extends CampsiService {

this.router.all('*', validateRequestAccess);

const defaultHandler = (res) => (err, obj) => {
const defaultHandler = (req, res, next) => (err, obj) => {
if (err) {
helpers.error(res, err);
console.error(err);
this.server.logger.error(err);
if (this.errorHandler) {
this.errorHandler(err, req, res, next);
} else {
helpers.error(res, err);
console.error(err);
this.server.logger.error(err);
}
} else {
helpers.json(res, obj);
}
Expand All @@ -96,7 +100,7 @@ module.exports = class StripeBillingService extends CampsiService {
this.checkEmailValidity(req.body?.email);
const params = bodyToCustomer(req.body, 'source', req.user);
const idempotencyKey = this.createIdempotencyKey(params, 'customers.create');
stripe.customers.create(params, { idempotencyKey }, defaultHandler(res));
stripe.customers.create(params, { idempotencyKey }, defaultHandler(req, res));
}
catch (ex) {
res.status(400).json(ex);
Expand All @@ -105,13 +109,13 @@ module.exports = class StripeBillingService extends CampsiService {

this.router.get('/customers/:id', (req, res) => {
req.query.expand = buildExpandFromQuery(req.query, customerExpand);
stripe.customers.retrieve(req.params.id, optionsFromQuery(req.query), defaultHandler(res));
stripe.customers.retrieve(req.params.id, optionsFromQuery(req.query), defaultHandler(req, res));
});

this.router.put('/customers/:id', (req, res) => {
try {
this.checkEmailValidity(req?.body.email);
stripe.customers.update(req.params.id, bodyToCustomer(req.body, 'default_source'), defaultHandler(res));
stripe.customers.update(req.params.id, bodyToCustomer(req.body, 'default_source'), defaultHandler(req, res));
}
catch(err) {
res.status(400).json(err);
Expand All @@ -120,31 +124,31 @@ module.exports = class StripeBillingService extends CampsiService {

this.router.patch('/customers/:id', (req, res) => {
req.body.expand = buildExpandFromBody(req.body, customerExpand);
stripe.customers.update(req.params.id, req.body, defaultHandler(res));
stripe.customers.update(req.params.id, req.body, defaultHandler(req, res));
});

this.router.delete('/customers/:id', (req, res) => {
stripe.customers.del(req.params.id, defaultHandler(res));
stripe.customers.del(req.params.id, defaultHandler(req, res));
});

this.router.get('/customers/:customer/invoices', (req, res) => {
stripe.invoices.list(Object.assign({ customer: req.params.customer }, optionsFromQuery(req.query)), defaultHandler(res));
stripe.invoices.list(Object.assign({ customer: req.params.customer }, optionsFromQuery(req.query)), defaultHandler(req, res));
});

this.router.post('/customers/:customer/tax_ids', (req, res) => {
stripe.customers.createTaxId(req.params.customer, { type: req.body.type, value: req.body.value }, defaultHandler(res));
stripe.customers.createTaxId(req.params.customer, { type: req.body.type, value: req.body.value }, defaultHandler(req, res));
});

this.router.post('/customers/:customer/sources', (req, res) => {
stripe.customers.createSource(req.params.customer, { source: req.body.source }, defaultHandler(res));
stripe.customers.createSource(req.params.customer, { source: req.body.source }, defaultHandler(req, res));
});

this.router.delete('/customers/:customer/sources/:id', (req, res) => {
stripe.customers.deleteSource(req.params.customer, req.params.id, defaultHandler(res));
stripe.customers.deleteSource(req.params.customer, req.params.id, defaultHandler(req, res));
});

this.router.delete('/customers/:customer/tax_ids/:id', (req, res) => {
stripe.customers.deleteTaxId(req.params.customer, req.params.id, defaultHandler(res));
stripe.customers.deleteTaxId(req.params.customer, req.params.id, defaultHandler(req, res));
});

this.router.post('/subscriptions', (req, res) => {
Expand All @@ -163,7 +167,7 @@ module.exports = class StripeBillingService extends CampsiService {
params.currency = req.body.currency;
}
const idempotencyKey = this.createIdempotencyKey(params, 'subscriptions.create');
stripe.subscriptions.create(params, { idempotencyKey }, defaultHandler(res)
stripe.subscriptions.create(params, { idempotencyKey }, defaultHandler(req, res)
);
});

Expand All @@ -180,15 +184,15 @@ module.exports = class StripeBillingService extends CampsiService {

this.router.get('/subscriptions/:id', (req, res) => {
req.query.expand = buildExpandFromQuery(req.query, subscriptionExpand);
stripe.subscriptions.retrieve(req.params.id, optionsFromQuery(req.query), defaultHandler(res));
stripe.subscriptions.retrieve(req.params.id, optionsFromQuery(req.query), defaultHandler(req, res));
});

this.router.delete('/subscriptions/:id', (req, res) => {
const params = {};
if (req.body.invoice_now) {
params.invoice_now = req.body.invoice_now;
}
stripe.subscriptions.del(req.params.id, params, defaultHandler(res));
stripe.subscriptions.del(req.params.id, params, defaultHandler(req, res));
});

this.router.put('/subscriptions/:id', (req, res) => {
Expand All @@ -204,25 +208,25 @@ module.exports = class StripeBillingService extends CampsiService {
default_tax_rates: req.body.default_tax_rates,
default_source: req.body.default_source
},
defaultHandler(res)
defaultHandler(req, res)
);
});

this.router.patch('/subscriptions/:id', (req, res) => {
req.body.expand = buildExpandFromBody(req.body, subscriptionExpand);
stripe.subscriptions.update(req.params.id, req.body, defaultHandler(res));
stripe.subscriptions.update(req.params.id, req.body, defaultHandler(req, res));
});

this.router.get('/sources/:id', (req, res) => {
stripe.sources.retrieve(req.params.id, optionsFromQuery(req.query), defaultHandler(res));
stripe.sources.retrieve(req.params.id, optionsFromQuery(req.query), defaultHandler(req, res));
});

this.router.get('/invoices/:id', (req, res) => {
stripe.invoices.retrieve(req.params.id, optionsFromQuery(req.query), defaultHandler(res));
stripe.invoices.retrieve(req.params.id, optionsFromQuery(req.query), defaultHandler(req, res));
});

this.router.get('/subscription-schedules/:id', (req, res) => {
stripe.subscriptionSchedules.retrieve(req.params.id, optionsFromQuery(req.query), defaultHandler(res));
stripe.subscriptionSchedules.retrieve(req.params.id, optionsFromQuery(req.query), defaultHandler(req, res));
});

this.router.post('/subscription-schedules', (req, res) => {
Expand All @@ -237,7 +241,7 @@ module.exports = class StripeBillingService extends CampsiService {
expand: buildExpandFromBody(req.body)
};
const idempotencyKey = this.createIdempotencyKey(params, 'subscriptionSchedules.create');
stripe.subscriptionSchedules.create(params, { idempotencyKey }, defaultHandler(res));
stripe.subscriptionSchedules.create(params, { idempotencyKey }, defaultHandler(req, res));
});

this.router.put('/subscription-schedules/:id', (req, res) => {
Expand All @@ -251,7 +255,7 @@ module.exports = class StripeBillingService extends CampsiService {
end_behavior: req.body.end_behavior,
expand: buildExpandFromBody(req.body)
},
defaultHandler(res)
defaultHandler(req, res)
);
});

Expand Down Expand Up @@ -297,7 +301,7 @@ module.exports = class StripeBillingService extends CampsiService {
stripe.subscriptionSchedules.release(
req.params.id,
{ preserve_cancel_date: req.body.preserve_cancel_date },
defaultHandler(res)
defaultHandler(req, res)
);
});

Expand All @@ -310,17 +314,17 @@ module.exports = class StripeBillingService extends CampsiService {
metadata: req.body.metadata
};
const idempotencyKey = this.createIdempotencyKey(params, 'setupIntents.create');
stripe.setupIntents.create(params, { idempotencyKey }, defaultHandler(res)
stripe.setupIntents.create(params, { idempotencyKey }, defaultHandler(req, res)
);
});

this.router.get('/coupons/:code[:]check-validity', this.checkCouponCodeValidity);

this.router.get('/payment_intents/:id', (req, res) => {
stripe.paymentIntents.retrieve(req.params.id, optionsFromQuery(req.query), defaultHandler(res));
stripe.paymentIntents.retrieve(req.params.id, optionsFromQuery(req.query), defaultHandler(req, res));
});
this.router.post('/payment_intents/:id[:]confirm', (req, res) => {
stripe.paymentIntents.confirm(req.params.id, defaultHandler(res));
stripe.paymentIntents.confirm(req.params.id, defaultHandler(req, res));
});
this.router.post('/payment_intents', (req, res) => {
const params = {
Expand All @@ -335,7 +339,7 @@ module.exports = class StripeBillingService extends CampsiService {
params.payment_method = req.body.payment_method;
}
const idempotencyKey = this.createIdempotencyKey(params, 'paymentIntents.create');
stripe.paymentIntents.create(params,{ idempotencyKey }, defaultHandler(res));
stripe.paymentIntents.create(params,{ idempotencyKey }, defaultHandler(req, res));
});
this.router.patch('/payment_intents/:id', (req, res) => {
const payload = {
Expand All @@ -347,7 +351,7 @@ module.exports = class StripeBillingService extends CampsiService {
if (req.body.metadata) {
payload.metadata = req.body.metadata;
}
stripe.paymentIntents.update(req.params.id, payload, defaultHandler(res));
stripe.paymentIntents.update(req.params.id, payload, defaultHandler(req, res));
});

return super.initialize();
Expand Down

0 comments on commit dfef054

Please sign in to comment.