blob: 5301a737a00a28851cc65c55d7e272673833de9e [file] [log] [blame]
var request = require('request');
function main(msg) {
console.log("cloudant trigger feed: ", msg);
// lifecycleEvent is one of [ create, delete ]
var lifecycleEvent = (msg.lifecycleEvent || 'CREATE').trim().toUpperCase();
var namespace = process.env.__OW_NAMESPACE;
var triggerName = parseQName(msg.triggerName).name;
var trigger = '/' + namespace + '/' + triggerName;
var replaceNameTrigger = trigger.replace(/\//g, ":");
// configuration parameters
var provider_endpoint = msg.package_endpoint;
var dbname = msg.dbname;
var user = msg.username;
var pass = msg.password;
var host = msg.host;
var protocol = msg.protocol || 'https';
var port = msg.port;
var maxTriggers = msg.maxTriggers;
if (lifecycleEvent === 'CREATE') {
// check for parameter errors
if (msg.includeDoc) {
return Promise.reject('cloudant trigger feed: includeDoc parameter is no longer supported');
}
if (!dbname) {
return Promise.reject('cloudant trigger feed: missing dbname parameter - ' + dbname);
}
if (!host) {
return Promise.reject('cloudant trigger feed: missing host parameter - ' + host);
}
if (!user) {
return Promise.reject('cloudant trigger feed: missing username parameter - ' + user);
}
if (!pass) {
return Promise.reject('cloudant trigger feed: missing password parameter - ' + pass);
}
if (namespace === "_") {
return Promise.reject('You must supply a non-default namespace.');
}
// auth key for trigger
var apiKey = msg.authKey;
var input = {};
input.accounturl = "https://" + host;
input.host = host;
input.port = port;
input.protocol = protocol;
input.dbname = dbname;
input.user = user;
input.pass = pass;
input.apikey = apiKey;
input.maxTriggers = maxTriggers;
input.callback = {};
input.callback.action = {};
input.callback.action.name = trigger;
return cloudantHelper(provider_endpoint, 'put', replaceNameTrigger, input);
} else if (lifecycleEvent === 'DELETE') {
var jsonOptions = {};
jsonOptions.apikey = msg.authKey;
return cloudantHelper(provider_endpoint, 'delete', replaceNameTrigger, jsonOptions);
} else {
return Promise.reject('operation is neither CREATE or DELETE');
}
}
function cloudantHelper(endpoint, verb, name, input) {
var url = 'http://' + endpoint + '/cloudanttriggers/' + name;
var promise = new Promise(function(resolve, reject) {
request({
method : verb,
url : url,
json: input
}, function(error, response, body) {
console.log('cloudant trigger feed: done http request');
if (!error && response.statusCode === 200) {
console.log(body);
resolve();
}
else {
if (response) {
console.log('response code:', response.statusCode);
reject(body);
} else {
console.log('no response');
reject(error);
}
}
});
});
return promise;
}
function parseQName(qname) {
var parsed = {};
var delimiter = '/';
var defaultNamespace = '_';
if (qname && qname.charAt(0) === delimiter) {
var parts = qname.split(delimiter);
parsed.namespace = parts[1];
parsed.name = parts.length > 2 ? parts.slice(2).join(delimiter) : '';
} else {
parsed.namespace = defaultNamespace;
parsed.name = qname;
}
return parsed;
}