forest-express
Version:
Official package for all Forest Express Lianas
84 lines (83 loc) • 2.79 kB
JavaScript
;
var P = require('bluebird');
var logger = require('../../../services/logger');
var dataUtil = require('../../../utils/data');
function PaymentsGetter(Implementation, params, opts, integrationInfo) {
var stripe = opts.integrations.stripe.stripe(opts.integrations.stripe.apiKey);
var collectionModel = null;
function hasPagination() {
return params.page;
}
function getLimit() {
if (hasPagination()) {
return params.page.size || 10;
}
return 10;
}
function getStartingAfter() {
if (hasPagination() && params.starting_after) {
return params.starting_after;
}
return undefined;
}
function getEndingBefore() {
if (hasPagination() && params.ending_before) {
return params.ending_before;
}
return undefined;
}
function getCharges(query) {
return new P(function (resolve, reject) {
stripe.charges.list(query, function (err, charges) {
if (err) {
return reject(err);
}
return resolve([charges.total_count, charges.data]);
});
});
}
this.perform = function () {
collectionModel = integrationInfo.collection;
var collectionFieldName = integrationInfo.field,
embeddedPath = integrationInfo.embeddedPath;
var fieldName = embeddedPath ? "".concat(collectionFieldName, ".").concat(embeddedPath) : collectionFieldName;
return Implementation.Stripe.getCustomer(collectionModel, collectionFieldName, params.recordId).then(function (customer) {
var query = {
limit: getLimit(),
starting_after: getStartingAfter(),
ending_before: getEndingBefore(),
source: {
object: 'card'
},
'include[]': 'total_count'
};
if (customer && !!customer[collectionFieldName]) {
query.customer = dataUtil.find(customer[collectionFieldName], embeddedPath);
}
if (customer && !query.customer) {
return P.resolve([0, []]);
}
return getCharges(query).spread(function (count, payments) {
return P.map(payments, function (payment) {
if (customer) {
payment.customer = customer;
} else {
return Implementation.Stripe.getCustomerByUserField(collectionModel, fieldName, payment.customer).then(function (customerFound) {
payment.customer = customerFound;
return payment;
});
}
return payment;
}).then(function (paymentsData) {
return [count, paymentsData];
});
})["catch"](function (error) {
logger.warn('Stripe payments retrieval issue: ', error);
return P.resolve([0, []]);
});
}, function () {
return P.resolve([0, []]);
});
};
}
module.exports = PaymentsGetter;