forest-express
Version:
Official package for all Forest Express Lianas
82 lines (81 loc) • 2.77 kB
JavaScript
;
var P = require('bluebird');
var logger = require('../../../services/logger');
var dataUtil = require('../../../utils/data');
function SourcesGetter(Implementation, params, opts, integrationInfo) {
var stripe = opts.integrations.stripe.stripe(opts.integrations.stripe.apiKey);
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 getSources(customerId, query) {
return new P(function (resolve, reject) {
stripe.customers.listSources(customerId, query, function (error, sources) {
if (error) {
return reject(error);
}
return resolve([sources.total_count, sources.data]);
});
});
}
this.perform = function () {
var collectionModel = integrationInfo.collection,
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(),
'include[]': 'total_count',
object: params.object
};
var customerId;
if (customer[collectionFieldName]) {
customerId = dataUtil.find(customer[collectionFieldName], embeddedPath);
}
if (customer && !customerId) {
return P.resolve([0, []]);
}
return getSources(customerId, query).spread(function (count, sources) {
return P.map(sources, function (source) {
if (customer) {
source.customer = customer;
} else {
return Implementation.Stripe.getCustomerByUserField(collectionModel, fieldName, source.customer).then(function (customerFound) {
source.customer = customerFound;
return source;
});
}
return source;
}).then(function (sourcesData) {
return [count, sourcesData];
});
})["catch"](function (error) {
logger.warn('Stripe sources retrieval issue: ', error);
return P.resolve([0, []]);
});
}, function () {
return P.resolve([0, []]);
});
};
}
module.exports = SourcesGetter;