httpserver.js 3.32 KB
var name = require('path').basename(__filename);

var redis = require('redis');
var redisClient;

var http = require('http');
var nsr = require('node-simple-router');
var router = nsr();

var js2xmlparser = require('js2xmlparser');

var httpServer;
var config;
var logger;


function toArrayOfObject(obj) {
    var arr = [];
    
    var chips = Object.getOwnPropertyNames(obj);
    var chipsCount = chips.length;
    
    for (var i = 0; i < chipsCount; i++) {
        data = {
            'name': chips[i],
            'stock': obj[chips[i]],
        }
        
        arr.push(data);
    }
    return arr;
}

function formatDataAsHtml(data) {
    var total = 0;
    var result = '<html><table><tr><th>DOMPUL</th><th>STOCK</th></tr>';
    
    var count = data.length;
    for (var i = 0; i < count; i++) {
        result += '<tr>';
        result += '<td>';
        result += data[i]['name'];
        result += '</td>';
        result += '<td style="text-align: right;">';
        result += data[i]['stock'];
        result += '</td>';
        result += '</tr>';
        
        total += parseInt(data[i]['stock']);
    }
    result += '<tr><td style="font-weight: bold;">TOTAL</td><td style="font-weight: bold; text-align: right;">' + total + '</td></tr>';
    result += '</table></html>';
    return result;
}

function formatData(_data, format) {
    data = toArrayOfObject(_data);
    if (format == 'xml') {
        return js2xmlparser('chips', {chip: data});
    }
    else if (format == 'json') {
        return JSON.stringify(data);
    }

    return formatDataAsHtml(data);
}

function getStockKeyForDenom(denom) {
    return 'stock.dompul.by-denom.' + denom;
}

function onHttpGetByDenom(request, response) {
    var key = getStockKeyForDenom(request.params.denom);
    
    redisClient.hgetall(key, function(err, obj) {
        
        if (err) {
            response.end('Error: ' + err);
            return;
        }
        
        response.end(formatData(obj, request.params.format));
    });
}

function onHttpGetTotalByDenom(request, response) {
    var key = getStockKeyForDenom(request.params.denom);
    
    redisClient.hgetall(key, function(err, obj) {
        
        if (err) {
            response.end('Error: ' + err);
            return;
        }
        
        var chips = Object.getOwnPropertyNames(obj);
        var chipsCount = chips.length;
        var total = 0;
        
        for (var i = 0; i < chipsCount; i++) {
            total = total + parseInt(obj[chips[i]]);
        }
        response.end(total.toString());
    });
}


function createServer() {
    router.get('/realtime-report/stock/:denom/index', onHttpGetByDenom);
    router.get('/realtime-report/stock/:denom/index/:format', onHttpGetByDenom);
    router.get('/realtime-report/stock/:denom/total', onHttpGetTotalByDenom);
    
    httpServer = http.createServer(router).listen(config.httpserver.listen_port);
    console.log('HTTP server listens on port ' + config.httpserver.listen_port);
}

function start(_config, _logger) {
    config = _config;
    logger = _logger;
    
    redisClient = redis.createClient(config.globals.redis_port, config.globals.redis_host);
    
    redisClient.on("error", function (err) {
        logger.error(name + "- redis client error: " + err);
    });


    logger.info('Starting http server');
    
    createServer();
}

exports.start = start;