monitor-util.js 2.19 KB
var mongoClient = require('mongodb').MongoClient;
var LRU = require('lru-cache');

var config;
var mongodb;

var usersByEmailCacheMax = 20;
var usersByEmailCacheMaxAge = 1000 * 60 * 2;
var usersByEmailCache = LRU({max: usersByEmailCacheMax, maxAge: usersByEmailCacheMaxAge});

function initMongoClient() {
    if (!config.mongodb || !config.mongodb.url) {
        console.log('Undefined config.mongodb.url')
        return;
    }

    try {
        var url = config.mongodb.url;

        mongoClient.connect(url, function(err, db) {
            if (err) {
                console.log('Failed to connect to mongodb');
                return;
            }
            mongodb = db;
            exports.mongodb = mongodb;
            console.log('MongoDB connected');
        });
    }
    catch(err) {
        console.log('Exception when connecting to mongodb');
    }
}

function init(options) {
    if (!options) {
        console.log('Undefined options, terminating....');
        process.exit(1);
    }

    if (!options.config) {
        console.log('Undefined options.config, terminating....');
        process.exit(1);
    }
    config = options.config;

    initMongoClient();
}

function getUserByEmailFromDb(email, cb) {
    mongodb.collection('users').findOne(
        { email: email },
        function (err, result) {
            if (err) {
                console.log('Error getting user by email: ' + err);
            }
            cb(err, result);
        }
    );
}

function getUserByEmail(email, cb) {
    var user = usersByEmailCache.get(email);
    if (user) {
        cb(null, user);
        return;
    }

    getUserByEmailFromDb(email, function(err, result) {
        if (err || !result) {
            usersByEmailCache.del(email);
        } else {
            usersByEmailCache.set(email, result);
        }

        cb(err, result);
    });
}

function invalidateCacheUserByEmail(email) {
    usersByEmailCache.del(email);
}

function getTrx(requestId, cb) {
    mongodb.collection('trx').find({requestId: requestId}).limit(1).next(cb);
}

exports.init = init;
exports.mongodb = mongodb;
exports.getUserByEmail = getUserByEmail;
exports.invalidateCacheUserByEmail = invalidateCacheUserByEmail;
exports.getTrx = getTrx;