From f8121a1133e069891459e1d386a684e83a4b1c3c Mon Sep 17 00:00:00 2001 From: Matias Pando Date: Tue, 12 May 2015 11:54:03 -0300 Subject: [PATCH] Adding stats to /lib --- lib/stats.js | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 lib/stats.js diff --git a/lib/stats.js b/lib/stats.js new file mode 100644 index 0000000..586582d --- /dev/null +++ b/lib/stats.js @@ -0,0 +1,158 @@ +#!/usr/bin/env node + +'use strict'; + +var _ = require('lodash'); +var mongodb = require('mongodb'); +var moment = require('moment'); +var async = require('async'); +var config = require('../config'); + + +var c = config.storageOpts.mongoDb; +var url = 'mongodb://' + (c.host || 'localhost') + ':' + (c.port ||  27017) + '/bws'; + +var startDate = moment(); +var endDate = moment(); + +var stats = {}; +var wallets = {}; +var bwsStats = {}; + +bwsStats.cleanUp = function() { + stats = { + 'livenet': {}, + 'testnet': {} + }; +}; + + +bwsStats.AddingWalletToCache = function(data) { + if (!data) return; + wallets[data.id] = data.network; +}; + +bwsStats.TotalNewWallets = function(data) { + if (!data) return; + var day = moment(data.createdOn * 1000).format('YYYYMMDD'); + if (!stats[data.network][day]) { + stats[data.network][day] = { + totalTx: 0, + totalAmount: 0, + totalNewWallets: 0 + }; + } + stats[data.network][day].totalNewWallets++; +}; + +bwsStats.TotalTxps = function(data) { + if (!data) return; + var day = moment(data.createdOn * 1000).format('YYYYMMDD'); + var network = wallets[data.walletId]; + if (!stats[network][day]) { + stats[network][day] = { + totalTx: 0, + totalAmount: 0, + totalNewWallets: 0 + }; + } + stats[network][day].totalTx++; + stats[network][day].totalAmount += data.amount; +}; + +bwsStats.ProcessData = function(DB, cb) { + bwsStats.ProccesWallets(DB, function() { + bwsStats.ProccesNewWallets(DB, function() { + bwsStats.ProccesTxs(DB, function() { + DB.close(); + cb(); + }); + }); + }); +}; + +bwsStats.ProccesWallets = function(DB, cb) { + var collection = DB.collection('wallets'); + collection.find({}).toArray(function(err, items) { + if (err) { + console.log('Error.', err); + return cb(err); + } + + items.forEach(function(it) { + bwsStats.AddingWalletToCache(it); + }); + cb(); + }); +}; + +bwsStats.ProccesNewWallets = function(DB, cb) { + var collection = DB.collection('wallets'); + var start = Math.floor(startDate.startOf('day').valueOf() / 1000); + var end = Math.floor(endDate.endOf('day').valueOf() / 1000); + + collection.find({ + createdOn: { + $gt: start, + $lt: end + } + }).toArray(function(err, items) { + if (err) { + console.log('Error.', err); + return cb(err); + } + items.forEach(function(it) { + bwsStats.TotalNewWallets(it); + }); + cb(); + }); +}; + +bwsStats.ProccesTxs = function(DB, cb) { + var collection = DB.collection('txs'); + var start = Math.floor(startDate.startOf('day').valueOf() / 1000); + var end = Math.floor(endDate.endOf('day').valueOf() / 1000); + + collection.find({ + createdOn: { + $gt: start, + $lt: end + } + }).toArray( + function(err, items) { + if (err) { + console.log('Error.', err); + return cb(err); + } else { + items.forEach(function(it) { + bwsStats.TotalTxps(it); + }); + } + cb(); + }); +}; + +bwsStats.getStats = function(opts, cb) { + if (opts) { + startDate = moment(opts.from); + endDate = moment(opts.to); + } + bwsStats.cleanUp(); + + mongodb.MongoClient.connect(url, function(err, db) { + if (err) { + console.log('Unable to connect to the mongoDB server. Error:', err); + return cb(err, null); + } + console.log('Connection established to ', url); + bwsStats.ProcessData(db, function(err) { + if (err) { + console.log('Error.', err); + return cb(err, null); + } + cb(null, stats); + }); + }); +}; + +module.exports = bwsStats;