source: Dev/trunk/src/server/api/surveys.js @ 525

Last change on this file since 525 was 525, checked in by hendrikvanantwerpen, 11 years ago
  • Allow empty subcodes.
  • Use HTTPResult exclusively on server (no more q).
  • Set readonly & disabled on ourselves as well in _ComplexValueMixin
  • Split server into several modules.
  • Check codes on the variable level, not question level.
  • We can add modules in design documents now.
File size: 3.0 KB
Line 
1var express = require("express")
2  , _ = require("underscore")
3  , HTTPResult = require("../util/http-result")
4  , etags = require("../util/etags")
5  ;
6
7module.exports = function(couch,schema) {
8    var exports = {};
9    var util = require('./util')(couch,schema);
10    var app = exports.app = express();
11
12    app.get('/',
13        util.ensureMIME(util.JSON_MIME),
14        function(req,res) {
15            var url;
16            if ( 'drafts' in req.query ) {
17                url = '_design/surveys/_view/drafts';
18            } else if ( 'published' in req.query ) {
19                url = '_design/surveys/_view/published';
20            } else {
21                url = '_design/default/_view/by_type?key='+JSON.stringify('Survey');
22            }
23            couch.get(url)
24            .handle({
25                200: function(result) {
26                    return _.map(result.rows, function(item) {
27                        return item.value;
28                    });
29                },
30                default: util.handleUnknownResponse
31            })
32            .handle(res.send.bind(res));
33        });
34    app.post('/',
35        util.ensureMIME(util.JSON_MIME),
36        function(req,res) {
37            var doc = req.body;
38            var hr;
39            if ( !util.areDocsUnique(doc.questions) ) {
40                hr = new HTTPResult(400,{error:"Survey contains duplicate questions."});
41            } else if ( util.isDocPublished(doc) &&
42                        !util.areDocsPublished(doc.questions) ) {
43                hr = new HTTPResult(400,{error:"Cannot publish Survey with unpublished questions."});
44            } else {
45                hr = util.postDocument('Survey',doc);
46            }
47            hr.handle(res.send.bind(res));
48        });
49    app.get('/:id',
50        util.ensureMIME(util.JSON_MIME),
51        util.makeDocGet_id('Survey'));
52    app.put('/:id',
53        util.ensureMIME(util.JSON_MIME),
54        function(req,res) {
55            var id = req.params.id;
56            var doc = req.body;
57            var rev = etags.parse(req.header('If-Match'))[0] || (doc && doc._rev);
58            if ( !util.areDocsUnique(doc.questions) ) {
59                new HTTPResult(400,{error:"Survey contains duplicate questions."})
60                .handle(res.send.bind(res));
61            } else if ( util.isDocPublished(doc) &&
62                        !util.areDocsPublished(doc.questions) ) {
63                new HTTPResult(400,{error:"Cannot publish Survey with unpublished questions."})
64                .handle(res.send.bind(res));
65            } else {
66                util.putDocument(id,rev,'Survey',doc)
67                .handle({
68                    201: function(doc) {
69                        res.set({
70                            'ETag': etags.format([doc._rev])
71                        }).send(201, doc);
72                    },
73                    default: res.send.bind(res)
74                });
75            }
76        });
77    app.delete('/:id',
78        util.ensureMIME(util.JSON_MIME),
79        util.makeDocDel_id('Survey'));
80    return exports;
81};
Note: See TracBrowser for help on using the repository browser.