alphascript-server
Version:
CRUD operations for mongo and other functionalities to get started quickly in any CMS project
108 lines (87 loc) • 2.93 kB
JavaScript
var api = require('../../../');
module.exports = {
getAll: getDatabases,
getMetadata: function(req, res) {
res.json(getMetadata(req));
},
//todo
getDates: function(req, res) {}
};
function getMetadata(req) {
var models = {
//common: getDatabaseInfo(api.common)
};
for (var key in api.db) {
if (typeof api.db[key] === 'function') models[key] = getDatabaseInfo(api.db[key](req));
else models[key] = getDatabaseInfo(api.db[key]);
}
return models;
}
function getDatabases(callback) {
var connection = api.options.mongoose.createConnection(api.options.common, api.mongoOptions());
connection.on('open', function() {
new api.options.mongoose.mongo.Admin(connection.db).listDatabases(function(err, result) {
connection.close();
if (err) {
api.error.log(err);
return callback('Erro ao obter bases de dados (administrador)');
}
callback(null, result.databases);
});
});
connection.on('connected', function() {
console.log('api admin db connected successfully');
});
connection.on('error', function(err) {
api.error.log('api admin db error:' + err);
});
connection.on('disconnected', function() {
delete connection;
console.log('api admin db disconnected');
});
}
function getDatabaseInfo(db) {
var collections = {},
subField;
for (var collectionName in db) {
var collection = db[collectionName];
collections[collectionName] = {};
for (var fieldName in collection.schema.paths) {
if (fieldName === '__v') continue;
var field = collection.schema.paths[fieldName];
var fields = {};
//agora só faz o primeiro nível | todo: recursive flattening
if (typeof field.options.type === 'object') {
if (field.options.type instanceof Array) {
if (typeof field.options.type[0].type !== 'undefined') collections[collectionName][fieldName] = getDataType(field.options.type[0]);
else {
for (subField in field.options.type[0]) {
collections[collectionName][fieldName + '.' + subField] = getDataType(field.options.type[0][subField]);
}
}
} else {
for (subField in field.options.type) {
collections[collectionName][fieldName + '.' + subField] = getDataType(field.options.type[subField]);
}
}
} else collections[collectionName][fieldName] = getDataType(field.options);
}
}
return collections;
}
function getDataType(options) {
var result = {};
if (typeof options.ref !== 'undefined') result.ref = options.ref;
switch (typeof options.type) {
case "object":
result.type = /function ([^(]*)/.exec(options.type[0] + "")[1];
break;
case "function":
result.type = /function ([^(]*)/.exec(options.type + "")[1];
break;
default:
result.type = options.type;
break;
}
return result;
}