UNPKG

admin-mongo

Version:

A Web user interface to administer MongoDB databases built using Express

186 lines (160 loc) 7.17 kB
var express = require('express'); var router = express.Router(); var _ = require('lodash'); var common = require('./common'); // runs on all routes and checks password if one is setup router.all('/api/*', common.checkLogin, function (req, res, next){ next(); }); // pagination API router.post('/api/:conn/:db/:coll/:page', function (req, res, next){ var connection_list = req.app.locals.dbConnections; var ejson = require('mongodb-extended-json'); var docs_per_page = req.nconf.app.get('app:docs_per_page') !== undefined ? req.nconf.app.get('app:docs_per_page') : 5; // Check for existance of connection if(connection_list[req.params.conn] === undefined){ res.status(400).json({'msg': req.i18n.__('Invalid connection name')}); } // Validate database name if(req.params.db.indexOf(' ') > -1){ res.status(400).json({'msg': req.i18n.__('Invalid database name')}); } // Get DB's form pool var mongo_db = connection_list[req.params.conn].native.db(req.params.db); var page_size = docs_per_page; var page = 1; if(req.params.page !== undefined){ page = parseInt(req.params.page); } var skip = 0; if(page > 1){ skip = (page - 1) * page_size; } var limit = page_size; var query_obj = {}; var validQuery = true; var queryMessage = ''; if(req.body.query){ try{ query_obj = ejson.parse(req.body.query); }catch(e){ validQuery = false; queryMessage = e.toString(); query_obj = {}; } } mongo_db.collection(req.params.coll).find(query_obj, {skip: skip, limit: limit}).toArray(function (err, result){ if(err){ console.error(err); res.status(500).json(err); }else{ mongo_db.collection(req.params.coll).find({}, {skip: skip, limit: limit}).toArray(function (err, simpleSearchFields){ // get field names/keys of the Documents in collection var fields = []; for(var i = 0; i < simpleSearchFields.length; i++){ var doc = simpleSearchFields[i]; for(var key in doc){ if(key === '__v')continue; fields.push(key); } }; fields = fields.filter(function (item, pos){ return fields.indexOf(item) === pos; }); // get total num docs in query mongo_db.collection(req.params.coll).count(query_obj, function (err, doc_count){ var return_data = { data: result, fields: fields, total_docs: doc_count, deleteButton: req.i18n.__('Delete'), editButton: req.i18n.__('Edit'), validQuery: validQuery, queryMessage: queryMessage }; res.status(200).json(return_data); }); }); } }); }); // Gets monitoring data router.get('/api/monitoring/:conn', function (req, res, next){ // 24 hours worth of 30 sec blocks (data refresh interval) var recordCount = (24 * 60) * 60 / 30; req.db.find({connectionName: req.params.conn}).sort({eventDate: -1}).limit(recordCount).exec(function (err, serverEvents){ var connectionsCurrent = []; var connectionsAvailable = []; var connectionsTotalCreated = []; var clientsTotal = []; var clientsReaders = []; var clientsWriters = []; var memoryVirtual = []; var memoryMapped = []; var memoryCurrent = []; var docsQueried = []; var docsInserted = []; var docsDeleted = []; var docsUpdated = []; if(serverEvents.length > 0){ if(serverEvents[0].dataRetrieved === true){ if(serverEvents){ _.each(serverEvents, function (value, key){ // connections if(value.connections){ connectionsCurrent.push({x: value.eventDate, y: value.connections.current}); connectionsAvailable.push({x: value.eventDate, y: value.connections.available}); connectionsTotalCreated.push({x: value.eventDate, y: value.connections.totalCreated}); } // clients if(value.activeClients){ clientsTotal.push({x: value.eventDate, y: value.activeClients.total}); clientsReaders.push({x: value.eventDate, y: value.activeClients.readers}); clientsWriters.push({x: value.eventDate, y: value.activeClients.writers}); } // memory if(value.memory){ memoryVirtual.push({x: value.eventDate, y: value.memory.virtual}); memoryMapped.push({x: value.eventDate, y: value.memory.mapped}); memoryCurrent.push({x: value.eventDate, y: value.memory.resident}); } if(value.docCounts){ docsQueried.push({x: value.eventDate, y: value.docCounts.queried}); docsInserted.push({x: value.eventDate, y: value.docCounts.inserted}); docsDeleted.push({x: value.eventDate, y: value.docCounts.deleted}); docsUpdated.push({x: value.eventDate, y: value.docCounts.updated}); } }); } } var returnedData = { connectionsCurrent: connectionsCurrent, connectionsAvailable: connectionsAvailable, connectionsTotalCreated: connectionsTotalCreated, clientsTotal: clientsTotal, clientsReaders: clientsReaders, clientsWriters: clientsWriters, memoryVirtual: memoryVirtual, memoryMapped: memoryMapped, memoryCurrent: memoryCurrent, docsQueried: docsQueried, docsInserted: docsInserted, docsDeleted: docsDeleted, docsUpdated: docsUpdated }; // get hours or mins var uptime = (serverEvents[0].uptime / 60).toFixed(2); if(uptime > 61){ uptime = (uptime / 60).toFixed(2) + ' hours'; }else{ uptime = uptime + ' minutes'; } if(err){ res.status(400).json({'msg': req.i18n.__('Could not get server monitoring')}); }else{ res.status(200).json({data: returnedData, dataRetrieved: serverEvents[0].dataRetrieved, pid: serverEvents[0].pid, version: serverEvents[0].version, uptime: uptime}); } } }); }); module.exports = router;