forked from LocalData/localdata-api
/
responses.js
150 lines (137 loc) · 4.98 KB
/
responses.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
* ==================================================
* Responses
* ==================================================
*
* Collects responses from web, mobile, and paper forms.
*
* Data structure:
* responses: [
* { parcel_id: '10', responses: {'Q0': 0, 'Q1': 3}},
* { parcel_id: '11', responses: {'Q0': 1, 'Q1': 2}}
* ]
*
*/
var util = require('./util');
module.exports = {
setup: setup
};
var handleError = util.handleError;
/*
* app: express server
* db: mongodb database
* idgen: unique ID generator
* collectionName: name of responses collection
*/
function setup(app, db, idgen, collectionName) {
function getCollection(cb) {
return db.collection(collectionName, cb);
}
// Get all responses for a survey.
// GET http://localhost:3000/surveys/{SURVEY ID}/responses
// GET http://localhost:3000/surveys/1/responses
app.get('/surveys/:sid/responses', function(req, response) {
var surveyid = req.params.sid;
getCollection(function(err, collection) {
collection.find({'survey': surveyid}, function(err, cursor) {
if (err != null) {
console.log('Error retrieving responses for survey ' + surveyid + ': ' + err.message);
response.send();
return;
}
cursor.toArray(function(err, items) {
response.send({responses: items});
});
});
});
});
// Get all responses for a specific parcel.
// TODO: At some point, parcel should become a generic geographic object ID.
// GET http://localhost:3000/surveys/{SURVEY ID}/parcels/{PARCEL ID}/responses
// GET http://localhost:3000/surveys/1/parcels/{PARCEL ID}/responses
app.get('/surveys/:sid/parcels/:parcel_id/responses', function(req, response) {
var surveyid = req.params.sid;
var parcel_id = req.params.parcel_id;
getCollection(function(err, collection) {
collection.find({'survey': surveyid, 'parcel_id': parcel_id}, function(err, cursor) {
if (err != null) {
console.log('Error retrieving responses for survey ' + surveyid + ': ' + err.message);
response.send();
return;
}
cursor.toArray(function(err, items) {
response.send({responses: items});
});
});
});
});
// Get a response for a survey.
// GET http://localhost:3000/surveys/{SURVEY ID}/responses/{RESPONSE ID}
// GET http://localhost:3000/surveys/1/responses/2ec140e0-827f-11e1-83d8-bf682a6ee038
app.get('/surveys/:sid/responses/:rid', function(req, response) {
var surveyid = req.params.sid;
var responseid = req.params.rid;
getCollection(function(err, collection) {
collection.find({'survey': surveyid, 'id': responseid}, function(err, cursor) {
if (handleError(err, response)) return;
cursor.toArray(function(err, items) {
if (items.length > 1) {
console.log('!!! WARNING: There should only be one response with a given id attached to a survey.');
console.log('!!! Found ' + items.length);
console.log('!!! Responses: ' + JSON.stringify(items));
}
if (items.length > 0) {
response.send({response: items[0]});
} else {
response.send({});
}
});
});
});
});
// Add responses for a survey.
// POST http://localhost:3000/surveys/{SURVEY ID}/reponses
// POST http://localhost:3000/surveys/1/reponses
app.post('/surveys/:sid/responses', function(req, response) {
console.log(req.body);
console.log(JSON.stringify(req.body, null, ' '));
var resps = req.body.responses;
var total = resps.length;
console.log('Adding ' + total + ' responses to the database.');
var count = 0;
getCollection(function(err, collection) {
var surveyid = req.params.sid;
// Iterate over each survey response we received.
resps.forEach(function(resp) {
var id = idgen();
resp.id = id;
resp.survey = surveyid;
// Add response to database.
collection.insert(resp, function() {
// Check if we've added all of them.
if (++count == total) {
response.send({responses: resps});
}
});
});
});
});
// Delete all responses for a survey.
// This is maintainence functionality. Regular clients should not delete forms.
// DELETE http://localhost:3000/surveys/{SURVEY ID}/reponses
// DELETE http://localhost:3000/surveys/1/reponses
app.del('/surveys/:sid/responses', function(req, response) {
var survey = req.params.sid;
console.log('!!! Deleting responses for survey ' + survey + ' from the database.');
getCollection(function(err, collection) {
collection.remove({survey: survey}, {safe: true}, function(error, count) {
if (error != null) {
console.log('Error removing responses for survey ' + survey + ' from the response collection: ' + err.message);
response.send();
} else {
response.send({count: count});
}
});
});
});
} // setup()