source: Dev/trunk/src/server/config/couchdb-design-docs.js

Last change on this file was 531, checked in by hendrikvanantwerpen, 11 years ago
  • Return to using truly ISO formatted dates, including milliseconds.
  • Also set constraint on surveyrun dates when value is initially set.
  • Separate runs & results from surveys and questions.
  • Moved date & email format to schema itself.
File size: 7.2 KB
Line 
1var fs = require('fs')
2  , path = require('path')
3  ;
4
5function readModule(name) {
6    var filename;
7    if ( name.indexOf('.') === 0 ) {
8        filename = path.join(path.dirname(module.filename),name+'.js');
9    } else {
10        var dirname = path.join(path.dirname(module.filename),
11                                '../../node_modules',name);
12        filename = path.join(dirname,name+'.js');
13        var pkgfile = path.join(dirname,'package.json');
14        if ( fs.exists(pkgfile) ) {
15            var pkg = require(pkgfile);
16            if ( pkg.main ) {
17                filename = path.join(dirname,pkg.main);
18            }
19        }
20    }
21    var src = fs.readFileSync(filename, 'utf8');
22    src = src.replace(/require\s*\(\s*(['\"])([^'"]*)(['\"])\s*\)/g,
23                      'require($1views/lib/$2$3)');
24    return src;
25}
26
27module.exports = {
28
29    "schemaInfo": {
30        _id: "schemaInfo",
31        version: "4",
32        viewsVersion: "2"
33    },
34
35    "_design/protectPublished": {
36        __configAction: "replace",
37        language: "javascript",
38        validate_doc_update: function(newDoc, oldDoc, userCtx, secObj) {
39            if ( oldDoc && oldDoc.publicationDate ) {
40                throw({forbidden:'Published documents cannot be modified.'});
41            }
42        }
43    },
44
45    "_design/default": {
46        __configAction: "replace",
47        language: "javascript",
48        views: {
49            by_type: {
50                map: function(doc){
51                    emit(doc.type, 1);
52                },
53                reduce: function(keys,values){ return sum(values); }
54            },
55            typeless: {
56                map: function(doc){
57                    if ( !doc.type ) {
58                        emit(doc._id, doc);
59                    }
60                }
61            }
62        }
63    },
64
65    "_design/questions": {
66        __configAction: "replace",
67        language: "javascript",
68        views: {
69            all: {
70                map: function(doc){
71                    if ( doc.type !== 'Question' ) { return; }
72                    if ( doc.categories && doc.categories.length > 0 ) {
73                        for ( var i = 0; i < doc.categories.length; i++ ) {
74                            emit([doc.categories[i],doc.topic||"(default)"],1);
75                        }
76                    } else {
77                        emit(["(default)","(default)"],1);
78                    }
79                },
80                reduce: function(keys,values){ return sum(values); }
81            },
82            published: {
83                map: function(doc){
84                    if ( doc.type!=='Question' || !doc.publicationDate ) { return; }
85                    if ( doc.categories && doc.categories.length > 0 ) {
86                        for ( var i = 0; i < doc.categories.length; i++ ) {
87                            emit([doc.categories[i],doc.topic||"(default)"],1);
88                        }
89                    } else {
90                        emit(["(default)","(default)"],1);
91                    }
92                },
93                reduce: function(keys,values){ return sum(values); }
94            },
95            all_topics: {
96                map: function(doc){
97                    if( doc.type !== 'Question' ){ return; }
98                    emit(doc.topic||"(default)",1);
99                },
100                reduce: function(key, values, rereduce) { return sum(values); }
101            },
102            published_topics: {
103                map: function(doc){
104                    if ( doc.type !== 'Question' || !doc.publicationDate ) { return; }
105                    emit(doc.topic||"(default)",1);
106                },
107                reduce: function(key, values ) { return sum(values); }
108            },
109            all_variables: {
110                map: function(doc) {
111                    if ( doc.type !== 'Question' ) { return; }
112                    var _ = require('views/lib/underscore');
113                    var objF = require('views/lib/object');
114                    _.chain(objF.collectFields('subcode',doc.content))
115                    .map(function(subcode){
116                        return doc.code+subcode;
117                    })
118                    .each(function(variable){
119                        emit(variable,doc._id);
120                    });
121                }
122            },
123            published_variables: {
124                map: function(doc) {
125                    if ( doc.type !== 'Question' || !doc.publicationDate ) { return; }
126                    var _ = require('views/lib/underscore');
127                    var objF = require('views/lib/object');
128                    _.chain(objF.collectFields('subcode',doc.content))
129                    .map(function(subcode){
130                        return doc.code+subcode;
131                    })
132                    .each(function(variable){
133                        emit(variable,doc._id);
134                    });
135                }
136            },
137            all_by_code: {
138                map: function(doc){
139                    if ( doc.type !== 'Question' ) { return; }
140                    emit(doc.code,1);
141                },
142                reduce: function(key, values) { return sum(values); }
143            },
144            published_by_code: {
145                map: function(doc){
146                    if ( doc.type !== 'Question' ||
147                         !doc.publicationDate ) { return; }
148                    emit(doc.code,1);
149                },
150                reduce: function(key, values) { return sum(values); }
151            },
152            lib: {
153                underscore: readModule('underscore'),
154                object: readModule('../util/object')
155            }
156        }
157    },
158
159    "_design/surveys": {
160        __configAction: "replace",
161        language: "javascript",
162        views: {
163            drafts: {
164                map: function(doc){
165                    if ( doc.type !== 'Survey' ||
166                         doc.publicationDate ) { return; }
167                    emit(doc._id,doc);
168                }
169            },
170            published: {
171                map: function(doc){
172                    if ( doc.type !== 'Survey' ||
173                         !doc.publicationDate ) { return; }
174                    emit(doc._id,doc);
175                }
176            }
177        }
178    },
179
180    "_design/surveyRuns": {
181        __configAction: "replace",
182        language: "javascript",
183        views: {
184            by_start_date: {
185                map: function(doc){
186                    if ( doc.type !== 'SurveyRun' ) { return; }
187                    emit(doc.startDate||null,1);
188                },
189                reduce: function(keys,values){ return sum(values); }
190            },
191            by_end_date: {
192                map: function(doc){
193                    if ( doc.type !== 'SurveyRun' ) { return; }
194                    emit(doc.endDate||{},1);
195                },
196                reduce: function(keys,values){ return sum(values); }
197            }
198        }
199    },
200
201    "_design/responses": {
202        __configAction: "replace",
203        language: "javascript",
204        views: {
205            by_surveyrun: {
206                map: function(doc){
207                    if ( doc.type !== 'Response' ) { return; }
208                    emit(doc.surveyRunId, 1);
209                },
210                reduce: function(keys,values){ return sum(values); }
211            }
212        }
213    }
214
215};
Note: See TracBrowser for help on using the repository browser.