From 85f61f09afb60393d1a3f2f7f9e5557a6f47f147 Mon Sep 17 00:00:00 2001 From: Juuso Tapaninen Date: Tue, 27 Jan 2015 23:41:04 +0200 Subject: [PATCH 1/4] Feeds API endpoint, Twitter feed implemented --- feeds/twitter.js | 29 +++++++++++++++++++++++++++++ index.js | 1 + package.json | 2 ++ routes/feeds.js | 17 +++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 feeds/twitter.js create mode 100644 routes/feeds.js diff --git a/feeds/twitter.js b/feeds/twitter.js new file mode 100644 index 0000000..e90eb16 --- /dev/null +++ b/feeds/twitter.js @@ -0,0 +1,29 @@ +'use strict'; + +var Twitter = require('node-twitter'); +var config = require('../lib/config'); +var Promise = require('bluebird'); + +var twitterRestClient = new Twitter.RestClient( + config.twitter.consumerKey, + config.twitter.consumerSecret, + config.twitter.token, + config.twitter.tokenSecret +); + +module.exports = { + /** + * Fetch five latest tweets / retweets from Twitter + */ + getTweets: function() { + return new Promise(function(resolve, reject) { + twitterRestClient.statusesUserTimeline({count: 5}, function(error, result) { + if (error) { + reject(error); + } + + resolve(result); + }); + }); + } +}; diff --git a/index.js b/index.js index 5dc6386..75a71c3 100644 --- a/index.js +++ b/index.js @@ -9,6 +9,7 @@ app.use(bodyParser.urlencoded({extended: true})); require('./routes/invite')(app); require('./routes/members')(app); +require('./routes/feeds')(app); app.use(function(err, req, res, next) { /*jshint unused:false*/ diff --git a/package.json b/package.json index 0e293a6..a35fc3a 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,11 @@ "homepage": "https://github.com/koodiklinikka/koodiklinikka.fi-api", "dependencies": { "apicache": "0.0.12", + "bluebird": "^2.9.3", "body-parser": "^1.10.1", "express": "^4.11.0", "lodash": "^2.4.1", + "node-twitter": "0.5.2", "superagent": "^0.21.0", "validator": "^3.27.0" } diff --git a/routes/feeds.js b/routes/feeds.js new file mode 100644 index 0000000..aa237f6 --- /dev/null +++ b/routes/feeds.js @@ -0,0 +1,17 @@ +'use strict'; + +var request = require('superagent'); +var cache = require('apicache').middleware; +var twitter = require('../feeds/twitter'); + +module.exports = function (app) { + /* + * GET /feeds + * Endpoint for fetching different information feeds (Twitter, GitHub etc.) + */ + app.get('/feeds', cache('3 hours'), function(req, res, next) { + Promise.all([twitter.getTweets()]).then(function(data) { + res.status(200).send(data); + }); + }); +}; From e77f87de6997af153481c055749c2ea75e46c2ad Mon Sep 17 00:00:00 2001 From: Juuso Tapaninen Date: Wed, 28 Jan 2015 00:15:28 +0200 Subject: [PATCH 2/4] Added GitHub event feed data fetching --- feeds/github.js | 25 +++++++++++++++++++++++++ routes/feeds.js | 5 ++++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 feeds/github.js diff --git a/feeds/github.js b/feeds/github.js new file mode 100644 index 0000000..364430a --- /dev/null +++ b/feeds/github.js @@ -0,0 +1,25 @@ +'use strict'; + +var request = require('superagent'); +var config = require('../lib/config'); +var Promise = require('bluebird'); + +module.exports = { + /** + * Fetch five latest events from GitHub organization + */ + getEvents: function() { + return new Promise(function(resolve, reject) { + request + .get('https://api.github.com/orgs/koodiklinikka/events?per_page=5') + .set('Authorization', 'token ' + config.github.token) + .end(function(error, response){ + if(error) { + reject(error); + } + + resolve(response.body); + }); + }); + } +}; diff --git a/routes/feeds.js b/routes/feeds.js index aa237f6..1c27bca 100644 --- a/routes/feeds.js +++ b/routes/feeds.js @@ -3,6 +3,7 @@ var request = require('superagent'); var cache = require('apicache').middleware; var twitter = require('../feeds/twitter'); +var github = require('../feeds/github'); module.exports = function (app) { /* @@ -10,8 +11,10 @@ module.exports = function (app) { * Endpoint for fetching different information feeds (Twitter, GitHub etc.) */ app.get('/feeds', cache('3 hours'), function(req, res, next) { - Promise.all([twitter.getTweets()]).then(function(data) { + Promise.all([twitter.getTweets(), github.getEvents()]).then(function(data) { res.status(200).send(data); + }, function(err) { + next(err); }); }); }; From 8006814e45dbaa266e2a7646c43ab34a2ef82428 Mon Sep 17 00:00:00 2001 From: Juuso Tapaninen Date: Wed, 28 Jan 2015 00:15:56 +0200 Subject: [PATCH 3/4] Updated config template with Twitter API key format --- config.template.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config.template.json b/config.template.json index 73070e0..2647298 100644 --- a/config.template.json +++ b/config.template.json @@ -6,6 +6,12 @@ }, "github": { "token": "" + }, + "twitter": { + "consumerKey": "", + "consumerSecret": "", + "token": "", + "tokenSecret": "" } } } From c71b3b6541ec3a801e069abef38aa516fbd34620 Mon Sep 17 00:00:00 2001 From: Juuso Tapaninen Date: Wed, 28 Jan 2015 01:19:37 +0200 Subject: [PATCH 4/4] Changed feeds endpoint to use Promise.props to make the result more reasonable to work with --- package.json | 2 +- routes/feeds.js | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a35fc3a..62f67a7 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "bluebird": "^2.9.3", "body-parser": "^1.10.1", "express": "^4.11.0", - "lodash": "^2.4.1", + "lodash": "3.0.0", "node-twitter": "0.5.2", "superagent": "^0.21.0", "validator": "^3.27.0" diff --git a/routes/feeds.js b/routes/feeds.js index 1c27bca..596629c 100644 --- a/routes/feeds.js +++ b/routes/feeds.js @@ -2,6 +2,7 @@ var request = require('superagent'); var cache = require('apicache').middleware; +var Promise = require('bluebird'); var twitter = require('../feeds/twitter'); var github = require('../feeds/github'); @@ -11,7 +12,10 @@ module.exports = function (app) { * Endpoint for fetching different information feeds (Twitter, GitHub etc.) */ app.get('/feeds', cache('3 hours'), function(req, res, next) { - Promise.all([twitter.getTweets(), github.getEvents()]).then(function(data) { + Promise.props({ + twitter: twitter.getTweets(), + github: github.getEvents() + }).then(function(data) { res.status(200).send(data); }, function(err) { next(err);