mirror of
https://github.com/Ride-The-Lightning/RTL
synced 2024-11-07 15:20:31 +00:00
e45d6d598a
- Package updates Updated docker NodeJS from 10 to 14 Updated Angular from 11 to 12 Updated Material from 11 to 12 Updated Angular cli from 11 to 12 Updated Karma from 5 to 6 Updated rxjs from 6 to 7 Updated ngrx from 10 to 12 Updated angularx-qrcode from 10 to 11 Updated @angular/flex-layout from 11 to 12 Updated angular-user-idle from 2.2.4 to 2.2.5 Updated typescript from 4.0.2 to 4.2.4 Updated zone.js from 0.10.2 to 0.11.4 Migrated from TSLint to ESLint Installed save-dev crypto-browserify & stream-browserify - Mask password with fixed length #689 - CSRF Token (#696) - Route lock default password (#700) - ECL Invoice amount mislabeled #694 - ECL & LND Fee report time zone offset bug fixes #692 & #693 - Loop remove max routing fee validation #690 - Child route refresh bug - Adding Password Blacklist (#704) - Fee rate in percentage #621 (#705) - ECL Adding BaseFee and FeeRate on Channels - LND Invoice and Payment pagination fix (#707) - Keysend missing QR code bug fix - Login page XS layout fix - Reports tables load time improved (#709) - Report initial table load bug fix
155 lines
6.3 KiB
JavaScript
155 lines
6.3 KiB
JavaScript
var request = require('request-promise');
|
|
var common = require('../../routes/common');
|
|
var logger = require('../shared/logger');
|
|
var options = {};
|
|
|
|
function paymentReducer(accumulator, currentPayment) {
|
|
let currPayHash = currentPayment.payment_hash;
|
|
if (!currentPayment.partid) { currentPayment.partid = 0; }
|
|
if(!accumulator[currPayHash]) {
|
|
accumulator[currPayHash] = [currentPayment];
|
|
} else {
|
|
accumulator[currPayHash].push(currentPayment);
|
|
}
|
|
return accumulator;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
function groupBy(payments) {
|
|
let temp = null;
|
|
let paymentsInGroups = payments.reduce(paymentReducer, {});
|
|
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) => {
|
|
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;
|
|
delete temp[0].partid;
|
|
} else {
|
|
temp = {};
|
|
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,
|
|
mpps: curr};
|
|
}
|
|
return acc.concat(temp);
|
|
}, []);
|
|
}
|
|
|
|
exports.listPayments = (req, res, next) => {
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'List Payments..'});
|
|
options = common.getOptions();
|
|
options.url = common.getSelLNServerUrl() + '/v1/pay/listPayments';
|
|
request(options).then((body) => {
|
|
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body.payments});
|
|
if(!body || body.error) {
|
|
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payments List Error', error: body.error});
|
|
res.status(500).json({
|
|
message: "Payments List Failed!",
|
|
error: (!body) ? 'Error From Server!' : body.error
|
|
});
|
|
} else {
|
|
if ( body && body.payments && body.payments.length > 0) {
|
|
body.payments = common.sortDescByKey(body.payments, 'created_at');
|
|
}
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'List Payments Received'});
|
|
res.status(200).json(groupBy(body.payments));
|
|
}
|
|
})
|
|
.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;
|
|
}
|
|
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payments List Error', error: err});
|
|
return res.status(500).json({
|
|
message: "Payments List Failed!",
|
|
error: err.error
|
|
});
|
|
});
|
|
};
|
|
|
|
exports.decodePayment = (req, res, next) => {
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Decoding Payment..'});
|
|
options = common.getOptions();
|
|
options.url = common.getSelLNServerUrl() + '/v1/pay/decodePay/' + req.params.invoice;
|
|
request(options).then((body) => {
|
|
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment Decode Received', data: body});
|
|
if(!body || body.error) {
|
|
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payment Decode Error', error: body.error});
|
|
res.status(500).json({
|
|
message: "Payment Request Decode Failed!",
|
|
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
|
|
});
|
|
} else {
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded'});
|
|
res.status(200).json(body);
|
|
}
|
|
})
|
|
.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;
|
|
}
|
|
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payment Decode Error', error: err});
|
|
return res.status(500).json({
|
|
message: "Payment Request Decode Failed!",
|
|
error: err.error
|
|
});
|
|
});
|
|
};
|
|
|
|
exports.postPayment = (req, res, next) => {
|
|
options = common.getOptions();
|
|
if (req.params.type === 'keysend') {
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Keysend Payment..'});
|
|
options.url = common.getSelLNServerUrl() + '/v1/pay/keysend';
|
|
} else {
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Send Payment..'});
|
|
options.url = common.getSelLNServerUrl() + '/v1/pay';
|
|
}
|
|
options.body = req.body;
|
|
request.post(options).then((body) => {
|
|
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment Response', data: body});
|
|
if(!body || body.error) {
|
|
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Send Payment Error', error: body.error});
|
|
res.status(500).json({
|
|
message: "Send Payment Failed!",
|
|
error: (!body) ? 'Error From Server!' : body.error
|
|
});
|
|
} else {
|
|
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payment Sent'});
|
|
res.status(201).json(body);
|
|
}
|
|
})
|
|
.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;
|
|
}
|
|
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Send Payments Error', error: err});
|
|
return res.status(500).json({
|
|
message: "Send Payment Failed!",
|
|
error: err.error
|
|
});
|
|
});
|
|
};
|