'use strict'; /** * Module dependencies. */ var common = require('./common'), async = require('async'), BlockDb = require('../../lib/BlockDb'), TransactionDb = require('../../lib/TransactionDb'); var bdb = new BlockDb(); var tdb = new TransactionDb(); /** * Find block by hash ... */ exports.block = function(req, res, next, hash) { bdb.fromHashWithInfo(hash, function(err, block) { if (err || !block) return common.handleErrors(err, res, next); else { tdb.getPoolInfo(block.info.tx[0], function(info) { block.info.poolInfo = info; req.block = block.info; return next(); }); } }); }; /** * Show block */ exports.show = function(req, res) { if (req.block) { res.jsonp(req.block); } }; /** * Show block by Height */ exports.blockindex = function(req, res, next, height) { bdb.blockIndex(height, function(err, hashStr) { if (err) { console.log(err); res.status(400).send('Bad Request'); // TODO } else { res.jsonp(hashStr); } }); }; var getBlock = function(blockhash, cb) { bdb.fromHashWithInfo(blockhash, function(err, block) { if (err) { console.log(err); return cb(err); } // TODO if (!block.info) { console.log('[blocks.js.60]: could not get %s from RPC. Orphan? Error?', blockhash); //TODO // Probably orphan block.info = { hash: blockhash, isOrphan: 1, }; } tdb.getPoolInfo(block.info.tx[0], function(info) { block.info.poolInfo = info; return cb(err, block.info); }); }); }; /** * List of blocks by date */ exports.list = function(req, res) { var isToday = false; //helper to convert timestamps to yyyy-mm-dd format var formatTimestamp = function(date) { var yyyy = date.getUTCFullYear().toString(); var mm = (date.getUTCMonth() + 1).toString(); // getMonth() is zero-based var dd = date.getUTCDate().toString(); return yyyy + '-' + (mm[1] ? mm : '0' + mm[0]) + '-' + (dd[1] ? dd : '0' + dd[0]); //padding }; var dateStr; var todayStr = formatTimestamp(new Date()); if (req.query.blockDate) { // TODO: Validate format yyyy-mm-dd dateStr = req.query.blockDate; isToday = dateStr === todayStr; } else { dateStr = todayStr; isToday = true; } var gte = Math.round((new Date(dateStr)).getTime() / 1000); //pagination var lte = gte + 86400; var prev = formatTimestamp(new Date((gte - 86400) * 1000)); var next = formatTimestamp(new Date(lte * 1000)); bdb.getBlocksByDate(gte, lte, function(err, blocks) { if (err) { res.status(500).send(err); } else { var blockList = []; var l = blocks.length; var limit = parseInt(req.query.limit || l); if (l < limit) limit = l; for (var i = 0; i < limit; i++) { blockList.push(blocks[i]); } async.mapSeries(blockList, function(b, cb) { getBlock(b.hash, function(err, info) { if (err) { console.log(err); return cb(err); } return cb(err, { height: info.height, size: info.size, hash: b.hash, time: b.ts || info.time, txlength: info.tx.length, poolInfo: info.poolInfo }); }); }, function(err, allblocks) { // sort blocks by height allblocks.sort( function compare(a,b) { if (a.height < b.height) return 1; if (a.height > b.height) return -1; return 0; }); res.jsonp({ blocks: allblocks, length: allblocks.length, pagination: { next: next, prev: prev, currentTs: lte - 1, current: dateStr, isToday: isToday } }); }); } }); };