2019-09-07 21:31:32 +00:00
|
|
|
var request = require('request-promise');
|
2021-06-20 20:27:08 +00:00
|
|
|
var common = require('../../routes/common');
|
2021-02-21 19:02:31 +00:00
|
|
|
var logger = require('../shared/logger');
|
2019-09-07 21:31:32 +00:00
|
|
|
var options = {};
|
|
|
|
|
2020-08-22 20:07:21 +00:00
|
|
|
function paymentReducer(accumulator, currentPayment) {
|
2020-08-19 23:39:55 +00:00
|
|
|
let currPayHash = currentPayment.payment_hash;
|
2020-08-22 20:07:21 +00:00
|
|
|
if (!currentPayment.partid) { currentPayment.partid = 0; }
|
2020-08-19 23:39:55 +00:00
|
|
|
if(!accumulator[currPayHash]) {
|
|
|
|
accumulator[currPayHash] = [currentPayment];
|
|
|
|
} else {
|
|
|
|
accumulator[currPayHash].push(currentPayment);
|
|
|
|
}
|
|
|
|
return accumulator;
|
|
|
|
}
|
|
|
|
|
2020-08-22 20:07:21 +00:00
|
|
|
function summaryReducer(accumulator, mpp) {
|
|
|
|
if (mpp.status === 'complete') {
|
|
|
|
accumulator.msatoshi = accumulator.msatoshi + mpp.msatoshi;
|
|
|
|
accumulator.msatoshi_sent = accumulator.msatoshi_sent + mpp.msatoshi_sent;
|
|
|
|
accumulator.status = mpp.status;
|
|
|
|
}
|
|
|
|
return accumulator;
|
|
|
|
}
|
|
|
|
|
2020-08-19 23:39:55 +00:00
|
|
|
function groupBy(payments) {
|
|
|
|
let temp = null;
|
|
|
|
let paymentsInGroups = payments.reduce(paymentReducer, {});
|
2020-08-22 20:07:21 +00:00
|
|
|
let paymentsGrpArray = Object.keys(paymentsInGroups).map(key => (paymentsInGroups[key].length && paymentsInGroups[key].length > 1) ? common.sortDescByKey(paymentsInGroups[key], 'partid') : paymentsInGroups[key]);
|
|
|
|
return paymentsGrpArray.reduce((acc, curr) => {
|
2020-08-19 23:39:55 +00:00
|
|
|
if (curr.length && curr.length === 1) {
|
|
|
|
temp = JSON.parse(JSON.stringify(curr));
|
|
|
|
temp[0].is_group = false;
|
|
|
|
temp[0].is_expanded = false;
|
|
|
|
temp[0].total_parts = 1;
|
2020-08-22 20:07:21 +00:00
|
|
|
delete temp[0].partid;
|
2020-08-19 23:39:55 +00:00
|
|
|
} else {
|
|
|
|
temp = {};
|
2020-08-22 20:07:21 +00:00
|
|
|
let paySummary = curr.reduce(summaryReducer, {msatoshi: 0, msatoshi_sent: 0, status: (curr[0] && curr[0].status) ? curr[0].status : 'failed'});
|
|
|
|
temp = {is_group: true, is_expanded: false, total_parts: (curr.length ? curr.length : 0), status: paySummary.status, payment_hash: curr[0].payment_hash,
|
|
|
|
destination: curr[0].destination, msatoshi: paySummary.msatoshi, msatoshi_sent: paySummary.msatoshi_sent, created_at: curr[0].created_at,
|
2021-06-20 20:27:08 +00:00
|
|
|
mpps: curr};
|
2020-08-19 23:39:55 +00:00
|
|
|
}
|
|
|
|
return acc.concat(temp);
|
|
|
|
}, []);
|
|
|
|
}
|
|
|
|
|
2019-09-08 19:09:00 +00:00
|
|
|
exports.listPayments = (req, res, next) => {
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'List Payments..'});
|
2019-09-07 21:31:32 +00:00
|
|
|
options = common.getOptions();
|
2020-08-18 14:34:40 +00:00
|
|
|
options.url = common.getSelLNServerUrl() + '/v1/pay/listPayments';
|
2019-09-07 21:31:32 +00:00
|
|
|
request(options).then((body) => {
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body.payments});
|
2020-03-10 17:25:52 +00:00
|
|
|
if(!body || body.error) {
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payments List Error', error: body.error});
|
2019-09-07 21:31:32 +00:00
|
|
|
res.status(500).json({
|
|
|
|
message: "Payments List Failed!",
|
2020-03-10 17:25:52 +00:00
|
|
|
error: (!body) ? 'Error From Server!' : body.error
|
2019-09-07 21:31:32 +00:00
|
|
|
});
|
|
|
|
} else {
|
2020-03-10 17:25:52 +00:00
|
|
|
if ( body && body.payments && body.payments.length > 0) {
|
2019-09-08 19:09:00 +00:00
|
|
|
body.payments = common.sortDescByKey(body.payments, 'created_at');
|
2019-09-07 21:31:32 +00:00
|
|
|
}
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'List Payments Received'});
|
2020-08-19 23:39:55 +00:00
|
|
|
res.status(200).json(groupBy(body.payments));
|
2019-09-07 21:31:32 +00:00
|
|
|
}
|
|
|
|
})
|
2020-05-03 19:52:38 +00:00
|
|
|
.catch(errRes => {
|
|
|
|
let err = JSON.parse(JSON.stringify(errRes));
|
|
|
|
if (err.options && err.options.headers && err.options.headers.macaroon) {
|
|
|
|
delete err.options.headers.macaroon;
|
|
|
|
}
|
|
|
|
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
|
|
|
|
delete err.response.request.headers.macaroon;
|
|
|
|
}
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payments List Error', error: err});
|
2019-09-07 21:31:32 +00:00
|
|
|
return res.status(500).json({
|
|
|
|
message: "Payments List Failed!",
|
|
|
|
error: err.error
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
2019-09-08 19:09:00 +00:00
|
|
|
|
|
|
|
exports.decodePayment = (req, res, next) => {
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Decoding Payment..'});
|
2019-09-08 19:09:00 +00:00
|
|
|
options = common.getOptions();
|
2020-08-18 14:34:40 +00:00
|
|
|
options.url = common.getSelLNServerUrl() + '/v1/pay/decodePay/' + req.params.invoice;
|
2019-09-08 19:09:00 +00:00
|
|
|
request(options).then((body) => {
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment Decode Received', data: body});
|
2020-03-10 17:25:52 +00:00
|
|
|
if(!body || body.error) {
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payment Decode Error', error: body.error});
|
2019-09-08 19:09:00 +00:00
|
|
|
res.status(500).json({
|
|
|
|
message: "Payment Request Decode Failed!",
|
2020-03-10 17:25:52 +00:00
|
|
|
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
|
2019-09-08 19:09:00 +00:00
|
|
|
});
|
|
|
|
} else {
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded'});
|
2019-09-08 19:09:00 +00:00
|
|
|
res.status(200).json(body);
|
|
|
|
}
|
|
|
|
})
|
2020-05-03 19:52:38 +00:00
|
|
|
.catch(errRes => {
|
|
|
|
let err = JSON.parse(JSON.stringify(errRes));
|
|
|
|
if (err.options && err.options.headers && err.options.headers.macaroon) {
|
|
|
|
delete err.options.headers.macaroon;
|
|
|
|
}
|
|
|
|
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
|
|
|
|
delete err.response.request.headers.macaroon;
|
|
|
|
}
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payment Decode Error', error: err});
|
2019-09-08 19:09:00 +00:00
|
|
|
return res.status(500).json({
|
|
|
|
message: "Payment Request Decode Failed!",
|
|
|
|
error: err.error
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
exports.postPayment = (req, res, next) => {
|
|
|
|
options = common.getOptions();
|
2020-08-17 23:54:02 +00:00
|
|
|
if (req.params.type === 'keysend') {
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Keysend Payment..'});
|
2020-08-18 14:34:40 +00:00
|
|
|
options.url = common.getSelLNServerUrl() + '/v1/pay/keysend';
|
2020-08-17 23:54:02 +00:00
|
|
|
} else {
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Send Payment..'});
|
2020-08-18 14:34:40 +00:00
|
|
|
options.url = common.getSelLNServerUrl() + '/v1/pay';
|
2020-08-17 23:54:02 +00:00
|
|
|
}
|
2019-09-08 19:09:00 +00:00
|
|
|
options.body = req.body;
|
|
|
|
request.post(options).then((body) => {
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment Response', data: body});
|
2020-03-10 17:25:52 +00:00
|
|
|
if(!body || body.error) {
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Send Payment Error', error: body.error});
|
2019-09-08 19:09:00 +00:00
|
|
|
res.status(500).json({
|
2020-08-17 23:54:02 +00:00
|
|
|
message: "Send Payment Failed!",
|
2020-03-10 17:25:52 +00:00
|
|
|
error: (!body) ? 'Error From Server!' : body.error
|
2019-09-08 19:09:00 +00:00
|
|
|
});
|
|
|
|
} else {
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payment Sent'});
|
2019-09-08 19:09:00 +00:00
|
|
|
res.status(201).json(body);
|
|
|
|
}
|
|
|
|
})
|
2020-05-03 19:52:38 +00:00
|
|
|
.catch(errRes => {
|
|
|
|
let err = JSON.parse(JSON.stringify(errRes));
|
|
|
|
if (err.options && err.options.headers && err.options.headers.macaroon) {
|
|
|
|
delete err.options.headers.macaroon;
|
|
|
|
}
|
|
|
|
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
|
|
|
|
delete err.response.request.headers.macaroon;
|
|
|
|
}
|
2021-06-20 20:27:08 +00:00
|
|
|
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Send Payments Error', error: err});
|
2019-09-08 19:09:00 +00:00
|
|
|
return res.status(500).json({
|
2020-08-17 23:54:02 +00:00
|
|
|
message: "Send Payment Failed!",
|
2019-09-08 19:09:00 +00:00
|
|
|
error: err.error
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|