var q = require('q'); var http = require('q-io/http'); var fs = require('q-io/fs'); var _ = require('underscore'); var dbURL = "http://localhost:5984/"; var designDocs = require('./couchdb-design-docs'); function stringifyFunctions(value) { if ( value === null ) { return null; } else if ( _.isArray(value) ) { return value; } else if ( _.isFunction(value) ) { return value.toString(); } else if ( _.isObject(value) ) { value = _.clone(value); _.each(value, function(propValue, propName){ value[propName] = stringifyFunctions(propValue); }); return value; } else { return value; } } function request(method,path,content) { var url = dbURL+path; return http.request({ url: url, method: method, headers: { 'content-type': 'application/json; charset=utf-8', 'accept': 'application/json' }, body: { forEach: function(callback) { callback(JSON.stringify(content || {})); } } }).then(function(res){ return res.body.read().then(function(content){ return JSON.parse(content); }); },function(res){ return res.body.read().then(function(error){ return JSON.parse(error); }); }); } console.log("Configuring CouchDB for QED"); console.log("Checking CouchDB version"); request('GET','') .then(function(res){ if (res.version !== "1.2.0" ) { console.log("Found "+res.version+", only tested with CouchDB 1.2.0"); } else { console.log("CouchDB 1.2.0 found"); } console.log("Checking database 'qed'"); }).then(function(res){ return request('GET','qed') .then(function(res){ if (res.error) { console.log("Creating database 'qed'"); return request('PUT','qed'); } else { console.log("Database 'qed' found."); return null; } },function(err){ console.log("Creating database 'qed'"); return request('PUT','qed'); }); }).then(function(){ console.log("Putting documents in database."); designDocs = stringifyFunctions(designDocs); return q.all(_.map(designDocs, function(doc,docUrl){ var configAction = doc.__configAction; delete doc.__configAction; switch (configAction) { case "ignore": console.log(docUrl+" ignored."); case "update": console.log(docUrl+" updating."); return request('GET',docUrl) .then(function(oldDoc){ _.extend(oldDoc,doc); return request('PUT',docUrl,oldDoc); },function(){ return request('PUT',docUrl,doc); }); case "replace": default: console.log(docUrl+" replacing."); return request('GET',docUrl) .then(function(oldDoc){ _.extend(oldDoc,_.pick(oldDoc,'_rev')); return request('PUT',docUrl,doc); },function(){ return request('PUT',docUrl,doc); }); } })); }).then(function(){ console.log("Done!"); },function(err){ console.error("ERROR",err); });