var q = require('q'), request = require('../util/q-request'), _ = require('underscore'), util = require('util'); var designDocs = require('./couchdb-design-docs'); module.exports = function(couchDbURL) { 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 dbRequest(method,path,content) { var url = couchDbURL+path; var options = { method: method, headers: { 'content-type': 'application/json; charset=utf-8', 'accept': 'application/json' }, body: JSON.stringify(content) }; //console.log('req',url,options); return request(url,options).then(function(res){ return JSON.parse(res); }, function(err){ return JSON.parse(err); }); } console.log("Configuring CouchDB for QED"); console.log("Checking CouchDB version"); return dbRequest('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"); } }).then(function(res){ console.log("Checking database 'qed'"); return dbRequest('GET','qed') .then(function(res){ console.log("Database 'qed' found."); },function(err){ console.log("Creating database 'qed'"); return dbRequest('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 || "replace"; delete doc.__configAction; switch (configAction) { case "ignore": console.log(docUrl+" ignored."); break; case "update": console.log(docUrl+" updating."); return dbRequest('GET',docUrl) .then(function(oldDoc){ _.extend(oldDoc,doc); return dbRequest('PUT',docUrl,oldDoc); },function(){ return dbRequest('PUT',docUrl,doc); }); case "replace": console.log(docUrl+" replacing."); return dbRequest('GET',docUrl) .then(function(oldDoc){ _.extend(doc,_.pick(oldDoc,'_id','_rev')); return dbRequest('PUT',docUrl,doc); },function(){ return dbRequest('PUT',docUrl,doc); }); default: console.warn("Unknown action",configAction); break; } })); }).then(function(results){ console.log("Done!"); },function(err){ console.error("ERROR",err,err.stack); }); };