1 | var q = require('q'); |
---|
2 | var http = require('q-io/http'); |
---|
3 | var fs = require('q-io/fs'); |
---|
4 | var _ = require('underscore'); |
---|
5 | |
---|
6 | var dbURL = "http://localhost:5984/"; |
---|
7 | var designDocs = require('./couchdb-design-docs'); |
---|
8 | |
---|
9 | function stringifyFunctions(value) { |
---|
10 | if ( value === null ) { |
---|
11 | return null; |
---|
12 | } else if ( _.isArray(value) ) { |
---|
13 | return value; |
---|
14 | } else if ( _.isFunction(value) ) { |
---|
15 | return value.toString(); |
---|
16 | } else if ( _.isObject(value) ) { |
---|
17 | value = _.clone(value); |
---|
18 | _.each(value, function(propValue, propName){ |
---|
19 | value[propName] = stringifyFunctions(propValue); |
---|
20 | }); |
---|
21 | return value; |
---|
22 | } else { |
---|
23 | return value; |
---|
24 | } |
---|
25 | } |
---|
26 | |
---|
27 | function request(method,path,content) { |
---|
28 | var url = dbURL+path; |
---|
29 | return http.request({ |
---|
30 | url: url, |
---|
31 | method: method, |
---|
32 | headers: { |
---|
33 | 'content-type': 'application/json; charset=utf-8', |
---|
34 | 'accept': 'application/json' |
---|
35 | }, |
---|
36 | body: { |
---|
37 | forEach: function(callback) { |
---|
38 | callback(JSON.stringify(content || {})); |
---|
39 | } |
---|
40 | } |
---|
41 | }).then(function(res){ |
---|
42 | return res.body.read().then(function(content){ |
---|
43 | return JSON.parse(content); |
---|
44 | }); |
---|
45 | },function(res){ |
---|
46 | return res.body.read().then(function(error){ |
---|
47 | return JSON.parse(error); |
---|
48 | }); |
---|
49 | }); |
---|
50 | } |
---|
51 | |
---|
52 | console.log("Configuring CouchDB for QED"); |
---|
53 | console.log("Checking CouchDB version"); |
---|
54 | request('GET','') |
---|
55 | .then(function(res){ |
---|
56 | if (res.version !== "1.2.0" ) { |
---|
57 | console.log("Found "+res.version+", only tested with CouchDB 1.2.0"); |
---|
58 | } else { |
---|
59 | console.log("CouchDB 1.2.0 found"); |
---|
60 | } |
---|
61 | console.log("Checking database 'qed'"); |
---|
62 | }).then(function(res){ |
---|
63 | return request('GET','qed') |
---|
64 | .then(function(res){ |
---|
65 | console.log("Database 'qed' found."); |
---|
66 | },function(err){ |
---|
67 | console.log("Creating database 'qed'"); |
---|
68 | return request('PUT','qed'); |
---|
69 | }); |
---|
70 | }).then(function(){ |
---|
71 | console.log("Putting documents in database."); |
---|
72 | designDocs = stringifyFunctions(designDocs); |
---|
73 | return q.all(_.map(designDocs, function(doc,docUrl){ |
---|
74 | var configAction = doc.__configAction; |
---|
75 | delete doc.__configAction; |
---|
76 | switch (configAction) { |
---|
77 | case "ignore": |
---|
78 | console.log(docUrl+" ignored."); |
---|
79 | case "update": |
---|
80 | console.log(docUrl+" updating."); |
---|
81 | return request('GET',docUrl) |
---|
82 | .then(function(oldDoc){ |
---|
83 | _.extend(oldDoc,doc); |
---|
84 | return request('PUT',docUrl,oldDoc); |
---|
85 | },function(){ |
---|
86 | return request('PUT',docUrl,doc); |
---|
87 | }); |
---|
88 | case "replace": |
---|
89 | default: |
---|
90 | console.log(docUrl+" replacing."); |
---|
91 | return request('GET',docUrl) |
---|
92 | .then(function(oldDoc){ |
---|
93 | _.extend(doc,_.pick(oldDoc,'_id','_rev')); |
---|
94 | return request('PUT',docUrl,doc); |
---|
95 | },function(){ |
---|
96 | return request('PUT',docUrl,doc); |
---|
97 | }); |
---|
98 | } |
---|
99 | })); |
---|
100 | }).then(function(){ |
---|
101 | console.log("Done!"); |
---|
102 | },function(err){ |
---|
103 | console.error("ERROR",err); |
---|
104 | }); |
---|