104 lines
2.8 KiB
JavaScript
104 lines
2.8 KiB
JavaScript
var couchapp = require('couchapp')
|
|
, path = require('path')
|
|
;
|
|
|
|
ddoc =
|
|
{ _id:'_design/removalist'
|
|
, rewrites :
|
|
[ {from:"/", to:'pages/index.html'}
|
|
, {from:"/api/csv", to:'_list/csv/all'}
|
|
, {from:"/api/headers", to:'_list/array/headers', query: {group: "true"}}
|
|
, {from:"/api/rows", to:'_view/all'}
|
|
, {from:"/api", to:'../../'}
|
|
, {from:"/api/*", to:'../../*'}
|
|
, {from:"/*", to:'*'}
|
|
]
|
|
}
|
|
;
|
|
|
|
ddoc.views = {
|
|
/**
|
|
* A simple map function mocking _all, but allows usage with lists etc.
|
|
*/
|
|
all: {
|
|
map: function(doc) {
|
|
emit(doc.id, doc);
|
|
}
|
|
},
|
|
headers: {
|
|
map: function(doc) {
|
|
var keys = [];
|
|
for (var key in doc) {
|
|
emit(key, 1);
|
|
}
|
|
},
|
|
reduce: "_sum"
|
|
}
|
|
};
|
|
|
|
ddoc.lists = {
|
|
/**
|
|
* Generates a CSV from all the rows in the view.
|
|
*
|
|
* Takes in a url encoded array of headers as an argument. You can
|
|
* generate this by querying /_list/urlencode/headers. Pass it in
|
|
* as the headers get parameter, e.g.: ?headers=%5B%22_id%22%2C%22_rev%5D
|
|
*
|
|
* @author Max Ogden
|
|
*/
|
|
csv: function(head, req) {
|
|
if ('headers' in req.query) {
|
|
var headers = JSON.parse(unescape(req.query.headers));
|
|
|
|
var row, sep = '\n', headerSent = false, startedOutput = false;
|
|
|
|
start({"headers":{"Content-Type" : "text/csv; charset=utf-8"}});
|
|
send('"' + headers.join('","') + '"\n');
|
|
while (row = getRow()) {
|
|
for (var header in headers) {
|
|
if (row.value[headers[header]]) {
|
|
if (startedOutput) send(",");
|
|
var value = row.value[headers[header]];
|
|
if (typeof(value) == "object") value = JSON.stringify(value);
|
|
if (typeof(value) == "string") value = value.replace(/\"/g, '""');
|
|
send("\"" + value + "\"");
|
|
} else {
|
|
if (startedOutput) send(",");
|
|
}
|
|
startedOutput = true;
|
|
}
|
|
startedOutput = false;
|
|
send('\n');
|
|
}
|
|
} else {
|
|
send("You must pass in the urlencoded headers you wish to build the CSV from. Query /_list/urlencode/headers?group=true");
|
|
}
|
|
},
|
|
/**
|
|
* Returns an array of the view keys
|
|
*
|
|
* @author Max Ogden
|
|
*/
|
|
array: function(head, req) {
|
|
start({"headers":{"Content-Type" : "application/json"}});
|
|
if ('callback' in req.query) send(req.query['callback'] + "(");
|
|
|
|
var headers = [];
|
|
while (row = getRow()) {
|
|
headers.push(row.key);
|
|
}
|
|
send(JSON.stringify(headers));
|
|
|
|
if ('callback' in req.query) send(")");
|
|
}
|
|
}
|
|
|
|
ddoc.validate_doc_update = function (newDoc, oldDoc, userCtx) {
|
|
if (newDoc._deleted === true && userCtx.roles.indexOf('_admin') === -1) {
|
|
throw "Only admin can delete documents on this database.";
|
|
}
|
|
};
|
|
|
|
couchapp.loadAttachments(ddoc, path.join(__dirname, 'attachments'));
|
|
|
|
module.exports = ddoc; |