Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 36 additions & 17 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ module.exports = function(config) {
// Import
var express = require('express'),
routes = require('./routes'),
api = require('./routes/api')(config);
api = require('./routes/api')(config),
isReadOnlyMode = false;


var app = module.exports = express();
Expand All @@ -17,6 +18,12 @@ module.exports = function(config) {
}
process.exit(1);
})

if(typeof(config.isReadOnlyMode) !== "undefined")
{
isReadOnlyMode = config.isReadOnlyMode;
}
config.isReadOnlyMode = isReadOnlyMode;

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You probably want:

var isReadOnlyMode = false;
if (config.isReadOnlyMode !== undefined) {
  isReadOnlyMode = config.isReadOnlyMode
}

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will change it undefined check, rather than typeof. Will send a new pull with the changes.


// Configuration
app.configure(function(){
Expand All @@ -36,36 +43,48 @@ module.exports = function(config) {
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

// Home
// Home
routes.config(config);
app.get('/', routes.index);
// Templates
app.get('/partials/:name', routes.partials);

// Get a list of databases and tables
app.get('/api/databases/tables', api.databasesAndTables);
// Add a database
app.post('/api/database/add', api.databaseAdd);
if(!isReadOnlyMode) {
app.post('/api/database/add', api.databaseAdd);
}
// Add a table
app.get('/api/databases', api.databases);
app.post('/api/table/add', api.tableAdd);
if(!isReadOnlyMode) {
app.post('/api/table/add', api.tableAdd);
}
// Delete a database
app.post('/api/database/delete', api.databaseDelete);
// Delete a table
app.post('/api/table/delete', api.tableDelete);
app.post('/api/table/empty', api.tableEmpty);
if(!isReadOnlyMode) {
app.post('/api/database/delete', api.databaseDelete);
}
// Delete a table
if(!isReadOnlyMode) {
app.post('/api/table/delete', api.tableDelete);
app.post('/api/table/empty', api.tableEmpty);
}

app.get('/api/table', api.table);
app.get('/api/table/list/:order/:skip/:limit', api.table);
app.get('/api/export/table', api.exportTable);
app.post('/api/import/table', api.importTable);

app.post('/api/doc/delete', api.docDelete);
app.post('/api/doc/update', api.docUpdate);
app.post('/api/doc/insert', api.docInsert);

app.post('/api/field/delete', api.fieldDelete);
app.post('/api/field/rename', api.fieldRename);
app.post('/api/field/add', api.fieldAdd);

if(!isReadOnlyMode) {
app.post('/api/import/table', api.importTable);

app.post('/api/doc/delete', api.docDelete);
app.post('/api/doc/update', api.docUpdate);
app.post('/api/doc/insert', api.docInsert);

app.post('/api/field/delete', api.fieldDelete);
app.post('/api/field/rename', api.fieldRename);
app.post('/api/field/add', api.fieldAdd);
}

// Redirect all others to the index
// A 404 page is probably a better move
Expand Down
2 changes: 2 additions & 0 deletions config.template.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@ exports.expressPort = 3000; // Port used by express
exports.debug = true; // Debug mode
exports.network = '127.0.0.1' // Network the node app will run on

exports.isReadOnlyMode = false;
exports.filterDB = ".*";
114 changes: 61 additions & 53 deletions routes/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ module.exports = function(config) {
})
}
else {
r.dbList().forEach(function(db) {
r.dbList().filter(function(dbName) {
return dbName.match(config.filterDB || '.*');
}).forEach(function(db) {
return r.expr({
x: [{
db: db,
Expand All @@ -72,7 +74,9 @@ module.exports = function(config) {
})
}
exports.databases = function (req, res) {
r.dbList().run( connection, {timeFormat: 'raw'}, function(error, dbs) {
r.dbList().filter(function(dbName) {
return dbName.match(config.filterDB || '.*');
}).run( connection, {timeFormat: 'raw'}, function(error, dbs) {
if (error) handleError(error);
res.json({
error: error,
Expand Down Expand Up @@ -867,64 +871,68 @@ module.exports = function(config) {
function flattenKeys(keys, prefix, numDocs) {
var result = [];

for(var i=0; i<keys.sorted_keys.length; i++) {
var hasNestedKeys;
if (keys.keys[keys.sorted_keys[i]].keys == null) {
hasNestedKeys = false;
}
else {
for(var key in keys.keys[keys.sorted_keys[i]].keys) {
hasNestedKeys = true;
break;
}
}

// Save the field if it's a primitive (at least once) or if it's an empty object
if ((keys.keys[keys.sorted_keys[i]].primitiveValueCount > 0) || (hasNestedKeys === false)) {
result.push(prefix.concat(keys.sorted_keys[i]))
}
else {
var count = 0;
for(var type in keys.keys[keys.sorted_keys[i]].type) {
count += keys.keys[keys.sorted_keys[i]].type[type]
}
if (typeof keys.keys[keys.sorted_keys[i]].primitiveCount === 'number') {
count += keys.keys[keys.sorted_keys[i]].primitiveCount;
}

if (count < numDocs) {
result.push(prefix.concat(keys.sorted_keys[i]))
}
}

// Recursively add more fields
if ((keys.keys[keys.sorted_keys[i]].type.object != null)
&& (keys.keys[keys.sorted_keys[i]].type.object > 0)) {
result.push.apply(result, flattenKeys(keys.keys[keys.sorted_keys[i]], prefix.concat([keys.sorted_keys[i]]), numDocs))
}
if(keys.sorted_keys){

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you need keys.sorted_keys? Isn't it always an array?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One of the errors, where keys.sorted_keys is undefined, as the some of the keys in the document, are guids. Just to unblock on the error, added the check for keys.sorted_keys. an example document.
[{"apiKeys":{"ZfVcjeBJlVrV1pA3KmNU4ThI3Brtz3n81WAtJBouGs8=":{"algo":"RS256","key":{"$reql_type$":"BINARY","data":"TmlLOUwKR0VONitKU1dmZ2NrUUNzNlVVQk9YU1pkcmVOTjl6YlFDd3l6ZWU3Yk9KcVhVREF1TGNG"
}}},
"encryptionKey":{"algo":"RS256","key":{"$reql_type$":"BINARY","data":"QVJ6UHcxRXNaQXlqVgp0R0NLSVEwL2J0cUsrakZ1blQyTkJDOFJJdGFuRFpwcHRRSURBUUFCCi0t"}},
"id":"test","owner":"testowner","tenant":"test_tenant"}]

for(var i=0; i<keys.sorted_keys.length; i++) {
var hasNestedKeys;
if (keys.keys[keys.sorted_keys[i]].keys == null) {
hasNestedKeys = false;
}
else {
for(var key in keys.keys[keys.sorted_keys[i]].keys) {
hasNestedKeys = true;
break;
}
}

// Save the field if it's a primitive (at least once) or if it's an empty object
if ((keys.keys[keys.sorted_keys[i]].primitiveValueCount > 0) || (hasNestedKeys === false)) {
result.push(prefix.concat(keys.sorted_keys[i]))
}
else {
var count = 0;
for(var type in keys.keys[keys.sorted_keys[i]].type) {
count += keys.keys[keys.sorted_keys[i]].type[type]
}
if (typeof keys.keys[keys.sorted_keys[i]].primitiveCount === 'number') {
count += keys.keys[keys.sorted_keys[i]].primitiveCount;
}

if (count < numDocs) {
result.push(prefix.concat(keys.sorted_keys[i]))
}
}

// Recursively add more fields
if ((keys.keys[keys.sorted_keys[i]].type.object != null)
&& (keys.keys[keys.sorted_keys[i]].type.object > 0)) {
result.push.apply(result, flattenKeys(keys.keys[keys.sorted_keys[i]], prefix.concat([keys.sorted_keys[i]]), numDocs))
}
}
}
return result
}
function nestedKeys(keys, prefix) {
var result = [];
prefix = prefix || []

for(var i=0; i<keys.sorted_keys.length; i++) {
if ((keys.keys[keys.sorted_keys[i]].type.object != null)
&& (keys.keys[keys.sorted_keys[i]].type.object > 0)) {

result.push({
field: keys.sorted_keys[i],
prefix: prefix,
nested: nestedKeys( keys.keys[keys.sorted_keys[i]], prefix.concat([keys.sorted_keys[i]]))
})
}
else {
result.push({
field: keys.sorted_keys[i],
prefix: prefix
})
}
if(keys.sorted_keys){
for(var i=0; i<keys.sorted_keys.length; i++) {
if ((keys.keys[keys.sorted_keys[i]].type.object != null)
&& (keys.keys[keys.sorted_keys[i]].type.object > 0)) {

result.push({
field: keys.sorted_keys[i],
prefix: prefix,
nested: nestedKeys( keys.keys[keys.sorted_keys[i]], prefix.concat([keys.sorted_keys[i]]))
})
}
else {
result.push({
field: keys.sorted_keys[i],
prefix: prefix
})
}
}
}
return result
}
Expand Down
10 changes: 8 additions & 2 deletions routes/index.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
var appConfig = null;

exports.config = function(config){
appConfig = config;
};

exports.index = function(req, res){
res.render('index');
res.render('index', {"isReadOnlyMode": appConfig.isReadOnlyMode});
};

exports.partials = function (req, res) {
var name = req.params.name;
res.render('partials/' + name);
res.render('partials/' + name , {"isReadOnlyMode": appConfig.isReadOnlyMode});
};
7 changes: 5 additions & 2 deletions views/partials/index.jade
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
div.home(ng-switch="", on="status")
div.actions
unless isReadOnlyMode
a(href="/add/db") Add a database
a(href="/add/table/{{db}}") Add a table

Expand All @@ -18,13 +19,15 @@ div.home(ng-switch="", on="status")
ul.database(ng-repeat="db in dbs")
li.database
div.database
a.meta_action(href="/delete/db/{{db.db}}") Delete
unless isReadOnlyMode
a.meta_action(href="/delete/db/{{db.db}}") Delete

i.icon-th-large
a.db_name.black.bold(href="/db/{{db.db}}") {{db.db}}
ul.tables
li.table(ng-repeat="table in db.tables")
a.meta_action(href="/delete/table/{{db.db}}/{{table}}") Delete
unless isReadOnlyMode
a.meta_action(href="/delete/table/{{db.db}}/{{table}}") Delete

i.icon-th
a.gray(href="/table/{{db.db}}/{{table}}") {{table}}
Loading