var express = require("express") , _ = require("underscore") , HTTPResult = require("../util/http-result") , etags = require("../util/etags") ; module.exports = function(couch,schema) { var exports = {}; var util = require('./util')(couch,schema); var app = exports.app = express(); app.get('/', util.ensureMIME(util.JSON_MIME), function(req,res) { var url; if ( 'drafts' in req.query ) { url = '_design/surveys/_view/drafts'; } else if ( 'published' in req.query ) { url = '_design/surveys/_view/published'; } else { url = '_design/default/_view/by_type?key='+JSON.stringify('Survey'); } couch.get(url) .handle({ '-1': _.identity, 200: function(result) { return _.map(result.rows, function(item) { return item.value; }); }, default: util.handleUnknownResponse }) .handle({'-1': util.handleException}) .handle(res.send.bind(res)); }); app.post('/', util.ensureMIME(util.JSON_MIME), function(req,res) { var doc = req.body; var hr; if ( !util.areDocsUnique(doc.questions) ) { hr = new HTTPResult(400,{error:"Survey contains duplicate questions."}); } else if ( util.isDocPublished(doc) && !util.areDocsPublished(doc.questions) ) { hr = new HTTPResult(400,{error:"Cannot publish Survey with unpublished questions."}); } else { hr = util.postDocument('Survey',doc); } hr.handle({'-1': util.handleException}) .handle(res.send.bind(res)); }); app.get('/:id', util.ensureMIME(util.JSON_MIME), util.makeDocGet_id('Survey')); 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); if ( !util.areDocsUnique(doc.questions) ) { new HTTPResult(400,{error:"Survey contains duplicate questions."}) .handle(res.send.bind(res)); } else if ( util.isDocPublished(doc) && !util.areDocsPublished(doc.questions) ) { new HTTPResult(400,{error:"Cannot publish Survey with unpublished questions."}) .handle(res.send.bind(res)); } else { util.putDocument(id,rev,'Survey',doc) .handle({ '-1': function(result) { util.handleException(result) .handle(res.send.bind(res)); }, 201: function(doc) { res.set({ 'ETag': etags.format([doc._rev]) }).send(201, doc); }, default: res.send.bind(res) }); } }); app.delete('/:id', util.ensureMIME(util.JSON_MIME), util.makeDocDel_id('Survey')); return exports; };