diff options
| author | Adam Soltys <[email protected]> | 2020-05-06 15:09:35 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2020-05-06 15:09:35 -0700 |
| commit | 2f0f9e640ead76518f7f8013b16704da89421ee4 (patch) | |
| tree | 50932ac23661290139d871b46417f928fdf2aa8f /routes/send.js | |
| parent | 1b5f795c22a07adc978d129fd1e0066e46f6e4fa (diff) | |
| download | coinos-server-2f0f9e640ead76518f7f8013b16704da89421ee4.tar.gz coinos-server-2f0f9e640ead76518f7f8013b16704da89421ee4.zip | |
internal transfers
Diffstat (limited to 'routes/send.js')
| -rw-r--r-- | routes/send.js | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/routes/send.js b/routes/send.js new file mode 100644 index 00000000..89e2034b --- /dev/null +++ b/routes/send.js @@ -0,0 +1,120 @@ +const axios = require("axios"); + +module.exports = async (req, res) => { + let { amount, asset, username } = req.body; + let { user } = req; + + l.info("attempting internal payment", user.username, amount); + + try { + await db.transaction(async transaction => { + let account = await db.Account.findOne({ + where: { + user_id: user.id, + asset + }, + lock: transaction.LOCK.UPDATE, + transaction + }); + + if (account.balance < amount) { + throw new Error("Insufficient funds"); + } + + let fee = 0; + + account.balance -= amount; + await account.save({ transaction }); + + let payment = await db.Payment.create( + { + amount: -amount, + account_id: account.id, + user_id: user.id, + rate: app.get("rates")[user.currency], + currency: user.currency, + confirmed: true, + hash: "Internal Transfer", + network: "COINOS" + }, + { transaction } + ); + + payment = payment.get({ plain: true }); + payment.account = account.get({ plain: true }); + + l.info("sent internal", user.username, -payment.amount); + + user = await getUser(user.username, transaction); + emit(user.username, "user", user); + res.send(payment); + + user = await db.User.findOne({ + where: { username } + }); + + let params = { + user_id: user.id, + asset + }; + + account = await db.Account.findOne({ + where: params, + lock: transaction.LOCK.UPDATE, + transaction + }); + + if (account) { + account.balance += amount; + await account.save({ transaction }); + } else { + let name = asset.substr(0, 6); + let ticker = asset.substr(0, 3).toUpperCase(); + let precision = 8; + + const assets = (await axios.get("https://assets.blockstream.info/")).data; + + if (assets[asset]) { + ({ticker, precision, name } = assets[asset]); + } + + params = { ...params, ...{ ticker, precision, name } }; + params.balance = amount; + params.pending = 0; + account = await db.Account.create(params, { transaction }); + } + + payment = await db.Payment.create( + { + amount, + account_id: account.id, + user_id: user.id, + rate: app.get("rates")[user.currency], + currency: user.currency, + confirmed: true, + hash: "Internal Transfer", + network: "COINOS", + received: true, + }, + { transaction } + ); + + user = await getUser(user.username, transaction); + emit(user.username, "user", user); + + payment = payment.get({ plain: true }); + payment.account = account.get({ plain: true }); + emit(user.username, "payment", payment); + + l.info("received internal", user.username, payment.amount); + }); + } catch (e) { + l.error( + "problem sending internal payment", + user.username, + user.balance, + e.message + ); + return res.status(500).send(e.message); + } +}; |
