Add support for trigger filters (#91)

diff --git a/actions/changes.js b/actions/changes.js
index dd7b0ee..e332a5b 100644
--- a/actions/changes.js
+++ b/actions/changes.js
@@ -19,6 +19,8 @@
     var protocol = msg.protocol || 'https';
     var port = msg.port;
     var maxTriggers = msg.maxTriggers;
+    var filter;
+    var query_params;
 
     if (lifecycleEvent === 'CREATE') {
 
@@ -42,6 +44,25 @@
             return Promise.reject('You must supply a non-default namespace.');
         }
 
+        if (msg.filter) {
+            filter = msg.filter;
+
+            if (typeof msg.query_params === 'object') {
+                query_params = msg.query_params;
+            }
+            else if (typeof msg.query_params === 'string') {
+                try {
+                    query_params = JSON.parse(msg.query_params);
+                }
+                catch (e) {
+                    return Promise.reject('The query_params parameter cannot be parsed. Ensure it is valid JSON.');
+                }
+            }
+        }
+        else if (msg.query_params) {
+            return Promise.reject('The query_params parameter is only allowed if the filter parameter is defined');
+        }
+
         // auth key for trigger
         var apiKey = msg.authKey;
         var input = {};
@@ -54,6 +75,8 @@
         input.pass = pass;
         input.apikey = apiKey;
         input.maxTriggers = maxTriggers;
+        input.filter = filter;
+        input.query_params = query_params;
 
         return cloudantHelper(provider_endpoint, 'put', triggerId, input);
     } else if (lifecycleEvent === 'DELETE') {
diff --git a/provider/lib/utils.js b/provider/lib/utils.js
index 46afe73..122bb06 100644
--- a/provider/lib/utils.js
+++ b/provider/lib/utils.js
@@ -59,6 +59,12 @@
 
             // Listen for changes on this database.
             var feed = triggeredDB.follow({since: sinceToUse, include_docs: false});
+            if (dataTrigger.filter) {
+                feed.filter = dataTrigger.filter;
+            }
+            if (dataTrigger.query_params) {
+                feed.query_params = dataTrigger.query_params;
+            }
 
             dataTrigger.feed = feed;
             that.triggers[dataTrigger.id] = dataTrigger;
@@ -141,7 +147,9 @@
             apikey: obj.apikey,
             since: obj.since,
             maxTriggers: obj.maxTriggers,
-            triggersLeft: obj.maxTriggers
+            triggersLeft: obj.maxTriggers,
+            filter: obj.filter,
+            query_params: obj.query_params
         };
 
         return trigger;