#!/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 = c.uri; 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;