@speakr/speakr-module-services
Version:
SPEAKR Shared Service Module
117 lines (102 loc) • 3.32 kB
JavaScript
;
const speakr = require('@speakr/speakr-module-services');
const db = speakr.db;
const env = require('../../env');
const MassPay = require('node-paypal-masspayments');
const Paypal = require('paypal-nvp-api');
const ipn = require('paypal-ipn');
const moment = require('moment-timezone');
const _ = require('underscore');
process.env.PAYPAL_ENV = process.env.NODE_ENV;
const mp = new MassPay(env.MASSPAY);
const paypal = Paypal(env.PAYPAL);
module.exports = {
credit,
getPaypalBalance,
verify
};
function getPaypalBalance(){
return new Promise((resolve, reject) => {
return paypal.request('GetBalance', {}).then((result) => {
resolve(result);
}).catch((err) => {
reject(err);
});
})
}
function verify(notification) {
console.log(notification);
return new Promise((resolve, reject) => {
if (Object.keys(notification).length == 0) {
reject('Please, provide correct IPN notification.');
} else {
return ipn.verify(notification, {'allow_sandbox': true}, function callback(err, msg) {
if (err) {
console.error(err);
reject(err);
} else {
console.log(msg);
let index = 1;
while (notification[`masspay_txn_id_${index}`] != null) {
let status = notification[`status_${index}`] == 'Completed' ? 'paid' : 'processing';
let paidAt = moment(notification.payment_date, 'HH:mm:ss MMM DD, YYYY z').format();
let id = parseInt(notification[`unique_id_${index}`]);
let transactionId = notification[`masspay_txn_id_${index}`];
db.invoices.update({
paypal_transaction_id: transactionId,
status: status,
paid_at: paidAt
}, {where: {id: id }});
index += 1;
}
resolve(notification);
}
});
}
});
}
function credit(invoices) {
// get filter out the old line items that exist due to editing
invoices = invoices.map(invoice => {
invoice = invoice.dataValues ? invoice.dataValues : invoice;
invoice.line_items = invoice.line_items.map(li => li.dataValues ? li.dataValues: li);
invoice.line_items = _getOnlyCurrentLineItems(invoice.line_items);
return invoice;
});
let batch = new MassPay.PaymentBatch(invoices.map((invoice) => ({
"email": invoice.influencer.paypal_email,
"amount": _totalCost(invoice.line_items),
"uniqueId": invoice.id,
"note": `Speakr just sent you ${_totalCost(invoice.line_items)}. Rock on!`
})));
return new Promise((resolve, reject) => mp.pay(batch, function(err, results) {
if (err) {
console.log('ERROR', err);
reject(err.L_LONGMESSAGE0);
} else {
console.log('SUCCESS', results);
if (results.ACK == 'Success') {
resolve(invoices);
} else {
reject(results.L_LONGMESSAGE0);
}
}}
));
}
function _totalCost(line_items) {
return parseFloat(line_items.reduce((sum, cur) => Number(sum) + Number(cur.amount), 0)).toFixed(2);
}
function _getOnlyCurrentLineItems(line_items) {
const items = line_items.map(li => li.dataValues ? li.dataValues : li)
.map(item => {
item.sortByTime = new Date(item.updated_at).getTime();
return item;
});
const groupedItems = _.groupBy(items, (item) => item.id_hash);
const keyz = Object.keys(groupedItems);
return keyz.map(key => {
const arr = _.sortBy(groupedItems[key], (item) => -item.sortByTime);
const latest = arr.reverse()[0];
return latest;
});
}