mirror of
https://github.com/mgerb/mywebsite
synced 2026-01-11 18:32:50 +00:00
342 lines
9.3 KiB
JavaScript
342 lines
9.3 KiB
JavaScript
var http = require('http');
|
|
var async = require('async');
|
|
//var mongo = require('mongodb');
|
|
var express = require('express');
|
|
var monk = require('monk');
|
|
var config = require('./config.json');
|
|
|
|
var dbHostName, dbPortNumber, dbName;
|
|
if (config && config.database) {
|
|
dbHostName = config.database.default.host;
|
|
dbPortNumber = config.database.default.port;
|
|
dbName = config.database.default.name;
|
|
} else {
|
|
dbHostName = 'localhost';
|
|
dbPortNumber = 27017;
|
|
dbName = 'mongoui';
|
|
}
|
|
var db = monk(dbHostName + ':' +
|
|
dbPortNumber + '/' +
|
|
dbName);
|
|
|
|
// var db= monk('localhost:27017/test')
|
|
var derby = require('derby');
|
|
|
|
var highlight = require('highlight').Highlight;
|
|
|
|
|
|
var app = new express();
|
|
|
|
var server = http.createServer(app);
|
|
// derby.use(require('derby-ui-boot'));
|
|
|
|
derby.use(derby.logPlugin);
|
|
var store = derby.createStore({
|
|
listen: server
|
|
});
|
|
var model = store.createModel();
|
|
|
|
store.afterDb("set", "dbName", function(txn, doc, prevDoc, done) {
|
|
if (txn && (txn.length > 2) && txn[3][1]) {
|
|
//filter dbName based on existing list
|
|
db = monk(config.database.default.host + ':' + config.database.default.port + '/' + txn[3][1]);
|
|
db.driver.collectionNames(function(e, names) {
|
|
if (e) {
|
|
console.error(e);
|
|
process.exit(1);
|
|
}
|
|
//TODO: abstract it
|
|
names.forEach(function(el,i,list){
|
|
// console.log(el.name)
|
|
el.name = el.name.split('.')[1];
|
|
if (el.name === 'system' ) { //let's not show system.indexes collections
|
|
delete list[i];
|
|
}
|
|
})
|
|
model.set('collections', names);
|
|
if (names.length>0 && names[0]) model.set('collectionName', names[0].name)
|
|
// model.subscribe('collections', function() {
|
|
// console.log(model.get('collections'))
|
|
done();
|
|
// });
|
|
});
|
|
}
|
|
});
|
|
|
|
|
|
store.afterDb("set", "itemConverted.*.value",function(txn, doc, prevDoc, done) {
|
|
// console.log('***',txn, doc, prevDoc)
|
|
done();
|
|
if (txn && (txn.length > 2) && txn[3][1]) {
|
|
|
|
var newValue = txn[3][1];
|
|
var path = doc.path.split('.');
|
|
var id = path[1].substr(1);
|
|
var collection = path[0];
|
|
var pathStr = path[2];
|
|
|
|
// db.get(path[0]).update({
|
|
// _id: path[1].substr(1)
|
|
// }, {
|
|
// $set: { path[2]: newValue }
|
|
// }, function (e, results) {
|
|
var setObj = {};
|
|
setObj[pathStr] = newValue;
|
|
|
|
db.get(collection).updateById(id, { $set: setObj}, function(e,results){
|
|
// console.log(e, results);
|
|
// model.set(txn[3][0], newValue);
|
|
})
|
|
}
|
|
});
|
|
|
|
|
|
store.afterDb("set", "collectionName", function(txn, doc, prevDoc, done) {
|
|
if (txn && (txn.length > 2) && txn[3][1]) {
|
|
// console.log(txn[3][1]);
|
|
var collectionName = txn[3][1];
|
|
db.get(collectionName).find({}, {
|
|
limit: 20
|
|
//,
|
|
// skip: 20,
|
|
// sort:{_id: 1}
|
|
}, function(e, items) {
|
|
if (e) console.error(e)
|
|
// db.get(txn[3][1]).find({},{$limit:20}, function (e, items){
|
|
if (items.length === 0) {
|
|
model.set('collectionBox', {msg:"Collection is empty"});
|
|
} else {
|
|
model.set('collectionBox', JSON.stringify(items,0,2));
|
|
}
|
|
done()
|
|
})
|
|
}
|
|
})
|
|
|
|
|
|
|
|
app.use(store.modelMiddleware());
|
|
|
|
var derbyApp = require('./main');
|
|
|
|
|
|
|
|
if (config.database.default.name) {
|
|
model.set('dbName', config.database.default.name);
|
|
}
|
|
|
|
var localDbs = {};
|
|
|
|
async.waterfall([
|
|
|
|
function(callback) {
|
|
db.driver.admin.listDatabases(function(e, dbs) {
|
|
callback(null, e, dbs);
|
|
});
|
|
}, function(e, dbs, callback) {
|
|
localDbs = dbs;
|
|
|
|
callback(null);
|
|
|
|
}, function(callback) {
|
|
model.subscribe('dbName', function(e, dbName) {
|
|
model.subscribe('collectionBox', function() {
|
|
model.subscribe('collectionName', function(){
|
|
callback();
|
|
})
|
|
});
|
|
});
|
|
}]);
|
|
|
|
derbyApp.get('/', function(page, model, params, next) {
|
|
model.set('dbs',localDbs);
|
|
page.render({dbHostName:dbHostName});
|
|
});
|
|
|
|
derbyApp.get('/host/:host_name/dbs/:db_name', function(page, model, params, next){
|
|
model.subscribe('collections', function() {
|
|
// console.log('YO')
|
|
});
|
|
model.subscribe('dbs', function() {
|
|
// console.log('YO')
|
|
});
|
|
model.subscribe('collectionBox', function() {
|
|
// console.log('YO')
|
|
});
|
|
model.set('collectionName', '');
|
|
model.set('dbs', localDbs)
|
|
if (params.db_name!== model.get('dbName') ) {
|
|
model.set('dbName', params.db_name);
|
|
// console.log("!!!CHANGEDB!!!",params.db_name);
|
|
}
|
|
page.render({dbHostName: dbHostName});
|
|
})
|
|
|
|
derbyApp.get('/host/:host_name/dbs/:db_name/collections/:collection_name', function(page, model, params, next){
|
|
var url = '/host/' + params.host_name + '/dbs/' + params.db_name + '/collections/' + params.collection_name;
|
|
model.set('dbs', localDbs)
|
|
model.subscribe('collections', function() {
|
|
// console.log('YO')
|
|
});
|
|
model.subscribe('dbs', function() {
|
|
// console.log('YO')
|
|
});
|
|
model.subscribe('collectionBox', function() {
|
|
// console.log('YO')
|
|
});
|
|
model.subscribe('dbName', function() {
|
|
// console.log('YO')
|
|
});
|
|
model.subscribe('collectionName', function() {
|
|
// console.log('YO')
|
|
});
|
|
|
|
if (params.db_name !== model.get('dbName') ) {
|
|
// console.log("!!!CHANGE!!!",params.db_name);
|
|
model.set('dbName', params.db_name);
|
|
}
|
|
// console.log(typeof params.query)
|
|
if (params.collection_name) {
|
|
// console.log(params.query);
|
|
// console.log(params.query.query)
|
|
if (params.query.query) {
|
|
var query = decodeURI(params.query.query);
|
|
// console.log(typeof query);
|
|
try {
|
|
query = JSON.parse(query);
|
|
for (var key in query) { //monk has casting but let's do this anyways
|
|
if (typeof query[key] === 'string' && query[key].indexOf('ObjectId')>-1) {
|
|
var idValue = query[key].substr(10,24); //let's hope this never causes bugs
|
|
query[key] = db.id(idValue)
|
|
// console.log(query)
|
|
}
|
|
}
|
|
} catch(e) {
|
|
next(e);
|
|
}
|
|
} else {
|
|
var query = {};
|
|
}
|
|
|
|
//TODO cast types properly if 1 -> use number, not string
|
|
// db.get(params.collection_name).find({_access:1}, {
|
|
db.get(params.collection_name).find(query, {
|
|
limit: 20
|
|
//,
|
|
// skip: 20,
|
|
// sort:{_id: 1}
|
|
}, function(e, items) {
|
|
if (e) console.error(e)
|
|
var queryArr = [];
|
|
for (var k in query) {
|
|
queryArr.push({
|
|
'key': k,
|
|
'value': query[k],
|
|
'type': typeof query[k],
|
|
'isString': (typeof query[k]==='string' || typeof query[k] === 'object'),
|
|
'isNumber': typeof query[k]==='number'
|
|
});
|
|
}
|
|
// console.log(queryArr)
|
|
if (items.length === 0) {
|
|
page.render({dbHostName: dbHostName, queryResultHTML: "No matches", query: queryArr, url: url});
|
|
// model.set('collectionBox', {msg:"No matches"});
|
|
} else {
|
|
var html = highlight ( JSON.stringify(items,0,2));
|
|
// console.log(html)
|
|
// model.set('collectionBox',html);
|
|
//edit if one match
|
|
if (items.length === 1) {
|
|
model.set('item',items[0]);
|
|
var itemConverted = editMode(items[0], params.collection_name);
|
|
model.set('itemConverted', itemConverted);
|
|
model.subscribe('itemConverted',function(){
|
|
// console.log('editing mode item subscribed')
|
|
// console.log('***')
|
|
|
|
page.render({dbHostName: dbHostName, queryResultHTML: html, query: queryArr, url: url});
|
|
});
|
|
} else {
|
|
// console.log('@@@')
|
|
page.render({dbHostName: dbHostName, queryResultHTML: html});
|
|
}
|
|
}
|
|
// page.render(params);
|
|
|
|
})
|
|
} else {
|
|
model.set('collectionName', params.collection_name);
|
|
// page.render(params);
|
|
page.render({dbHostName: dbHostName});
|
|
}
|
|
// model.set('query', decodeURI(params.query));
|
|
|
|
// next();
|
|
})
|
|
|
|
app.use(derbyApp.router());
|
|
|
|
app.use(express.static(__dirname + '/public'));
|
|
|
|
// app.use(express.basicAuth('StorifyDev', 'St0rify!mongoui'));
|
|
|
|
app.get('/api.json', function(req, res) {
|
|
db.driver.admin.listDatabases(function(e, dbs) {
|
|
res.json(dbs);
|
|
});
|
|
});
|
|
app.get('/api/collections.json', function(req, res) {
|
|
db.driver.collectionNames(function(e, names) {
|
|
res.json(names);
|
|
});
|
|
});
|
|
app.get('/api/dbs/:db/collections/:name.json', function(req, res) {
|
|
// console.log('!',db)
|
|
var collection = db.get(req.params.name);
|
|
collection.find({}, {
|
|
limit: 20
|
|
}, function(e, docs) {
|
|
// console.log('boo', docs);
|
|
res.json(docs);
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
server.listen(1313, function(){
|
|
console.log('mongoui is listening on: %s:%s', server.address().address, server.address().port);
|
|
});
|
|
|
|
|
|
function editMode(item, collectionName) {
|
|
var rowList = [];
|
|
// var level = 0;
|
|
var iterate = function(object, list, level, path) {
|
|
// console.log(typeof object)
|
|
for (var key in object) {
|
|
// console.log(key)
|
|
// Object.keys(object).forEach(function(key){
|
|
if (typeof object[key] === 'object' ) {
|
|
if (object[key] && !object[key]["_bsontype"]) {
|
|
iterate(object[key],list,level+1);
|
|
}
|
|
} if (typeof object[key] === 'function' ) {
|
|
//do nothing
|
|
} else {
|
|
list.push({
|
|
key: key,
|
|
isId: key === '_id',
|
|
value: object[key],
|
|
level: level*2,
|
|
type: typeof object[key],
|
|
path: [path, key].join('.')
|
|
});
|
|
};
|
|
};
|
|
// console.log(list);
|
|
// });
|
|
return list;
|
|
}
|
|
return iterate(item, rowList, 0, collectionName +'._'+item._id);
|
|
} |