(function(module) { 'use strict'; var winston = require('winston'), async = require('async'), nconf = require('nconf'), express = require('express'), db, mongoClient, mongoStore; try { mongoClient = require('mongodb').MongoClient; mongoStore = require('connect-mongo')(express); } catch (err) { winston.error('Unable to initialize MongoDB! Is MongoDB installed? Error :' + err.message); process.exit(); } module.init = function(callback) { mongoClient.connect('mongodb://'+ nconf.get('mongo:host') + ':' + nconf.get('mongo:port') + '/' + nconf.get('mongo:database'), function(err, _db) { if(err) { winston.error("NodeBB could not connect to your Mongo database. Mongo returned the following error: " + err.message); process.exit(); } db = _db; module.client = db; module.sessionStore = new mongoStore({ db: db }); if(nconf.get('mongo:password') && nconf.get('mongo:username')) { db.authenticate(nconf.get('mongo:username'), nconf.get('mongo:password'), function (err) { if(err) { winston.error(err.message); process.exit(); } createCollections(); }); } else { createCollections(); } function createCollections() { db.createCollection('objects', {w:1}, function(err, collection) { if(err) { winston.error('Error creating collection (objects) ' + err.message); return; } if(collection) { collection.ensureIndex({_key :1}, {background:true}, function(err, name) { if(err) { winston.error('Error creating index ' + err.message); } }); collection.ensureIndex({'expireAt':1}, {expireAfterSeconds:0, background:true}, function(err, name) { if(err) { winston.error('Error creating index ' + err.message); } }); } }); db.createCollection('search', {w:1}, function(err, collection) { if(err) { winston.error('Error creating collection (search) ' + err.message); return; } if(collection) { collection.ensureIndex({content:'text'}, {background:true}, function(err, name){ if(err) { winston.error('Error creating index ' + err.message); } }); } }); callback(null); } }); } // // helper functions // function removeHiddenFields(item) { if(item) { if(item._id) { delete item._id; } if(item._key) { delete item._key; } } return item; } function findItem(data, key) { if(!data) { return null; } for(var i=0; i