From a0e36844e119d3ea19a2c64e75bc5218aa8b4f96 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 17 Apr 2020 11:07:58 -0700 Subject: more stats --- index.js | 1 + lib/utils.js | 3 ++- routes/assets.js | 12 ++++++++++++ routes/balances.js | 41 ++++++++++++++++++++++++++++++++--------- routes/liquid/receive.js | 27 ++------------------------- routes/users.js | 19 +++++++++++++++---- 6 files changed, 64 insertions(+), 39 deletions(-) create mode 100644 routes/assets.js diff --git a/index.js b/index.js index f876f631..0ff00cc5 100644 --- a/index.js +++ b/index.js @@ -24,6 +24,7 @@ require("./lib/sockets"); require("./lib/passport"); require("./lib/rates"); +require("./routes/assets"); require("./routes/balances"); require("./routes/invoices"); require("./routes/payments"); diff --git a/lib/utils.js b/lib/utils.js index c6e02a1a..7784ae5c 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -23,7 +23,8 @@ module.exports = { as: "accounts" } ], - where: { username } + where: + { [Op.or]: { username, id: username }} }); } }; diff --git a/routes/assets.js b/routes/assets.js new file mode 100644 index 00000000..350781d7 --- /dev/null +++ b/routes/assets.js @@ -0,0 +1,12 @@ +const axios = require("axios"); + +app.get("/assets", async (req, res) => { + let assets; + try { + assets = await axios.get("https://assets.blockstream.info/"); + res.send(assets.data); + } catch(e) { + l.error("error fetching assets", e); + res.status(500).send("error fetching assets"); + } +}); diff --git a/routes/balances.js b/routes/balances.js index 75541730..895cc1ff 100644 --- a/routes/balances.js +++ b/routes/balances.js @@ -1,19 +1,42 @@ const sequelize = require("sequelize"); +const { Op } = sequelize; app.get("/balances", async (req, res) => { + const assets = await lq.getBalance(); + const accounts = await db.Account.findAll({ + attributes: [ + "asset", + [sequelize.fn("sum", sequelize.col("balance")), "total"] + ], + group: ["asset"], + where: { + asset: { + [Op.ne]: config.liquid.btcasset + } + } + }); + const balances = { + accounts, + assets, bitcoin: parseInt((await bc.getBalance()) * SATS), - liquid: parseInt((await lq.getBalance()).bitcoin * SATS), - channel: (await lna.channelBalance({})).balance, - wallet: (await lna.walletBalance({})).total_balance, - user: (await db['User'].findAll({ - attributes: [[sequelize.fn('sum', sequelize.col('balance')), 'total']], + liquid: parseInt(assets.bitcoin * SATS), + lnchannel: parseInt((await lna.channelBalance({})).balance), + lnwallet: parseInt((await lna.walletBalance({})).total_balance), + user: parseInt((await db["User"].findAll({ + attributes: [[sequelize.fn("sum", sequelize.col("balance")), "total"]], raw: true, - order: sequelize.literal('total DESC') - }))[0].total, + order: sequelize.literal("total DESC") + }))[0].total) }; - const { bitcoin, liquid, channel, user, wallet } = balances; - balances.ratio = ((parseInt(bitcoin) + parseInt(liquid) + parseInt(channel) + parseInt(wallet))/parseInt(user)).toFixed(2); + const { bitcoin, liquid, lnchannel, user, lnwallet } = balances; + balances.ratio = ( + (parseInt(bitcoin) + + parseInt(liquid) + + parseInt(lnchannel) + + parseInt(lnwallet)) / + parseInt(user) + ).toFixed(2); res.send(balances); }); diff --git a/routes/liquid/receive.js b/routes/liquid/receive.js index 1a70c61c..24d17a35 100644 --- a/routes/liquid/receive.js +++ b/routes/liquid/receive.js @@ -129,31 +129,7 @@ setInterval(async () => { where: { hash, confirmed: 0, received: 1 } }); - const user = await db.User.findOne({ - include: [ - { - model: db.Payment, - as: "payments", - order: [["id", "DESC"]], - where: { - [Op.or]: { - received: true, - amount: { - [Op.lt]: 0, - }, - }, - }, - limit: 12 - }, - { - model: db.Account, - as: "accounts", - }, - ], - where: { - id: p.user_id - } - }); + const user = await getUser(p.user_id); p.confirmed = 1; @@ -164,6 +140,7 @@ setInterval(async () => { } }); + l.info("asset", p.asset); if (p.asset === config.liquid.btcasset) { user.balance += p.amount + p.tip; user.pending -= Math.min(user.pending, p.amount + p.tip); diff --git a/routes/users.js b/routes/users.js index 7c9bce31..514c39f5 100644 --- a/routes/users.js +++ b/routes/users.js @@ -23,11 +23,12 @@ const twofa = (req, res, next) => { ) { return res.status(401).send("2fa required"); } else next(); - }; app.get("/liquidate", async (req, res) => { - let users = await db.User.findAll(); + let users = await db.User.findAll({ + include: { model: db.Account, as: "accounts" } + }); for (let i = 0; i < users.length; i++) { let user = users[i]; if (!user.confidential) { @@ -40,6 +41,15 @@ app.get("/liquidate", async (req, res) => { user.otpsecret = authenticator.generateSecret(); await user.save(); } + + if (!user.accounts.length) { + await db.Account.create({ + user_id: user.id, + asset: config.liquid.btcasset, + balance: user.balance, + pending: 0 + }); + } } res.end(); }); @@ -84,7 +94,8 @@ app.post("/register", async (req, res) => { GB: "GBP" }; - if (!config.ipstack || ip.startsWith("127") || ip.startsWith("192")) user.currency = "CAD"; + if (!config.ipstack || ip.startsWith("127") || ip.startsWith("192")) + user.currency = "CAD"; else { let info = await axios.get( `http://api.ipstack.com/${ip}?access_key=${config.ipstack}` @@ -92,7 +103,7 @@ app.post("/register", async (req, res) => { user.currency = countries[info.data.country_code] || "USD"; } - user.currencies = [...new Set([user.currency, 'CAD', 'USD', 'JPY'])]; + user.currencies = [...new Set([user.currency, "CAD", "USD", "JPY"])]; user.otpsecret = authenticator.generateSecret(); addresses[user.address] = user.username; -- cgit v1.2.3