var express = require("express") , HTTPResult = require("../util/http-result") , etags = require("../util/etags") , cryptoken = require("../util/crypto-token") , _ = require('underscore') ; module.exports = function(couch,schema) { var exports = {}; var util = require('./util')(couch,schema); var app = exports.app = express(); var getResponsesBySurveyRunId = exports.getResponsesBySurveyRunId = function(surveyRunId) { return couch.get('_design/responses/_view/by_surveyrun', {query:{key:surveyRunId,reduce:false,include_docs:true}}) .handle({ '-1': _.identity, 200: util.handleRowDocs, default: util.handleUnknownResponse }); }; app.get('/', util.ensureMIME(util.JSON_MIME), function(req,res){ var hr; if ( 'surveyRunId' in req.query ) { hr = getResponsesBySurveyRunId(req.query.surveyRunId); } else { hr = util.getDocumentsOfType('Response'); } hr.handle({'-1': util.handleException}) .handle(res.send.bind(res)); }); app.get('/:id', util.ensureMIME(util.JSON_MIME), util.makeDocGet_id('Response')); app.post('/api/responses', util.ensureMIME(util.JSON_MIME), function (req,res) { var doc = req.body; cryptoken() .then(function(token) { doc.secret = token; return util.postDocument('Response',doc); }) .handle({'-1': util.handleException}) .handle(res.send.bind(res)); }); app.put('/:id', util.ensureMIME(util.JSON_MIME), function (req,res) { var id = req.params.id; var doc = req.body; var rev = etags.parse(req.header('If-Match'))[0] || (doc && doc._rev); var hr; if ( typeof doc.secret === 'undefined' ) { hr = util.randomToken() .handle({ 201: function(token) { doc.secret = token; return util.putDocument(id,rev,'Response',doc); } }); } else { hr = util.putDocument(id,rev,'Response',doc); } hr.handle({'-1': util.handleException}) .handle(res.send.bind(res)); }); app.delete('/:id', util.ensureMIME(util.JSON_MIME), util.makeDocDel_id('Response')); return exports; };