From c17870433023930a56f7697f989820c89fe68d65 Mon Sep 17 00:00:00 2001 From: Tobias Date: Wed, 13 Mar 2019 18:04:01 +0000 Subject: [PATCH 01/10] Create route to get wallet history --- src/controllers/profile.controller.js | 80 +++++++++++++++++++++++++++ src/routes/profile.route.js | 1 + 2 files changed, 81 insertions(+) diff --git a/src/controllers/profile.controller.js b/src/controllers/profile.controller.js index ed1e27c..cda227a 100644 --- a/src/controllers/profile.controller.js +++ b/src/controllers/profile.controller.js @@ -3,6 +3,8 @@ const steem = require('steem') const { handleErr, stringify, calcRep } = require('../utils') const SteemAccount = require('../model/steemData/Account') const axios = require('axios') +const SSC = require('sscjs') +const ssc = new SSC('https://api.steem-engine.com/rpc') // POST Login exports.login = (req, res) => { @@ -318,3 +320,81 @@ exports.get_account = (req, res) => { console.log(requested) res.send('you requested for: ' + requested) } + +// GET Wallet + +exports.get_wallet = (req, res) => { + const username = req.params.username + + // GET Teardrop Balance + + const getTearDropBalance = new Promise(function (resolve, reject) { + try { + ssc.findOne( + 'tokens', + 'balances', + { + account: username, + symbol: 'TEARDROPS' + }, (err, result) => { + if (!err) { + resolve({ + teardrop_balance: result.balance || '0' + }) + } + }) + } catch (err) { + console.log(err) + reject(err) + } + }) + + // Get Account Details + + const getAccountData = new Promise(function (resolve, reject) { + try { + steem.api.getAccounts([username], function (err, result) { + if (!err) { + resolve({ + steem_balance: result[0].balance, + sbd_balance: result[0].sbd_balance, + steem_savings: result[0].savings_balance, + sbd_savings: result[0].savings_sbd_balance, + vesting_shares: result[0].vesting_shares, + delegated_vesting_shares: result[0].delegated_vesting_shares, + received_vesting_shares: result[0].received_vesting_shares + }) + } + }) + } catch (err) { + console.log(err) + reject(err) + } + }) + + // GET Dynamic Properties + + const DynamicProperties = new Promise(function (resolve, reject) { + try { + steem.api.getDynamicGlobalProperties(function (err, result) { + if (!err) { + resolve({ + totalVestingShare: result.total_vesting_shares, + totalVestingFund: result.total_vesting_fund_steem + }) + } + }) + } catch (err) { + console.log(err) + reject(err) + } + }) + + Promise.all([getTearDropBalance, getAccountData, DynamicProperties]) + .then(function ([teardropBalance, generalBalances, DynamicProperties]) { + const balances = {...teardropBalance, ...generalBalances} + balances.steem_power = steem.formatter.vestToSteem(generalBalances.vesting_shares, DynamicProperties.totalVestingShare, DynamicProperties.totalVestingFund) + balances.delegated_steem_power = steem.formatter.vestToSteem((generalBalances.received_vesting_shares.split(' ')[0] - generalBalances.delegated_vesting_shares.split(' ')[0]) + ' VESTS', DynamicProperties.totalVestingShare, DynamicProperties.totalVestingFund) + res.send(balances) + }) +} diff --git a/src/routes/profile.route.js b/src/routes/profile.route.js index 6bdd9dc..fe69562 100644 --- a/src/routes/profile.route.js +++ b/src/routes/profile.route.js @@ -19,6 +19,7 @@ router.post('/verify', profileController.verify_user) router.get('/profile/:username', checkUlogCertfied, profileController.get_profile) router.get('/userImage/:username', profileController.get_user_image) router.get('/:account/*.json', profileController.get_account) +router.get('/wallet/:username', profileController.get_wallet) // Export From 54fe0215e2764ebb7b212147a67150f5fc3ac5a8 Mon Sep 17 00:00:00 2001 From: Tobias Date: Wed, 13 Mar 2019 22:46:47 +0000 Subject: [PATCH 02/10] Add method to get transactions --- package.json | 8 +- src/controllers/profile.controller.js | 267 ++++++++++++++++++++++---- src/routes/profile.route.js | 1 + 3 files changed, 238 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index d657b1a..67d5f56 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Steemgigs API Server", "main": "src/index.js", "scripts": { - "start": "node src/index", + "start": "nodemon src/index.js", "startw": "nodemon src/index.js --exec 'npm run lint && node'", "startW": "nodemon src/index.js --exec 'npm run lint && npm run startRP'", "startP": "pm2 start src/index.js -i max --name \"SteemGigsServer\"", @@ -46,12 +46,14 @@ "helmet": "^3.9.0", "joi": "^13.0.2", "jsonwebtoken": "^8.1.0", + "lodash": "^4.17.11", "mongoose": "^4.13.7", "mongoose-multi": "0.0.18", "morgan": "^1.9.0", "redis": "^2.8.0", "sc2-sdk": "^1.0.2", - "steemconnect": "^2.0.1", - "steem": "^0.7.1" + "sscjs": "0.0.7", + "steem": "^0.7.1", + "steemconnect": "^2.0.1" } } diff --git a/src/controllers/profile.controller.js b/src/controllers/profile.controller.js index cda227a..1cd1bba 100644 --- a/src/controllers/profile.controller.js +++ b/src/controllers/profile.controller.js @@ -5,20 +5,31 @@ const SteemAccount = require('../model/steemData/Account') const axios = require('axios') const SSC = require('sscjs') const ssc = new SSC('https://api.steem-engine.com/rpc') +const _ = require('lodash'); // POST Login exports.login = (req, res) => { - let {username} = req.body + let { + username + } = req.body if (req.user === username) { - User.findOne({username}).exec((err, profile) => { + User.findOne({ + username + }).exec((err, profile) => { if (!err) { if (profile) { // returning user - profile = profile.toObject({getters: true}) + profile = profile.toObject({ + getters: true + }) if (profile.deleted) { - res.json({tye: 'deleted user'}) + res.json({ + tye: 'deleted user' + }) } else if (profile.disabled) { - res.json({type: 'user disabled or banned'}) + res.json({ + type: 'user disabled or banned' + }) } else { delete profile.deleted delete profile.disabled @@ -32,10 +43,16 @@ exports.login = (req, res) => { } else { profile.steemgigsWitness = false } - res.json({type: 'returning user', profile}) + res.json({ + type: 'returning user', + profile + }) } else { console.log('error connecting to steem to fetch complete userData', stringify(err)) - res.json({type: 'returning user', profile}) + res.json({ + type: 'returning user', + profile + }) } }) } @@ -49,7 +66,19 @@ exports.login = (req, res) => { if (JSON.parse(author.json_metadata).profile) { apiProfile = JSON.parse(author.json_metadata).profile } - let {profile_image: profilePic, name, about, location, website, cover_image: coverPic, facebook, github, instagram, twitter, discord} = apiProfile + let { + profile_image: profilePic, + name, + about, + location, + website, + cover_image: coverPic, + facebook, + github, + instagram, + twitter, + discord + } = apiProfile let profile = { username, social: { @@ -71,7 +100,9 @@ exports.login = (req, res) => { let newUser = new User(profile) newUser.save((err, newProfileData) => { if (!err) { - newProfileData = newProfileData.toObject({getters: true}) + newProfileData = newProfileData.toObject({ + getters: true + }) delete newProfileData.deleted delete newProfileData.disabled if (author.witness_votes.indexOf('steemgigs') > -1) { @@ -81,12 +112,18 @@ exports.login = (req, res) => { } newProfileData.balance = author.balance newProfileData.rep = calcRep(author.reputation) - res.json({type: 'new user', profile: newProfileData}) + res.json({ + type: 'new user', + profile: newProfileData + }) } }).catch(err => { handleErr(err, res, 'error saving new user data') }) - console.log({author, profile}) + console.log({ + author, + profile + }) } }) } @@ -96,18 +133,37 @@ exports.login = (req, res) => { } }) } else { - handleErr({error: 'unauthorized loggedIdn request'}, res, 'unauthorized loggeddIn request', 403) + handleErr({ + error: 'unauthorized loggedIdn request' + }, res, 'unauthorized loggeddIn request', 403) } } // POST Set Profile exports.set_profile = (req, res) => { - let {username} = req.body + let { + username + } = req.body if (req.user === username) { - SteemAccount.findOne({account: username}).exec((err, profileData) => { + SteemAccount.findOne({ + account: username + }).exec((err, profileData) => { if (!err) { - profileData = profileData.toObject({getters: true}) - let {profile_image: profileImage, name, about, location, website, cover_image: coverImage, facebook, github, instagram, twitter} = profileData.json_metadata.profile + profileData = profileData.toObject({ + getters: true + }) + let { + profile_image: profileImage, + name, + about, + location, + website, + cover_image: coverImage, + facebook, + github, + instagram, + twitter + } = profileData.json_metadata.profile let steemgigsWitness if (profileData.witness_votes.indexOf('steemgigs') > -1) { steemgigsWitness = true @@ -120,7 +176,11 @@ exports.set_profile = (req, res) => { about, location, social: { - website, twitter, facebook, instagram, github + website, + twitter, + facebook, + instagram, + github }, profilePic: profileImage, coverPic: coverImage, @@ -134,17 +194,37 @@ exports.set_profile = (req, res) => { } }) } else { - handleErr({error: 'unauthorized loggedIn request'}, res, 'unauthorized loggedIn request', 403) + handleErr({ + error: 'unauthorized loggedIn request' + }, res, 'unauthorized loggedIn request', 403) } } // Edit Profile exports.edit_profile = (req, res) => { - let {username, name, expertise, test, about, profilePic, coverPic, languages, social, vacation, location, gender} = req.body - console.log('from frontend', {test, vacation}) + let { + username, + name, + expertise, + test, + about, + profilePic, + coverPic, + languages, + social, + vacation, + location, + gender + } = req.body + console.log('from frontend', { + test, + vacation + }) if (req.user === username) { - User.findOne({username}, (err, userData) => { + User.findOne({ + username + }, (err, userData) => { if (!err) { if (userData) { console.log('fetched userData::', stringify(userData)) @@ -186,7 +266,17 @@ exports.edit_profile = (req, res) => { }) } else { let newUser = new User({ - username, name, expertise, about, profilePic, coverPic, languages, social, vacation, location, gender + username, + name, + expertise, + about, + profilePic, + coverPic, + languages, + social, + vacation, + location, + gender }) newUser.save((err, newUserData) => { if (!err) { @@ -201,14 +291,18 @@ exports.edit_profile = (req, res) => { } }) } else { - handleErr({error: 'unauthorized profile modification attempt'}, res, 'you can only modify your own profile details', 403) + handleErr({ + error: 'unauthorized profile modification attempt' + }, res, 'you can only modify your own profile details', 403) } } // POST Verify User exports.verify_user = (req, res) => { - let {token} = req.body + let { + token + } = req.body if (token) { axios.get(`https://steemconnect.com/api/me?access_token=${token}`).then(response => { let responseData = response.data @@ -235,17 +329,25 @@ exports.verify_user = (req, res) => { exports.get_profile = (req, res) => { var username = req.params.username - User.findOne({username}).exec((err, profile) => { + User.findOne({ + username + }).exec((err, profile) => { if (!err) { if (profile) { - profile = profile.toObject({getters: true}) + profile = profile.toObject({ + getters: true + }) } else { profile = {} } if (profile.deleted) { - res.json({tye: 'deleted user'}) + res.json({ + tye: 'deleted user' + }) } else if (profile.disabled) { - res.json({type: 'user disabled or banned'}) + res.json({ + type: 'user disabled or banned' + }) } else { delete profile.deleted delete profile.disabled @@ -257,7 +359,19 @@ exports.get_profile = (req, res) => { if (JSON.parse(author.json_metadata).profile) { apiProfile = JSON.parse(author.json_metadata).profile } - let {profile_image: profilePic, name, about, location, website, cover_image: coverPic, facebook, github, instagram, twitter, discord} = apiProfile + let { + profile_image: profilePic, + name, + about, + location, + website, + cover_image: coverPic, + facebook, + github, + instagram, + twitter, + discord + } = apiProfile profile = { username, social: { @@ -299,9 +413,15 @@ exports.get_profile = (req, res) => { // GET User Image exports.get_user_image = (req, res) => { - let {username} = req.params - SteemAccount.findOne({'name': username}).exec((err, result) => { - result = result.toObject({getters: true}) + let { + username + } = req.params + SteemAccount.findOne({ + 'name': username + }).exec((err, result) => { + result = result.toObject({ + getters: true + }) if (!err) { let info = {} info.profileImage = result.json_metadata.profile.profile_image || 'https://via.placeholder.com/100x100' @@ -332,8 +452,7 @@ exports.get_wallet = (req, res) => { try { ssc.findOne( 'tokens', - 'balances', - { + 'balances', { account: username, symbol: 'TEARDROPS' }, (err, result) => { @@ -346,6 +465,7 @@ exports.get_wallet = (req, res) => { } catch (err) { console.log(err) reject(err) + handleErr(err, res, 'Error gathering transactions') } }) @@ -369,6 +489,7 @@ exports.get_wallet = (req, res) => { } catch (err) { console.log(err) reject(err) + handleErr(err, res, 'Error gathering transactions') } }) @@ -387,14 +508,90 @@ exports.get_wallet = (req, res) => { } catch (err) { console.log(err) reject(err) + handleErr(err, res, 'Error gathering transactions') } }) Promise.all([getTearDropBalance, getAccountData, DynamicProperties]) .then(function ([teardropBalance, generalBalances, DynamicProperties]) { - const balances = {...teardropBalance, ...generalBalances} + const balances = { + ...teardropBalance, + ...generalBalances + } balances.steem_power = steem.formatter.vestToSteem(generalBalances.vesting_shares, DynamicProperties.totalVestingShare, DynamicProperties.totalVestingFund) balances.delegated_steem_power = steem.formatter.vestToSteem((generalBalances.received_vesting_shares.split(' ')[0] - generalBalances.delegated_vesting_shares.split(' ')[0]) + ' VESTS', DynamicProperties.totalVestingShare, DynamicProperties.totalVestingFund) res.send(balances) }) } + +// GET Transactions + +exports.get_transactions = (req, res) => { + const username = req.params.username + + // Get tranfers transactions from steem + + const steemTransactions = new Promise(function (resolve, reject) { + try { + steem.api.getAccountHistory(username, -1, 1000, (err, result) => { + if (!err) { + const transfers = result.filter(tx => tx[1].op[0] === 'transfer') + resolve(transfers) + } + }) + } catch (err) { + console.log(err) + reject(err) + handleErr(err, res, 'Error gathering transactions') + } + }) + + // Get TEARDROPS transactions for a user, added via http request as unable to find query in docs how to do this via npm package + + const getTearDropsTransactions = new Promise(function (resolve, reject) { + axios.get(`https://api.steem-engine.com/accounts/history?account=${username}&limit=100&offset=0&type=user&symbol=TEARDROPS&v=1552513635377`) + .then(function (response) { + resolve(response) + }) + .catch(function (err) { + console.log(err) + reject(err) + handleErr(err, res, 'Error gathering transactions') + }) + }) + + Promise.all([steemTransactions, getTearDropsTransactions]) + .then(function ([steemTransactions, tearDropsTransactions]) { + + // Create object to send back details formatted for client + let transactions = [] + + // Iterate through steem transaction history and only add require transaction data to transaction object + steemTransactions.forEach(transaction => { + transactions.push({ + details: transaction[1].op[1], + timestamp: transaction[1].timestamp + }) + }) + + // Iterate through teardrops transaction history and only add require transaction data to transaction object + tearDropsTransactions.data.forEach(transaction => { + transactions.push({ + details: { + from: transaction.from, + to: transaction.to, + amount: transaction.quantity, + memo: transaction.memo + }, + timestamp: transaction.timestamp + }) + }) + + // Sort transactions in asc order + + transactions = _.sortBy(transactions, function (dateObj) { + return new Date(dateObj.timestamp) + }) + res.send(transactions) + }) +} diff --git a/src/routes/profile.route.js b/src/routes/profile.route.js index fe69562..bcef83e 100644 --- a/src/routes/profile.route.js +++ b/src/routes/profile.route.js @@ -20,6 +20,7 @@ router.get('/profile/:username', checkUlogCertfied, profileController.get_profil router.get('/userImage/:username', profileController.get_user_image) router.get('/:account/*.json', profileController.get_account) router.get('/wallet/:username', profileController.get_wallet) +router.get('/transactions/:username', profileController.get_transactions) // Export From 2029c554515bf448928431079f5c76764faa787f Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 14 Mar 2019 08:36:59 +0000 Subject: [PATCH 03/10] Send trasactions, handle errors surrounding no teardrop balance, toFixed Steem Power --- src/controllers/profile.controller.js | 32 ++++++++++++++------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/controllers/profile.controller.js b/src/controllers/profile.controller.js index 1cd1bba..ef93938 100644 --- a/src/controllers/profile.controller.js +++ b/src/controllers/profile.controller.js @@ -5,7 +5,7 @@ const SteemAccount = require('../model/steemData/Account') const axios = require('axios') const SSC = require('sscjs') const ssc = new SSC('https://api.steem-engine.com/rpc') -const _ = require('lodash'); +const _ = require('lodash') // POST Login exports.login = (req, res) => { @@ -446,8 +446,7 @@ exports.get_account = (req, res) => { exports.get_wallet = (req, res) => { const username = req.params.username - // GET Teardrop Balance - + // Get Teardrop Balance using steemeng const getTearDropBalance = new Promise(function (resolve, reject) { try { ssc.findOne( @@ -458,7 +457,11 @@ exports.get_wallet = (req, res) => { }, (err, result) => { if (!err) { resolve({ - teardrop_balance: result.balance || '0' + teardrop_balance: result.balance + }) + } else { + resolve({ + teardrop_balance: '0 TEARDROPS' }) } }) @@ -470,7 +473,6 @@ exports.get_wallet = (req, res) => { }) // Get Account Details - const getAccountData = new Promise(function (resolve, reject) { try { steem.api.getAccounts([username], function (err, result) { @@ -493,8 +495,7 @@ exports.get_wallet = (req, res) => { } }) - // GET Dynamic Properties - + // Get dynamic Properties in order calculate steem power totals const DynamicProperties = new Promise(function (resolve, reject) { try { steem.api.getDynamicGlobalProperties(function (err, result) { @@ -518,7 +519,7 @@ exports.get_wallet = (req, res) => { ...teardropBalance, ...generalBalances } - balances.steem_power = steem.formatter.vestToSteem(generalBalances.vesting_shares, DynamicProperties.totalVestingShare, DynamicProperties.totalVestingFund) + balances.steem_power = steem.formatter.vestToSteem(generalBalances.vesting_shares, DynamicProperties.totalVestingShare, DynamicProperties.totalVestingFund).toFixed(3) balances.delegated_steem_power = steem.formatter.vestToSteem((generalBalances.received_vesting_shares.split(' ')[0] - generalBalances.delegated_vesting_shares.split(' ')[0]) + ' VESTS', DynamicProperties.totalVestingShare, DynamicProperties.totalVestingFund) res.send(balances) }) @@ -530,7 +531,6 @@ exports.get_transactions = (req, res) => { const username = req.params.username // Get tranfers transactions from steem - const steemTransactions = new Promise(function (resolve, reject) { try { steem.api.getAccountHistory(username, -1, 1000, (err, result) => { @@ -547,7 +547,6 @@ exports.get_transactions = (req, res) => { }) // Get TEARDROPS transactions for a user, added via http request as unable to find query in docs how to do this via npm package - const getTearDropsTransactions = new Promise(function (resolve, reject) { axios.get(`https://api.steem-engine.com/accounts/history?account=${username}&limit=100&offset=0&type=user&symbol=TEARDROPS&v=1552513635377`) .then(function (response) { @@ -562,7 +561,6 @@ exports.get_transactions = (req, res) => { Promise.all([steemTransactions, getTearDropsTransactions]) .then(function ([steemTransactions, tearDropsTransactions]) { - // Create object to send back details formatted for client let transactions = [] @@ -580,18 +578,22 @@ exports.get_transactions = (req, res) => { details: { from: transaction.from, to: transaction.to, - amount: transaction.quantity, + amount: transaction.quantity + ' TEARDROPS', memo: transaction.memo }, timestamp: transaction.timestamp }) }) - // Sort transactions in asc order - + // Sort transactions using lodash (sorted asc by default) transactions = _.sortBy(transactions, function (dateObj) { return new Date(dateObj.timestamp) }) - res.send(transactions) + + // Send to client in descending order + res.send(transactions.reverse()) + }).catch(function (err) { + console.log(err) + handleErr(err, res, 'Error gathering transactions') }) } From 045f490286d1d29ecb2c8c3ccf42106e34bf0b46 Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 14 Mar 2019 08:39:23 +0000 Subject: [PATCH 04/10] Typo in comment --- src/controllers/profile.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/profile.controller.js b/src/controllers/profile.controller.js index ef93938..da5b915 100644 --- a/src/controllers/profile.controller.js +++ b/src/controllers/profile.controller.js @@ -561,7 +561,7 @@ exports.get_transactions = (req, res) => { Promise.all([steemTransactions, getTearDropsTransactions]) .then(function ([steemTransactions, tearDropsTransactions]) { - // Create object to send back details formatted for client + // Create array to send back details formatted for client let transactions = [] // Iterate through steem transaction history and only add require transaction data to transaction object From f41c7926a6f8b586249c4d403a9f47df79da1efd Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 14 Mar 2019 08:44:15 +0000 Subject: [PATCH 05/10] Catch errors during the setting of balances/calculating steem power --- src/controllers/profile.controller.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/controllers/profile.controller.js b/src/controllers/profile.controller.js index da5b915..b3681bc 100644 --- a/src/controllers/profile.controller.js +++ b/src/controllers/profile.controller.js @@ -522,6 +522,9 @@ exports.get_wallet = (req, res) => { balances.steem_power = steem.formatter.vestToSteem(generalBalances.vesting_shares, DynamicProperties.totalVestingShare, DynamicProperties.totalVestingFund).toFixed(3) balances.delegated_steem_power = steem.formatter.vestToSteem((generalBalances.received_vesting_shares.split(' ')[0] - generalBalances.delegated_vesting_shares.split(' ')[0]) + ' VESTS', DynamicProperties.totalVestingShare, DynamicProperties.totalVestingFund) res.send(balances) + }).catch(function (err) { + console.log(err) + handleErr(err, res, 'Error gathering transactions') }) } From 40b4fc5b52c77babd4e0d9a78bddd44061aa8b7e Mon Sep 17 00:00:00 2001 From: Tobias Date: Sat, 6 Apr 2019 16:36:02 +0100 Subject: [PATCH 06/10] Turn teardrops balance into int, fix to 3 points --- src/controllers/profile.controller.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/profile.controller.js b/src/controllers/profile.controller.js index b3681bc..90353ed 100644 --- a/src/controllers/profile.controller.js +++ b/src/controllers/profile.controller.js @@ -457,11 +457,11 @@ exports.get_wallet = (req, res) => { }, (err, result) => { if (!err) { resolve({ - teardrop_balance: result.balance + teardrop_balance: parseInt(result.balance, 10).toFixed(3) }) } else { resolve({ - teardrop_balance: '0 TEARDROPS' + teardrop_balance: 0 }) } }) From 2754b40691904c528f6a174c753c6cb8a5c75ea8 Mon Sep 17 00:00:00 2001 From: Tobias Date: Sat, 6 Apr 2019 22:11:56 +0100 Subject: [PATCH 07/10] Check for valid username prior to getting balances --- src/controllers/profile.controller.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/controllers/profile.controller.js b/src/controllers/profile.controller.js index 90353ed..99e1b54 100644 --- a/src/controllers/profile.controller.js +++ b/src/controllers/profile.controller.js @@ -445,7 +445,9 @@ exports.get_account = (req, res) => { exports.get_wallet = (req, res) => { const username = req.params.username + const isValidUsername = steem.utils.validateAccountName(username); + if (isValidUsername) { // Get Teardrop Balance using steemeng const getTearDropBalance = new Promise(function (resolve, reject) { try { @@ -456,6 +458,7 @@ exports.get_wallet = (req, res) => { symbol: 'TEARDROPS' }, (err, result) => { if (!err) { + if (result.balance) resolve({ teardrop_balance: parseInt(result.balance, 10).toFixed(3) }) @@ -526,6 +529,10 @@ exports.get_wallet = (req, res) => { console.log(err) handleErr(err, res, 'Error gathering transactions') }) + + } else { + res.send([]) + } } // GET Transactions From dedac51480437d39d1eaa1f89a16aaf45420743a Mon Sep 17 00:00:00 2001 From: Tobias Date: Sat, 6 Apr 2019 22:33:28 +0100 Subject: [PATCH 08/10] Move username check into middleware --- src/controllers/profile.controller.js | 6 ------ src/controllers/search.controller.js | 2 -- src/middleware/check-username.js | 18 ++++++++++++++++++ src/routes/profile.route.js | 5 +++-- 4 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 src/middleware/check-username.js diff --git a/src/controllers/profile.controller.js b/src/controllers/profile.controller.js index 99e1b54..f8dc001 100644 --- a/src/controllers/profile.controller.js +++ b/src/controllers/profile.controller.js @@ -445,9 +445,7 @@ exports.get_account = (req, res) => { exports.get_wallet = (req, res) => { const username = req.params.username - const isValidUsername = steem.utils.validateAccountName(username); - if (isValidUsername) { // Get Teardrop Balance using steemeng const getTearDropBalance = new Promise(function (resolve, reject) { try { @@ -529,10 +527,6 @@ exports.get_wallet = (req, res) => { console.log(err) handleErr(err, res, 'Error gathering transactions') }) - - } else { - res.send([]) - } } // GET Transactions diff --git a/src/controllers/search.controller.js b/src/controllers/search.controller.js index 7757068..85c579d 100644 --- a/src/controllers/search.controller.js +++ b/src/controllers/search.controller.js @@ -80,8 +80,6 @@ exports.search = (req, res) => { }} ) - console.log(JSON.stringify(pipeline)) - try { Post.aggregate(pipeline).exec((err, result) => { if (!err) { diff --git a/src/middleware/check-username.js b/src/middleware/check-username.js new file mode 100644 index 0000000..c0f68be --- /dev/null +++ b/src/middleware/check-username.js @@ -0,0 +1,18 @@ +const steem = require('steem') + +const checkUsername = async (req, res, next) => { + try { + steem.api.getAccounts([req.params.username], function(err, result) { + console.log(result) + if (result.length !== 0) { + next() + } else { + res.send([]) + } + }) + } catch { + res.status(500).send() + } +} + +module.exports = checkUsername \ No newline at end of file diff --git a/src/routes/profile.route.js b/src/routes/profile.route.js index bcef83e..3a40b5d 100644 --- a/src/routes/profile.route.js +++ b/src/routes/profile.route.js @@ -5,6 +5,7 @@ const router = express.Router() const checkSteemConnect = require('../middleware/check-steemconnect') const checkUlogCertfied = require('../middleware/certified-ulogger') +const checkUsername = require('../middleware/check-username') // Controller @@ -19,8 +20,8 @@ router.post('/verify', profileController.verify_user) router.get('/profile/:username', checkUlogCertfied, profileController.get_profile) router.get('/userImage/:username', profileController.get_user_image) router.get('/:account/*.json', profileController.get_account) -router.get('/wallet/:username', profileController.get_wallet) -router.get('/transactions/:username', profileController.get_transactions) +router.get('/wallet/:username', checkUsername, profileController.get_wallet) +router.get('/transactions/:username', checkUsername, profileController.get_transactions) // Export From 3be088a18f1ad1b4c33a8f3c3c2b82155b05435b Mon Sep 17 00:00:00 2001 From: Tobias Date: Sat, 6 Apr 2019 23:16:33 +0100 Subject: [PATCH 09/10] Add full screen loading indicator --- src/middleware/check-username.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/middleware/check-username.js b/src/middleware/check-username.js index c0f68be..a032c29 100644 --- a/src/middleware/check-username.js +++ b/src/middleware/check-username.js @@ -3,7 +3,6 @@ const steem = require('steem') const checkUsername = async (req, res, next) => { try { steem.api.getAccounts([req.params.username], function(err, result) { - console.log(result) if (result.length !== 0) { next() } else { From c85c568d8b445701c906fb96efc0b2e9a4f94a40 Mon Sep 17 00:00:00 2001 From: Tobias Date: Sun, 7 Apr 2019 00:30:36 +0100 Subject: [PATCH 10/10] Up limit on accountHistory --- src/controllers/profile.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/profile.controller.js b/src/controllers/profile.controller.js index f8dc001..f78c03a 100644 --- a/src/controllers/profile.controller.js +++ b/src/controllers/profile.controller.js @@ -537,7 +537,7 @@ exports.get_transactions = (req, res) => { // Get tranfers transactions from steem const steemTransactions = new Promise(function (resolve, reject) { try { - steem.api.getAccountHistory(username, -1, 1000, (err, result) => { + steem.api.getAccountHistory(username, -1, 3000, (err, result) => { if (!err) { const transfers = result.filter(tx => tx[1].op[0] === 'transfer') resolve(transfers)