source: Dev/trunk/src/server/api/surveyRuns.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.6 KB
Line 
1var express = require("express")
2  , HTTPResult = require("../util/http-result")
3  , cryptoken = require("../util/crypto-token")
4  , etags = require("../util/etags")
5  , _ = require('underscore')
6  ;
7
8module.exports = function(couch,schema) {
9    var exports = {};
10
11    var util = require('./util')(couch,schema);
12    var responses = require('./responses')(couch,schema);
13    var app = exports.app = express();
14
15    app.get('/',
16        util.ensureMIME(util.JSON_MIME),
17        util.makeDocsGet('SurveyRun'));
18    app.post('/',
19        util.ensureMIME(util.JSON_MIME),
20        function(req,res) {
21            var doc = req.body;
22            var hr;
23            if ( !util.isDocPublished(doc.survey) ) {
24                hr = new HTTPResult(400,{error:"Cannot run unpublished survey."});
25            } else {
26                hr = cryptoken()
27                .then(function(token) {
28                    doc.secret = token;
29                    return util.postDocument('SurveyRun',doc);
30                });
31            }
32            hr.handle(res.send.bind(res));
33        });
34    app.get('/:id',
35        util.ensureMIME(util.JSON_MIME),
36        util.makeDocGet_id('SurveyRun'));
37    app.put('/:id',
38        util.ensureMIME(util.JSON_MIME),
39        function (req,res) {
40            var id = req.params.id;
41            var doc = req.body;
42            var rev = etags.parse(req.header('If-Match'))[0] || (doc && doc._rev);
43            var hr;
44            if ( !util.isDocPublished(doc.survey) ) {
45                hr = new HTTPResult(400,{error:"Cannot run unpublished survey."});
46            } else if ( typeof doc.secret === 'undefined' ) {
47                hr = cryptoken()
48                .then(function(token) {
49                    doc.secret = token;
50                    return util.putDocument(id,rev,'SurveyRun',doc);
51                });
52            } else {
53                hr = util.putDocument(id,rev,'SurveyRun',doc);
54            }
55            hr.handle(res.send.bind(res));
56        });
57    app.delete('/:id',
58        util.ensureMIME(util.JSON_MIME),
59        function(req,res) {
60            var id = req.params.id;
61            var doc = req.body;
62            var rev = etags.parse(req.header('If-Match'))[0] || (doc && doc._rev);
63            responses.getResponsesBySurveyRunId(id)
64            .handle({
65                200: function(responses) {
66                    if ( responses.length > 0 ) {
67                        return new HTTPResult(403,{error:"Cannot delete run that has responses."});
68                    } else {
69                        return util.deleteDocument(id,rev);
70                    }
71                }
72            }).handle(res.send.bind(res));
73        });
74    app.get('/:id/responses',
75        util.ensureMIME(util.JSON_MIME),
76        function(req,res) {
77            var id = req.params.id;
78            responses.getResponsesBySurveyRunId(id)
79            .handle(res.send.bind(res));
80        });
81    app.get('/:id/responses.csv',
82        util.ensureMIME(util.CSV_MIME),
83        function(req, res) {
84            var id = req.params.id;
85            responses.getResponsesBySurveyRunId(id)
86            .handle({
87                200: function(responses) {
88                    var answers = _.map(responses,function(response){
89                        return response.answers;
90                    });
91                    res.set({
92                        'Content-Disposition': 'attachment; filename=surveyRun-'+id+'-responses.csv'
93                    });
94                    res.status(200);
95                    util.writeObjectsToCSVStream(answers, res);
96                    res.end();
97                },
98                default: res.send.bind(res)
99            });
100        });
101    return exports;
102};
Note: See TracBrowser for help on using the repository browser.