1
0
mirror of https://github.com/mgerb/mywebsite synced 2026-01-11 18:32:50 +00:00
Files

171 lines
4.7 KiB
JavaScript

'use strict';
var async = require('async');
var mongodb = require('mongodb');
var _ = require('underscore');
var connect = function(config) {
// set up database stuff
var host = config.mongodb.server || 'localhost';
var port = config.mongodb.port || mongodb.Connection.DEFAULT_PORT;
var dbOptions = {
auto_reconnect: config.mongodb.autoReconnect,
poolSize: config.mongodb.poolSize,
};
var db;
if (Array.isArray(host)) {
host = host.map(function(host) {
return new mongodb.Server(host, port, dbOptions);
});
db = new mongodb.Db('local', new mongodb.ReplSet(host), { safe: true, w: 0 });
} else {
db = new mongodb.Db('local', new mongodb.Server(host, port, dbOptions), {safe:true});
}
var connections = {};
var databases = [];
var collections = {};
//get admin instance
var adminDb = db.admin();
var mainConn; // main db connection
// update the collections list
var updateCollections = function(db, dbName, callback) {
db.listCollections().toArray(function(err, result) {
var names = [];
for (var r in result) {
names.push(result[r].name);
}
collections[dbName] = names.sort();
if (callback) {
callback(err);
}
});
};
// update database list
var updateDatabases = function(admin, callback) {
admin.listDatabases(function(err, dbs) {
databases = [];
if (err) {
//TODO: handle error
console.error(err);
databases = _.pluck(config.mongodb.auth, 'database');
} else {
for (var i = 0; i < dbs.databases.length; i++) {
var dbName = dbs.databases[i].name;
//'local' is special database, ignore it
if (dbName === 'local') {
continue;
}
if (config.mongodb.whitelist.length !== 0) {
if (!_.include(config.mongodb.whitelist, dbName)) {
continue;
}
}
if (config.mongodb.blacklist.length !== 0) {
if (_.include(config.mongodb.blacklist, dbName)) {
continue;
}
}
connections[dbName] = mainConn.db(dbName);
databases.push(dbName);
updateCollections(connections[dbName], dbName);
}
}
//Sort database names
databases = databases.sort();
if (callback) {
callback(databases);
}
});
};
// connect to mongodb database
db.open(function(err, db) {
if (err) {
throw err;
}
console.log('Database connected');
mainConn = db;
//Check if admin features are on
if (config.mongodb.admin === true) {
if (config.mongodb.adminUsername.length === 0) {
console.log('Admin Database connected');
updateDatabases(adminDb);
} else {
//auth details were supplied, authenticate admin account with them
adminDb.authenticate(config.mongodb.adminUsername, config.mongodb.adminPassword, function(err) {
if (err) {
//TODO: handle error
console.error(err);
}
console.log('Admin Database connected');
updateDatabases(adminDb);
});
}
} else {
//Regular user authentication
if (typeof config.mongodb.auth === 'undefined' || config.mongodb.auth.length === 0) {
throw new Error('Add auth details to config or turn on admin!');
}
async.forEachSeries(config.mongodb.auth, function(auth, callback) {
console.log('Connecting to ' + auth.database + '...');
connections[auth.database] = mainConn.db(auth.database);
databases.push(auth.database);
if (typeof auth.username !== 'undefined' && auth.username.length !== 0) {
connections[auth.database].authenticate(auth.username, auth.password, function(err, success) {
if (err) {
//TODO: handle error
console.error(err);
}
if (!success) {
console.error('Could not authenticate to database "' + auth.database + '"');
}
updateCollections(connections[auth.database], auth.database);
console.log('Database ' + auth.database + ' connected');
callback();
});
} else {
updateCollections(connections[auth.database], auth.database);
console.log('Database ' + auth.database + ' connected');
callback();
}
});
}
});
return {
adminDb: adminDb,
collections: collections,
connections: connections,
databases: databases,
mainConn: mainConn,
updateCollections: updateCollections,
updateDatabases: updateDatabases,
};
};
module.exports = connect;