From ecbf01f7d87c418435b8a06457729e4a7c396b4a Mon Sep 17 00:00:00 2001
From: jurgenhaas <juergen@paragon-es.de>
Date: Mon, 4 Jul 2016 13:58:48 +0200
Subject: [PATCH] #1 Implement poller for Redmine

---
 plugins/tracker/sources/baseSource.js         |  3 +-
 .../tracker/sources/redmine/redmineSource.js  | 60 +++++++++++++++++++
 plugins/tracker/sources/sourcesCollection.js  |  1 +
 3 files changed, 62 insertions(+), 2 deletions(-)
 create mode 100644 plugins/tracker/sources/redmine/redmineSource.js

diff --git a/plugins/tracker/sources/baseSource.js b/plugins/tracker/sources/baseSource.js
index 59825fe..e94a318 100644
--- a/plugins/tracker/sources/baseSource.js
+++ b/plugins/tracker/sources/baseSource.js
@@ -60,13 +60,12 @@ BaseTrackerSource.prototype.readItems = function(items, sort) {
   }
   this.debug('Last activity: ' + this.formatDate(this.lastActivity));
 
-  var i, item, message;
+  var i, item;
   for (i in items) {
     item = items[i];
     if (this.isItemNew(item)) {
       if (this.notifyItem(item)) {
         this.debug('Notify');
-        this.debug(message);
         this.dashboard.emit('newTrackerItem', this, item);
       }
 
diff --git a/plugins/tracker/sources/redmine/redmineSource.js b/plugins/tracker/sources/redmine/redmineSource.js
new file mode 100644
index 0000000..96a8d95
--- /dev/null
+++ b/plugins/tracker/sources/redmine/redmineSource.js
@@ -0,0 +1,60 @@
+/**
+ * Module dependencies.
+ */
+var request = require('request');
+var util = require('util');
+var BaseTrackerSource = require('../baseSource');
+
+/**
+ * Redmine TrackerSource, to receive latest changes from and report to targets
+ *
+ * @param {String} id
+ * @param {Integer} lastActivity
+ * @param {String} url
+ * @param {Array} params
+ * @api   public
+ */
+function RedmineTrackerSource(id, lastActivity, url, params) {
+  RedmineTrackerSource.super_.call(this, id, lastActivity, url, params);
+}
+
+util.inherits(RedmineTrackerSource, BaseTrackerSource);
+
+RedmineTrackerSource.type = 'Redmine';
+
+RedmineTrackerSource.prototype.poll = function() {
+  var source = this;
+  var url = source.url + '/issues.json?key=' + source.password + '&sort=updated_on&updated_on=%3E%3D' + source.formatDate(source.lastActivity);
+  if (source.project_include) {
+    url += "&project_id=" + source.project_include;
+  }
+  source.debug(url);
+  request
+    .get(url,
+      function(error, response, body) {
+        var res = JSON.parse(body);
+        source.debug(body);
+        source.readItems(res.issues, false);
+      })
+    .on('error', function(e) {
+      source.debug('ERROR: ' + e.message);
+    });
+};
+
+RedmineTrackerSource.prototype.notifyItem = function(item) {
+  return !(this.hideMine && (item['assigned_to']['name'] == this.username));
+};
+
+RedmineTrackerSource.prototype.renderItem = function(item, linkCB, imageCB) {
+  return item['assigned_to']['name'] + ': ' + linkCB(item['id'], this.url + '/issues/' + item['id']) + ' ' + item['subject'];
+};
+
+RedmineTrackerSource.prototype.getItemDate = function(item) {
+  return item['updated_on'];
+};
+
+RedmineTrackerSource.prototype.formatDate = function(timestamp) {
+  return timestamp || new Date().toISOString().substr(0, 19) + 'Z';
+};
+
+module.exports = RedmineTrackerSource;
diff --git a/plugins/tracker/sources/sourcesCollection.js b/plugins/tracker/sources/sourcesCollection.js
index 0453849..e455648 100644
--- a/plugins/tracker/sources/sourcesCollection.js
+++ b/plugins/tracker/sources/sourcesCollection.js
@@ -5,6 +5,7 @@ var TrackerSourceCollection = function(sources) {
 
 TrackerSourceCollection.prototype.addDefaultSources = function() {
   this.add(require('./jira/jiraSource.js'));
+  this.add(require('./redmine/redmineSource.js'));
   this.add(require('./rss/rssSource.js'));
   this.add(require('./teamwork/teamworkSource.js'));
   this.add(require('./youtrack/youtrackSource.js'));
-- 
GitLab