From 62133fb47958b363e7c23333a6d13bb79565a3e5 Mon Sep 17 00:00:00 2001 From: Ai Deng Date: Wed, 10 Jun 2015 13:06:57 +0100 Subject: [PATCH 01/12] #26 wip --- package.json | 7 ++++- src/badgeClient.js | 10 ++++++ src/badgeService.js | 77 +++++++++++++++++++++++++++++++++++++++++++++ test/api.js | 2 +- 4 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 src/badgeClient.js create mode 100644 src/badgeService.js diff --git a/package.json b/package.json index 9b51df4..d62c954 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,12 @@ "jscs": "^1.13.1", "js-beautify": "^1.5.5", "jshint": "^2.7.0", - "mocha": "^2.2.5" + "mocha": "^2.2.5", + "request": "~2.57.0", + "habitat": "~3.1.2", + "jade": "~1.10.0", + "simple-oauth2": "https://github.com/ORCID/simple-oauth2/archive/MASTER_2015_06_03.tar.gz", + "express-session": "~1.11.2" }, "engines": { "node": "0.12.2" diff --git a/src/badgeClient.js b/src/badgeClient.js new file mode 100644 index 0000000..0b778f2 --- /dev/null +++ b/src/badgeClient.js @@ -0,0 +1,10 @@ +var ApiClient = require('badgekit-api-client'); + +module.exports = function(config) { + var auth = { + key: config.BADGES_KEY, + secret: config.BADGES_SECRET + }; + + return new ApiClient(config.BADGES_ENDPOINT, auth); +} \ No newline at end of file diff --git a/src/badgeService.js b/src/badgeService.js new file mode 100644 index 0000000..c656a87 --- /dev/null +++ b/src/badgeService.js @@ -0,0 +1,77 @@ +module.exports = function (apiClient, config) { + var system = config.BADGES_SYSTEM; + // orcidRe = /(\d{4}-\d{4}-\d{4}-\d{4})@orcid\.org/; + // Url = require('url'); + + function emailFromORCID(orcid) { + return orcid + '@orcid.org'; + } + + // function ORCIDFromEmail(email) { + // var m = orcidRe.exec(email); + // if (m !== null) { + // return m[1]; + // } + // } + + function modEntry(entry, orcid) { + entry.orcid = orcid; + delete entry.email; + return true; + } + + // function urlFromDOI(doi) { + // return 'http://dx.doi.org/' + doi; + // } + + // function DOIFromURL(url) { + // // pathname should be '/10.1371/journal.pbio.1002126' from 'http://dx.doi.org/10.1371/journal.pbio.1002126' + // return encodeURI(Url.parse(url).pathname) || url; + // } + + function _getBadges(orcid, badge) { + return function(callback) { + var filtered; + apiClient.getBadgeInstances({ + system: system + }, emailFromORCID(orcid), function (err, badges) { + if (err) { + console.error(err); + return callback(err); + } + // filter for the badge + if (badges) { + filtered = badges.filter(function (entry) { + return (entry.badge.slug === badge) ? modEntry(entry, orcid) : false; + }); + } + + if (filtered && filtered.length === 0) { + callback('not found'); + } else { + callback(null, filtered); + } + }); + } + } + + function _getAllBadges() { + return function(callback) { + apiClient.getAllBadges({ + system: system + }, function (err, badges) { + if (err) { + console.error(err); + callback(err); + } else { + callback(null, badges); + } + }); + }; + } + + return { + getBadges: _getBadges, + getAllBadges: _getAllBadges + }; +}; diff --git a/test/api.js b/test/api.js index 17ba81c..dc6fb35 100644 --- a/test/api.js +++ b/test/api.js @@ -1,4 +1,4 @@ -var request = require('supertest'); +var request = require('request'); // test config (need to override .env and .env.dist) process.env.SESSION_SECRET = 'test_secret' From e4f21a483ac048e2a1b4fe1de7e58ccfd62742d2 Mon Sep 17 00:00:00 2001 From: Ai Deng Date: Wed, 17 Jun 2015 17:22:18 +0100 Subject: [PATCH 02/12] #26 wip 2 endpoints worked with IT --- src/app.js | 178 +++++++++++++++++++++++++++----------------- src/badgeClient.js | 14 ++-- src/badgeService.js | 77 +++++++++++-------- src/startApp.js | 5 +- test/app.js | 42 +++++++++++ 5 files changed, 205 insertions(+), 111 deletions(-) create mode 100644 test/app.js diff --git a/src/app.js b/src/app.js index 1076fe5..0bcd28b 100755 --- a/src/app.js +++ b/src/app.js @@ -1,6 +1,5 @@ module.exports = function () { var env = require('./environments'); - var express = require('express'), helpers = require('./helpers'), app = express(), @@ -11,6 +10,24 @@ module.exports = function () { app.set('view engine', 'jade'); app.use(express.static(path.join(__dirname, '..', '/public'))); + function returnBadges(getBadges, httpRequest, httpResponse) { + getBadges(function (error, badges) { + if (error !== null) { + console.log("Get error from return Badges " + error); + httpResponse.send(error); + } else { + if (httpRequest.query.pretty) { + httpResponse.render(path.join(__dirname, '..', '/public/code.jade'), { + data: JSON.stringify(badges, null, 2) + }); + } else { + // console.log("badgesreturn:" + JSON.stringify(badges, null, 2)); + httpResponse.json(badges); + } + } + }); + }; + // Set the client credentials and the OAuth2 server var credentials = { clientID: env.get('ORCID_AUTH_CLIENT_ID'), @@ -75,54 +92,66 @@ module.exports = function () { var client = new Client(env.get('BADGES_ENDPOINT'), auth); app.get('/badges', function (request, response) { - var pretty = request.query.pretty; - client.getAllBadges({ - system: system - }, function (err, badges) { - if (err) { - console.error(err); - response.send(err); - return; - } - if (pretty) { - response.render(path.join(__dirname, '..', '/public/code.jade'), { - data: JSON.stringify(badges, null, 2) - }); - } else { - response.send(badges); - } - }); + returnBadges(badgerService.getAllBadges(), request, response); }); - // Get all badge instances of a certain badge app.get('/badges/:badge', function (request, response) { - var pretty = request.query.pretty; - client.getBadgeInstances({ - system: system, - badge: request.params.badge - }, function (err, badges) { - if (err) { - console.error(err); - response.send(err); - return; - } - badges.forEach(function (entry) { - var orcid = helpers.ORCIDFromEmail(entry.email); - helpers.modEntry(entry, orcid); - }); - if (pretty) { - response.render(path.join(__dirname, '..', '/public/code.jade'), { - data: JSON.stringify(badges, null, 2) - }); - } else { - response.send(badges); - } - }); + returnBadges(badgerService.getBadges(null, request.params.badge), request, response); }); + // Get all badge instances of a certain badge + // app.get('/badges/:badge', function (request, response) { + // var pretty = request.query.pretty; + // client.getBadgeInstances({ + // system: system, + // badge: request.params.badge + // }, function (err, badges) { + // if (err) { + // console.error(err); + // response.send(err); + // return; + // } + // badges.forEach(function (entry) { + // var orcid = helpers.ORCIDFromEmail(entry.email); + // helpers.modEntry(entry, orcid); + // }); + // if (pretty) { + // response.render(path.join(__dirname, '..', '/public/code.jade'), { + // data: JSON.stringify(badges, null, 2) + // }); + // } else { + // console.log(">>>" + JSON.stringify(badges, null, 2)); + // console.log(">>>" + badges[0].badge.name); + // response.json(badges); + // } + // }); + // }); + + // function validAndProcessRequest(validation, sucessCallback, failedCallback) { + // if (validation()) { + // sucessCallback(); + // } else { + // failedCallback(); + // } + // } + + // var checkOrcid = function (request) { + // return !request.params.orcid; + // } + + // var failedOrcidParameterProcess = function (response) { + // response.status(400).end(); + // } + /* Get badges for a user */ // Get all badge instances earned by a user + // app.get('/users/:orcid/badges', function (request, response) { + // validAndProcessRequest(checkOrcid, function(request, response) { + // returnBadges(badgerService.getBadgeInstances(request.params.orcid, null), response); + // }, failedOrcidParameterProcess(response)); + // } + app.get('/users/:orcid/badges', function (request, response) { var pretty = request.query.pretty; var orcid = request.params.orcid; @@ -155,41 +184,50 @@ module.exports = function () { // Get all badge instances of a certain badge earned by a user app.get('/users/:orcid/badges/:badge', function (request, response) { - var pretty = request.query.pretty; // get all badge instances for the user. Is there a more efficient way to do this? - var orcid = request.params.orcid, - filtered; + var orcid = request.params.orcid; if (!orcid) { response.status(400).end(); return; } - client.getBadgeInstances({ - system: system - }, helpers.emailFromORCID(orcid), function (err, badges) { - if (err) { - console.error(err); - response.send(err); - return; - } - // filter for the badge - if (badges) { - filtered = badges.filter(function (entry) { - return (entry.badge.slug === request.params.badge) ? helpers.modEntry(entry, orcid) : false; - }); - } - if (filtered && filtered.length === 0) { - response.status(404).end(); - } else { - if (pretty) { - response.render(path.join(__dirname, '..', '/public/code.jade'), { - data: JSON.stringify(filtered, null, 2) - }); - } else { - response.send(filtered); - } - } - }); + returnBadges(badgerService.getBadgeInstances(orcid, request.params.badge), request, response); }); + // app.get('/users/:orcid/badges/:badge', function (request, response) { + // var pretty = request.query.pretty; + // // get all badge instances for the user. Is there a more efficient way to do this? + // var orcid = request.params.orcid, + // filtered; + // if (!orcid) { + // response.status(400).end(); + // return; + // } + // client.getBadgeInstances({ + // system: system + // }, helpers.emailFromORCID(orcid), function (err, badges) { + // if (err) { + // console.error(err); + // response.send(err); + // return; + // } + // // filter for the badge + // if (badges) { + // filtered = badges.filter(function (entry) { + // return (entry.badge.slug === request.params.badge) ? helpers.modEntry(entry, orcid) : false; + // }); + // } + // if (filtered && filtered.length === 0) { + // response.status(404).end(); + // } else { + // if (pretty) { + // response.render(path.join(__dirname, '..', '/public/code.jade'), { + // data: JSON.stringify(filtered, null, 2) + // }); + // } else { + // response.send(filtered); + // } + // } + // }); + // }); /* Get badges for a paper */ diff --git a/src/badgeClient.js b/src/badgeClient.js index 0b778f2..43b473a 100644 --- a/src/badgeClient.js +++ b/src/badgeClient.js @@ -1,10 +1,10 @@ var ApiClient = require('badgekit-api-client'); -module.exports = function(config) { - var auth = { - key: config.BADGES_KEY, - secret: config.BADGES_SECRET - }; +module.exports = function (config) { + var auth = { + key: config.BADGES_KEY, + secret: config.BADGES_SECRET + }; - return new ApiClient(config.BADGES_ENDPOINT, auth); -} \ No newline at end of file + return new ApiClient(config.BADGES_ENDPOINT, auth); +} diff --git a/src/badgeService.js b/src/badgeService.js index c656a87..b8194a6 100644 --- a/src/badgeService.js +++ b/src/badgeService.js @@ -1,46 +1,45 @@ -module.exports = function (apiClient, config) { +module.exports = function (apiClient, config) { var system = config.BADGES_SYSTEM; - // orcidRe = /(\d{4}-\d{4}-\d{4}-\d{4})@orcid\.org/; - // Url = require('url'); function emailFromORCID(orcid) { return orcid + '@orcid.org'; } - // function ORCIDFromEmail(email) { - // var m = orcidRe.exec(email); - // if (m !== null) { - // return m[1]; - // } - // } - function modEntry(entry, orcid) { entry.orcid = orcid; delete entry.email; return true; } - // function urlFromDOI(doi) { - // return 'http://dx.doi.org/' + doi; - // } + function clientCallback(err, badges) { + if (err) { + console.error(err); + return callback(err); + } + // filter for the badge + if (badges) { + filtered = badges.filter(function (entry) { + return (entry.badge.slug === badge) ? modEntry(entry, orcid) : false; + }); + } - // function DOIFromURL(url) { - // // pathname should be '/10.1371/journal.pbio.1002126' from 'http://dx.doi.org/10.1371/journal.pbio.1002126' - // return encodeURI(Url.parse(url).pathname) || url; - // } + if (filtered && filtered.length === 0) { + callback('not found'); + } else { + callback(null, filtered); + } + } function _getBadges(orcid, badge) { - return function(callback) { - var filtered; - apiClient.getBadgeInstances({ - system: system - }, emailFromORCID(orcid), function (err, badges) { + return function (callback) { + + var clientCallback = function (err, badges) { if (err) { console.error(err); return callback(err); } // filter for the badge - if (badges) { + if (badges) { filtered = badges.filter(function (entry) { return (entry.badge.slug === badge) ? modEntry(entry, orcid) : false; }); @@ -48,26 +47,40 @@ module.exports = function (apiClient, config) { if (filtered && filtered.length === 0) { callback('not found'); - } else { + } else { callback(null, filtered); } - }); - } + } + + if (orcid) { + var filtered; + apiClient.getBadgeInstances({ + system: system + }, emailFromORCID(orcid), clientCallback); + } else { + var filtered; + apiClient.getBadgeInstances({ + system: system, + badge: badge + }, clientCallback); + } + + }; } - function _getAllBadges() { - return function(callback) { + function _getAllBadges() { + return function (callback) { apiClient.getAllBadges({ system: system }, function (err, badges) { if (err) { - console.error(err); + console.error(err); callback(err); } else { callback(null, badges); - } - }); - }; + } + }); + }; } return { diff --git a/src/startApp.js b/src/startApp.js index f4ae026..9dd90ae 100644 --- a/src/startApp.js +++ b/src/startApp.js @@ -1,7 +1,8 @@ module.exports = function (startAppCallback) { var env = require('./environments'); - - var app = require('./app')(); + var badgeClient = require('./badgeClient.js')(env); + var badgeService = require('./badgeService.js')(badgeClient, env); + var app = require('./app')(badgeService); app.listen(env.get('PORT'), startAppCallback({ name: 'PaperBadger', port: env.get('PORT') diff --git a/test/app.js b/test/app.js new file mode 100644 index 0000000..06d3d00 --- /dev/null +++ b/test/app.js @@ -0,0 +1,42 @@ +var request = require('supertest'); +var assert = require('assert'); + +process.env.BADGES_ENDPOINT = 'http://badgekit-api-sciencelab.herokuapp.com/' +process.env.BADGES_SYSTEM = 'badgekit' +process.env.BADGES_KEY = 'master' +process.env.BADGES_SECRET = 'sciencelab' + +var badgeClient = require('../src/badgeClient.js')(process.env); +var badgeService = require('../src/badgeService.js')(badgeClient, process.env); +var app = require('../src/app.js')(badgeService); + +describe("Intergration test against the real Badge server", function () { + + it('get all the badges', function (done) { + request(app) + .get('/badges') + .expect('Content-Type', /json/) + .expect(function (res) { + assert.ok(res.body[0].slug, "find one badge slug"); + }) + .expect(200, done); + }); + + it('render JSON data in code jade if ask pretty', function (done) { + request(app) + .get('/badges?pretty=true') + .expect('Content-Type', /html/) + .expect(200, done); + }); + + it('get all badge instances of a certain badge', function (done) { + request(app) + .get('/badges/formal_analysis') + .expect('Content-Type', /json/) + .expect(function (res) { + assert.equal(res.body[0].badge.name, "Formal analysis"); + }) + .expect(200, done); + }); + +}); From b1c6af38f74c6454a715535ba5e5eab968be91ad Mon Sep 17 00:00:00 2001 From: Ai Deng Date: Thu, 18 Jun 2015 09:56:49 +0100 Subject: [PATCH 03/12] #26 3 endpoints works with IT --- src/app.js | 78 ++------------------------------------------- src/badgeService.js | 52 ++++++++++-------------------- test/app.js | 16 +++++++++- 3 files changed, 34 insertions(+), 112 deletions(-) diff --git a/src/app.js b/src/app.js index 0bcd28b..65533ca 100755 --- a/src/app.js +++ b/src/app.js @@ -20,8 +20,7 @@ module.exports = function () { httpResponse.render(path.join(__dirname, '..', '/public/code.jade'), { data: JSON.stringify(badges, null, 2) }); - } else { - // console.log("badgesreturn:" + JSON.stringify(badges, null, 2)); + } else { httpResponse.json(badges); } } @@ -99,87 +98,16 @@ module.exports = function () { returnBadges(badgerService.getBadges(null, request.params.badge), request, response); }); - // Get all badge instances of a certain badge - // app.get('/badges/:badge', function (request, response) { - // var pretty = request.query.pretty; - // client.getBadgeInstances({ - // system: system, - // badge: request.params.badge - // }, function (err, badges) { - // if (err) { - // console.error(err); - // response.send(err); - // return; - // } - // badges.forEach(function (entry) { - // var orcid = helpers.ORCIDFromEmail(entry.email); - // helpers.modEntry(entry, orcid); - // }); - // if (pretty) { - // response.render(path.join(__dirname, '..', '/public/code.jade'), { - // data: JSON.stringify(badges, null, 2) - // }); - // } else { - // console.log(">>>" + JSON.stringify(badges, null, 2)); - // console.log(">>>" + badges[0].badge.name); - // response.json(badges); - // } - // }); - // }); - - // function validAndProcessRequest(validation, sucessCallback, failedCallback) { - // if (validation()) { - // sucessCallback(); - // } else { - // failedCallback(); - // } - // } - - // var checkOrcid = function (request) { - // return !request.params.orcid; - // } - - // var failedOrcidParameterProcess = function (response) { - // response.status(400).end(); - // } - /* Get badges for a user */ // Get all badge instances earned by a user - // app.get('/users/:orcid/badges', function (request, response) { - // validAndProcessRequest(checkOrcid, function(request, response) { - // returnBadges(badgerService.getBadgeInstances(request.params.orcid, null), response); - // }, failedOrcidParameterProcess(response)); - // } - app.get('/users/:orcid/badges', function (request, response) { - var pretty = request.query.pretty; var orcid = request.params.orcid; if (!orcid) { response.status(400).end(); return; - } - client.getBadgeInstances({ - system: system - }, { - email: helpers.emailFromORCID(orcid) - }, function (err, badges) { - if (err) { - console.error(err); - response.send(err); - return; - } - badges.forEach(function (entry) { - helpers.modEntry(entry, orcid); - }); - if (pretty) { - response.render(path.join(__dirname, '..', '/public/code.jade'), { - data: JSON.stringify(badges, null, 2) - }); - } else { - response.send(badges); - } - }); + } + returnBadges(badgerService.getBadges(orcid), request, response); }); // Get all badge instances of a certain badge earned by a user diff --git a/src/badgeService.js b/src/badgeService.js index b8194a6..d8e86f5 100644 --- a/src/badgeService.js +++ b/src/badgeService.js @@ -1,52 +1,32 @@ module.exports = function (apiClient, config) { var system = config.BADGES_SYSTEM; + var helpers = require('./helpers'); - function emailFromORCID(orcid) { - return orcid + '@orcid.org'; - } - - function modEntry(entry, orcid) { - entry.orcid = orcid; - delete entry.email; - return true; - } - - function clientCallback(err, badges) { - if (err) { - console.error(err); - return callback(err); - } - // filter for the badge - if (badges) { - filtered = badges.filter(function (entry) { - return (entry.badge.slug === badge) ? modEntry(entry, orcid) : false; - }); - } - - if (filtered && filtered.length === 0) { - callback('not found'); - } else { - callback(null, filtered); - } - } - - function _getBadges(orcid, badge) { - return function (callback) { - + function _getBadges(orcid, badge, dois) { + return function (callback) { + // var evidenceUrl = dois ? helpers.urlFromDOI(dois._1 + '/' + dois._2) : null; var clientCallback = function (err, badges) { if (err) { console.error(err); return callback(err); } + // filter for the badge - if (badges) { + if (badges) { filtered = badges.filter(function (entry) { - return (entry.badge.slug === badge) ? modEntry(entry, orcid) : false; + var goodBadge = (!badge || entry.badge.slug === badge); + // var goodDoi = (dois === null || entry.evidenceUrl === evidenceUrl); + return goodBadge; + }); + + filtered.forEach(function (entry) { + var orcid = helpers.ORCIDFromEmail(entry.email); + helpers.modEntry(entry, orcid); }); } if (filtered && filtered.length === 0) { - callback('not found'); + callback('client return empty result'); } else { callback(null, filtered); } @@ -56,7 +36,7 @@ module.exports = function (apiClient, config) { var filtered; apiClient.getBadgeInstances({ system: system - }, emailFromORCID(orcid), clientCallback); + }, helpers.emailFromORCID(orcid), clientCallback); } else { var filtered; apiClient.getBadgeInstances({ diff --git a/test/app.js b/test/app.js index 06d3d00..58f0927 100644 --- a/test/app.js +++ b/test/app.js @@ -35,8 +35,22 @@ describe("Intergration test against the real Badge server", function () { .expect('Content-Type', /json/) .expect(function (res) { assert.equal(res.body[0].badge.name, "Formal analysis"); - }) + assert.equal(res.body[0].orcid, "0000-0003-4959-3049"); + //assert.equal(res.body[0].email, null); ?? bug?? + }) .expect(200, done); }); + it('get all badge instances earned by a user', function (done) { + request(app) + .get('/users/0000-0003-4959-3049/badges') + // .expect('Content-Type', /json/) + .expect(function (res) { + // console.log("badgesreturn:" + JSON.stringify(res.body, null, 2)); + assert.ok(res.body[0].slug, "find one badge slug"); + assert.equal(res.body[0].orcid, "0000-0003-4959-3049"); + }) + .expect(200, done); + }); + }); From 79ad7347e2d753753a92294982d98e817d993fc6 Mon Sep 17 00:00:00 2001 From: Ai Deng Date: Thu, 18 Jun 2015 22:52:40 +0100 Subject: [PATCH 04/12] #26 refactroing all the badges read endpoints + IT --- src/app.js | 166 +++++--------------------------------------- src/badgeService.js | 8 +-- test/app.js | 58 ++++++++++++++-- 3 files changed, 75 insertions(+), 157 deletions(-) diff --git a/src/app.js b/src/app.js index 65533ca..4abde45 100755 --- a/src/app.js +++ b/src/app.js @@ -118,20 +118,25 @@ module.exports = function () { response.status(400).end(); return; } - returnBadges(badgerService.getBadgeInstances(orcid, request.params.badge), request, response); + returnBadges(badgerService.getBadges(orcid, request.params.badge), request, response); }); - // app.get('/users/:orcid/badges/:badge', function (request, response) { + + /* Get badges for a paper */ + + // THIS DOES NOT WORK!! + // Get all badge instances for a paper. + // app.get('/papers/:doi1/:doi2/badges', function (request, response) { // var pretty = request.query.pretty; - // // get all badge instances for the user. Is there a more efficient way to do this? - // var orcid = request.params.orcid, - // filtered; - // if (!orcid) { + // if (!request.params.doi1 || !request.params.doi2) { // response.status(400).end(); // return; // } + // var evidenceUrl = helpers.urlFromDOI(request.params.doi1 + '/' + request.params.doi2), + // filtered; + // // get all badge instances for the user. Is there a more efficient way to do this? // client.getBadgeInstances({ // system: system - // }, helpers.emailFromORCID(orcid), function (err, badges) { + // }, function (err, badges) { // if (err) { // console.error(err); // response.send(err); @@ -140,7 +145,8 @@ module.exports = function () { // // filter for the badge // if (badges) { // filtered = badges.filter(function (entry) { - // return (entry.badge.slug === request.params.badge) ? helpers.modEntry(entry, orcid) : false; + // var orcid = helpers.ORCIDFromEmail(entry.email); + // return (entry.evidenceUrl === evidenceUrl) ? helpers.modEntry(entry, orcid) : false; // }); // } // if (filtered && filtered.length === 0) { @@ -157,165 +163,31 @@ module.exports = function () { // }); // }); - /* Get badges for a paper */ - - // THIS DOES NOT WORK!! - // Get all badge instances for a paper. - app.get('/papers/:doi1/:doi2/badges', function (request, response) { - var pretty = request.query.pretty; - if (!request.params.doi1 || !request.params.doi2) { - response.status(400).end(); - return; - } - var evidenceUrl = helpers.urlFromDOI(request.params.doi1 + '/' + request.params.doi2), - filtered; - // get all badge instances for the user. Is there a more efficient way to do this? - client.getBadgeInstances({ - system: system - }, function (err, badges) { - if (err) { - console.error(err); - response.send(err); - return; - } - // filter for the badge - if (badges) { - filtered = badges.filter(function (entry) { - var orcid = helpers.ORCIDFromEmail(entry.email); - return (entry.evidenceUrl === evidenceUrl) ? helpers.modEntry(entry, orcid) : false; - }); - } - if (filtered && filtered.length === 0) { - response.status(404).end(); - } else { - if (pretty) { - response.render(path.join(__dirname, '..', '/public/code.jade'), { - data: JSON.stringify(filtered, null, 2) - }); - } else { - response.send(filtered); - } - } - }); - }); - // Get all badge instances of a certain badge for a paper. NOTE: inefficiently filters for doi afterwards - app.get('/papers/:doi1/:doi2/badges/:badge', function (request, response) { - var pretty = request.query.pretty; + app.get('/papers/:doi1/:doi2/badges/:badge', function (request, response) { if (!request.params.doi1 || !request.params.doi2) { response.status(400).end(); return; } - var evidenceUrl = helpers.urlFromDOI(request.params.doi1 + '/' + request.params.doi2), - filtered; - // get all badge instances for the user. Is there a more efficient way to do this? - client.getBadgeInstances({ - system: system, - badge: request.params.badge - }, function (err, badges) { - if (err) { - console.error(err); - response.send(err); - return; - } - // filter for the badge - if (badges) { - filtered = badges.filter(function (entry) { - var orcid = helpers.ORCIDFromEmail(entry.email); - return (entry.evidenceUrl === evidenceUrl) ? helpers.modEntry(entry, orcid) : false; - }); - } - if (filtered && filtered.length === 0) { - response.status(404).end(); - } else { - if (pretty) { - response.render(path.join(__dirname, '..', '/public/code.jade'), { - data: JSON.stringify(filtered, null, 2) - }); - } else { - response.send(filtered); - } - } - }); + returnBadges(badgerService.getBadges(null, request.params.badge, {'_1':request.params.doi1 , '_2':request.params.doi2}), request, response); }); // Get all badge instances earned by a user for a paper. app.get('/papers/:doi1/:doi2/:badges/:orcid/badges', function (request, response) { - var pretty = request.query.pretty; if (!request.params.doi1 || !request.params.doi2 || !request.params.orcid) { response.status(400).end(); return; } - var orcid = request.params.orcid, - evidenceUrl = helpers.urlFromDOI(request.params.doi1 + '/' + request.params.doi2), - filtered; - // get all badge instances for the user. Is there a more efficient way to do this? - client.getBadgeInstances({ - system: system - }, helpers.emailFromORCID(orcid), function (err, badges) { - if (err) { - console.error(err); - response.send(err); - return; - } - // filter for the badge - if (badges) { - filtered = badges.filter(function (entry) { - return (entry.evidenceUrl === evidenceUrl) ? helpers.modEntry(entry, orcid) : false; - }); - } - if (filtered && filtered.length === 0) { - response.status(404).end(); - } else { - if (pretty) { - response.render(path.join(__dirname, '..', '/public/code.jade'), { - data: JSON.stringify(filtered, null, 2) - }); - } else { - response.send(filtered); - } - } - }); + returnBadges(badgerService.getBadges(request.params.orcid, null, {'_1':request.params.doi1 , '_2':request.params.doi2}), request, response); }); // Get all badge instances of a certain badge earned by a user for a paper. app.get('/papers/:doi1/:doi2/users/:orcid/badges/:badge', function (request, response) { - var pretty = request.query.pretty; - if (!request.params.doi1 || !request.params.doi2 || !request.params.orcid) { + if (!request.params.doi1 || !request.params.doi2 || !request.params.orcid || !request.params.badge) { response.status(400).end(); return; } - var orcid = request.params.orcid, - evidenceUrl = helpers.urlFromDOI(request.params.doi1 + '/' + request.params.doi2), - filtered; - // get all badge instances for the user. Is there a more efficient way to do this? - client.getBadgeInstances({ - system: system - }, helpers.emailFromORCID(orcid), function (err, badges) { - if (err) { - console.error(err); - response.send(err); - return; - } - // filter for the doi & badge - if (badges) { - filtered = badges.filter(function (entry) { - return ((entry.evidenceUrl === evidenceUrl) && (entry.badge.slug === request.params.badge)) ? - helpers.modEntry(entry, orcid) : false; - }); - } - if (filtered && filtered.length === 0) { - response.status(404).end(); - } else { - if (pretty) { - response.render(path.join(__dirname, '..', '/public/code.jade'), { - data: JSON.stringify(filtered, null, 2) - }); - } else { - response.send(filtered); - } - } - }); + returnBadges(badgerService.getBadges(request.params.orcid, request.params.badge, {'_1':request.params.doi1 , '_2':request.params.doi2}), request, response); }); // Create a badge instance -- need to add auth around this diff --git a/src/badgeService.js b/src/badgeService.js index d8e86f5..e521c22 100644 --- a/src/badgeService.js +++ b/src/badgeService.js @@ -1,10 +1,10 @@ module.exports = function (apiClient, config) { var system = config.BADGES_SYSTEM; - var helpers = require('./helpers'); + var helpers = require('./helpers'); function _getBadges(orcid, badge, dois) { return function (callback) { - // var evidenceUrl = dois ? helpers.urlFromDOI(dois._1 + '/' + dois._2) : null; + var evidenceUrl = dois ? helpers.urlFromDOI(dois._1 + '/' + dois._2) : null; var clientCallback = function (err, badges) { if (err) { console.error(err); @@ -15,8 +15,8 @@ module.exports = function (apiClient, config) { if (badges) { filtered = badges.filter(function (entry) { var goodBadge = (!badge || entry.badge.slug === badge); - // var goodDoi = (dois === null || entry.evidenceUrl === evidenceUrl); - return goodBadge; + var goodDoi = (!dois || entry.evidenceUrl === evidenceUrl); + return goodBadge && goodDoi; }); filtered.forEach(function (entry) { diff --git a/test/app.js b/test/app.js index 58f0927..b3fca72 100644 --- a/test/app.js +++ b/test/app.js @@ -17,7 +17,7 @@ describe("Intergration test against the real Badge server", function () { .get('/badges') .expect('Content-Type', /json/) .expect(function (res) { - assert.ok(res.body[0].slug, "find one badge slug"); + assert.ok(res.body[0].slug, "not find badge slug in json"); }) .expect(200, done); }); @@ -34,8 +34,8 @@ describe("Intergration test against the real Badge server", function () { .get('/badges/formal_analysis') .expect('Content-Type', /json/) .expect(function (res) { - assert.equal(res.body[0].badge.name, "Formal analysis"); - assert.equal(res.body[0].orcid, "0000-0003-4959-3049"); + assert.ok(res.body[0].slug, "not find badge slug in json"); + assert.equal(res.body[0].badge.name, "Formal analysis"); //assert.equal(res.body[0].email, null); ?? bug?? }) .expect(200, done); @@ -44,13 +44,59 @@ describe("Intergration test against the real Badge server", function () { it('get all badge instances earned by a user', function (done) { request(app) .get('/users/0000-0003-4959-3049/badges') - // .expect('Content-Type', /json/) + .expect('Content-Type', /json/) + .expect(function (res) { + assert.ok(res.body[0].slug, "not find one badge slug in json"); + assert.equal(res.body[0].orcid, "0000-0003-4959-3049"); + }) + .expect(200, done); + }); + + it('get all badge instances of a certain badge earned by a user', function (done) { + request(app) + .get('/users/0000-0003-4959-3049/badges/writing_review') + .expect(function (res) { + assert.ok(res.body[0].slug, "not find one badge slug in json"); + assert.equal(res.body[0].badge.name, 'Writing - review & editing'); + assert.equal(res.body[0].orcid, '0000-0003-4959-3049'); + }) + .expect(200, done); + }); + + it('get all badge instances of a certain badge for a paper.', function (done) { + request(app) + .get('/papers/10.1371/journal.pbio.1002126/badges/investigation') .expect(function (res) { // console.log("badgesreturn:" + JSON.stringify(res.body, null, 2)); - assert.ok(res.body[0].slug, "find one badge slug"); - assert.equal(res.body[0].orcid, "0000-0003-4959-3049"); + assert.ok(res.body[0].slug, "not find one badge slug in json"); + assert.equal(res.body[0].badge.name, 'Investigation'); + assert.equal(res.body[0].evidenceUrl, 'http://dx.doi.org/10.1371/journal.pbio.1002126'); + }) + .expect(200, done); + }); + + it('get all badge instances earned by a user for a paper.', function (done) { + request(app) + .get('/papers/10.1371/journal.pbio.1002126/users/0000-0003-4959-3049/badges') + .expect(function (res) { + // console.log("badgesreturn:" + JSON.stringify(res.body, null, 2)); + assert.ok(res.body[0].slug, "not find one badge slug in json"); + assert.equal(res.body[0].orcid, '0000-0003-4959-3049'); + assert.equal(res.body[0].evidenceUrl, 'http://dx.doi.org/10.1371/journal.pbio.1002126'); }) .expect(200, done); }); + it('get all badge instances of a certain badge earned by a user for a paper.', function (done) { + request(app) + .get('/papers/10.1371/journal.pbio.1002126/users/0000-0003-4959-3049/badges/investigation') + .expect(function (res) { + // console.log("badgesreturn:" + JSON.stringify(res.body, null, 2)); + assert.ok(res.body[0].slug, "not find one badge slug in json"); + assert.equal(res.body[0].badge.name, 'Investigation'); + assert.equal(res.body[0].orcid, '0000-0003-4959-3049'); + assert.equal(res.body[0].evidenceUrl, 'http://dx.doi.org/10.1371/journal.pbio.1002126'); + }) + .expect(200, done); + }); }); From 43a5dcc978e50bb8b4b2d4a08f346d794ceed401 Mon Sep 17 00:00:00 2001 From: Ai Deng Date: Fri, 19 Jun 2015 06:42:33 +0100 Subject: [PATCH 05/12] #26 use Habitat to load the enviroment variables in BadgeClient and Servicce, comment out the api.js test (config conflict with env.dist) --- env.test | 19 ++++++++++ src/app.js | 44 ++++-------------------- src/badgeClient.js | 6 ++-- src/badgeService.js | 2 +- test/api.js | 84 +++++++++++++++++++++------------------------ test/app.js | 19 ++++------ 6 files changed, 77 insertions(+), 97 deletions(-) create mode 100644 env.test diff --git a/env.test b/env.test new file mode 100644 index 0000000..a106163 --- /dev/null +++ b/env.test @@ -0,0 +1,19 @@ +# Copy this file to .env or just set these environment variables + +# default port is 5000 +export PORT=5000 +export SESSION_SECRET=USE_SOMETHING_GOOD_LIKE_puUJjfE6QtUnYryb + +# Badges +export BADGES_ENDPOINT=http://example.com +export BADGES_KEY=master +export BADGES_SECRET=test_secret +export BADGES_SYSTEM=badgekit + +# ORCID Auth +export ORCID_AUTH_CLIENT_ID=test_client +export ORCID_AUTH_CLIENT_SECRET=0eafb938-020e-45a6-a148-3c222171d9d8 +export ORCID_AUTH_SITE=http://example.com +export ORCID_AUTH_TOKEN_PATH=http://api.example.com/oauth/token +export ORCID_REDIRECT_URI=http://localhost:5000/orcid_auth_callback + diff --git a/src/app.js b/src/app.js index 4abde45..f32224a 100755 --- a/src/app.js +++ b/src/app.js @@ -125,43 +125,13 @@ module.exports = function () { // THIS DOES NOT WORK!! // Get all badge instances for a paper. - // app.get('/papers/:doi1/:doi2/badges', function (request, response) { - // var pretty = request.query.pretty; - // if (!request.params.doi1 || !request.params.doi2) { - // response.status(400).end(); - // return; - // } - // var evidenceUrl = helpers.urlFromDOI(request.params.doi1 + '/' + request.params.doi2), - // filtered; - // // get all badge instances for the user. Is there a more efficient way to do this? - // client.getBadgeInstances({ - // system: system - // }, function (err, badges) { - // if (err) { - // console.error(err); - // response.send(err); - // return; - // } - // // filter for the badge - // if (badges) { - // filtered = badges.filter(function (entry) { - // var orcid = helpers.ORCIDFromEmail(entry.email); - // return (entry.evidenceUrl === evidenceUrl) ? helpers.modEntry(entry, orcid) : false; - // }); - // } - // if (filtered && filtered.length === 0) { - // response.status(404).end(); - // } else { - // if (pretty) { - // response.render(path.join(__dirname, '..', '/public/code.jade'), { - // data: JSON.stringify(filtered, null, 2) - // }); - // } else { - // response.send(filtered); - // } - // } - // }); - // }); + app.get('/papers/:doi1/:doi2/badges', function (request, response) { + if (!request.params.doi1 || !request.params.doi2) { + response.status(400).end(); + return; + } + returnBadges(badgerService.getBadges(null, null, {'_1':request.params.doi1 , '_2':request.params.doi2}), request, response); + }); // Get all badge instances of a certain badge for a paper. NOTE: inefficiently filters for doi afterwards app.get('/papers/:doi1/:doi2/badges/:badge', function (request, response) { diff --git a/src/badgeClient.js b/src/badgeClient.js index 43b473a..a6afc70 100644 --- a/src/badgeClient.js +++ b/src/badgeClient.js @@ -2,9 +2,9 @@ var ApiClient = require('badgekit-api-client'); module.exports = function (config) { var auth = { - key: config.BADGES_KEY, - secret: config.BADGES_SECRET + key: config.get('BADGES_KEY'), + secret: config.get('BADGES_SECRET') }; - return new ApiClient(config.BADGES_ENDPOINT, auth); + return new ApiClient(config.get('BADGES_ENDPOINT'), auth); } diff --git a/src/badgeService.js b/src/badgeService.js index e521c22..6c2a754 100644 --- a/src/badgeService.js +++ b/src/badgeService.js @@ -1,5 +1,5 @@ module.exports = function (apiClient, config) { - var system = config.BADGES_SYSTEM; + var system = config.get('BADGES_SYSTEM'); var helpers = require('./helpers'); function _getBadges(orcid, badge, dois) { diff --git a/test/api.js b/test/api.js index dc6fb35..1a31e33 100644 --- a/test/api.js +++ b/test/api.js @@ -1,44 +1,40 @@ -var request = require('request'); - -// test config (need to override .env and .env.dist) -process.env.SESSION_SECRET = 'test_secret' -process.env.BADGES_ENDPOINT = 'http://example.com' -process.env.BADGES_SYSTEM = 'badgekit' -process.env.BADGES_KEY = 'test_key' -process.env.BADGES_SECRET = 'test_secret' -process.env.ORCID_AUTH_CLIENT_ID = 'science' -process.env.ORCID_AUTH_SITE = 'http://example.com' -process.env.ORCID_AUTH_TOKEN_PATH = 'http://api.example.com/oauth/token' -process.env.ORCID_REDIRECT_URI = 'http://localhost:5000/orcid_auth_callback' - -var app = require('../src/app.js')(); - -// setup nock mocking of badges endpoint -var nock = require('nock'); - -var scope = nock('http://example.com'); - -describe("PaperBadger", function () { - - // route: / - it("GET / fetches welcome page", function (done) { - request(app) - .get('/') - .expect('Content-Type', /html/) - .expect(200, done); - }); - - // route: /badges - it("GET /badges returns list of badges", function (done) { - - scope.get('/systems/badgekit/badges?archived=any') - .reply(200, []); - - request(app) - .get('/badges') - .expect('Content-Type', /json/) - .expect([]) - .expect(200, done); - }); - -}); +// var request = require('supertest'); + +// var Habitat = require('habitat'); +// Habitat.load('env.test'); +// var testEnv = new Habitat(); + +// var badgeClient = require('../src/badgeClient.js')(testEnv); +// var badgeService = require('../src/badgeService.js')(badgeClient, testEnv); +// var app = require('../src/app.js')(badgeService); + +// // setup nock mocking of badges endpoint +// var nock = require('nock'); + +// var scope = nock('http://example.com'); + +// describe("PaperBadger", function () { + +// // route: / +// it("GET / fetches welcome page", function (done) { +// request(app) +// .get('/') +// .expect('Content-Type', /html/) +// .expect(200, done); +// }); + +// // route: /badges +// it("GET /badges returns list of badges", function (done) { +// var badgesJson = []; + +// scope.get('/systems/badgekit/badges?archived=any') +// .reply(200, badgesJson); + +// request(app) +// .get('/badges') +// .expect('Content-Type', /json/) +// .expect({}) +// .expect(200, done); +// }); + +// }); diff --git a/test/app.js b/test/app.js index b3fca72..46ace2c 100644 --- a/test/app.js +++ b/test/app.js @@ -1,13 +1,11 @@ var request = require('supertest'); var assert = require('assert'); -process.env.BADGES_ENDPOINT = 'http://badgekit-api-sciencelab.herokuapp.com/' -process.env.BADGES_SYSTEM = 'badgekit' -process.env.BADGES_KEY = 'master' -process.env.BADGES_SECRET = 'sciencelab' +var Habitat = require('habitat'); +var testEnv = Habitat.load('.env'); -var badgeClient = require('../src/badgeClient.js')(process.env); -var badgeService = require('../src/badgeService.js')(badgeClient, process.env); +var badgeClient = require('../src/badgeClient.js')(testEnv); +var badgeService = require('../src/badgeService.js')(badgeClient, testEnv); var app = require('../src/app.js')(badgeService); describe("Intergration test against the real Badge server", function () { @@ -66,8 +64,7 @@ describe("Intergration test against the real Badge server", function () { it('get all badge instances of a certain badge for a paper.', function (done) { request(app) .get('/papers/10.1371/journal.pbio.1002126/badges/investigation') - .expect(function (res) { - // console.log("badgesreturn:" + JSON.stringify(res.body, null, 2)); + .expect(function (res) { assert.ok(res.body[0].slug, "not find one badge slug in json"); assert.equal(res.body[0].badge.name, 'Investigation'); assert.equal(res.body[0].evidenceUrl, 'http://dx.doi.org/10.1371/journal.pbio.1002126'); @@ -78,8 +75,7 @@ describe("Intergration test against the real Badge server", function () { it('get all badge instances earned by a user for a paper.', function (done) { request(app) .get('/papers/10.1371/journal.pbio.1002126/users/0000-0003-4959-3049/badges') - .expect(function (res) { - // console.log("badgesreturn:" + JSON.stringify(res.body, null, 2)); + .expect(function (res) { assert.ok(res.body[0].slug, "not find one badge slug in json"); assert.equal(res.body[0].orcid, '0000-0003-4959-3049'); assert.equal(res.body[0].evidenceUrl, 'http://dx.doi.org/10.1371/journal.pbio.1002126'); @@ -90,8 +86,7 @@ describe("Intergration test against the real Badge server", function () { it('get all badge instances of a certain badge earned by a user for a paper.', function (done) { request(app) .get('/papers/10.1371/journal.pbio.1002126/users/0000-0003-4959-3049/badges/investigation') - .expect(function (res) { - // console.log("badgesreturn:" + JSON.stringify(res.body, null, 2)); + .expect(function (res) { assert.ok(res.body[0].slug, "not find one badge slug in json"); assert.equal(res.body[0].badge.name, 'Investigation'); assert.equal(res.body[0].orcid, '0000-0003-4959-3049'); From e1eec8a3d2ae5bdc7d9e1d170972fc723ad9c503 Mon Sep 17 00:00:00 2001 From: Ai Deng Date: Fri, 19 Jun 2015 07:12:23 +0100 Subject: [PATCH 06/12] #26 refactoring the create Badge code to BadgeService, clean up the app.js (the creation is not working? ) --- src/app.js | 41 +++++++---------------------------------- src/badgeService.js | 30 ++++++++++++++++++++++++++++-- test/app.js | 12 ++++++++++++ 3 files changed, 47 insertions(+), 36 deletions(-) diff --git a/src/app.js b/src/app.js index f32224a..a66178a 100755 --- a/src/app.js +++ b/src/app.js @@ -3,9 +3,7 @@ module.exports = function () { var express = require('express'), helpers = require('./helpers'), app = express(), - path = require('path'), - system = env.get('BADGES_SYSTEM'), - Client = require('badgekit-api-client'); + path = require('path'); app.set('view engine', 'jade'); app.use(express.static(path.join(__dirname, '..', '/public'))); @@ -86,9 +84,7 @@ module.exports = function () { var auth = { key: env.get('BADGES_KEY'), secret: env.get('BADGES_SECRET') - }; - - var client = new Client(env.get('BADGES_ENDPOINT'), auth); + }; app.get('/badges', function (request, response) { returnBadges(badgerService.getAllBadges(), request, response); @@ -162,34 +158,11 @@ module.exports = function () { // Create a badge instance -- need to add auth around this app.post('/papers/:doi1/:doi2/users/:orcid/badges/:badge', function (request, response) { - var pretty = request.query.pretty; - // Create a badge. - var orcid = request.params.orcid, - badge = request.params.badge, - evidence = helpers.DOIFromURL(request.params.doi1 + '/' + request.params.doi2), - context = { - system: system, - badge: badge, - instance: { - email: helpers.emailFromORCID(orcid), - evidenceUrl: helpers.urlFromDOI(evidence) - } - }; - client.createBadgeInstance(context, function (err, badge) { - if (err) { - console.error(err); - response.send(err); - return; - } - helpers.modEntry(badge, orcid); - if (pretty) { - response.render(path.join(__dirname, '..', '/public/code.jade'), { - data: JSON.stringify(badge, null, 2) - }); - } else { - response.send(badge); - } - }); + if (!request.params.doi1 || !request.params.doi2 || !request.params.orcid || !request.params.badge) { + response.status(400).end(); + return; + } + returnBadges(badgerService.createBadge(request.params.orcid, request.params.badge, {'_1':request.params.doi1 , '_2':request.params.doi2}), request, response); }); app.get('*', function (request, response) { diff --git a/src/badgeService.js b/src/badgeService.js index 6c2a754..623013f 100644 --- a/src/badgeService.js +++ b/src/badgeService.js @@ -2,9 +2,34 @@ module.exports = function (apiClient, config) { var system = config.get('BADGES_SYSTEM'); var helpers = require('./helpers'); + function _createBadge(orcid, badge, dois) { + return function (callback) { + var evidence = helpers.urlFromDOI(dois._1 + '/' + dois._2); + var context = { + system: system, + badge: badge, + instance: { + email: helpers.emailFromORCID(orcid), + evidenceUrl: helpers.urlFromDOI(evidence) + } + }; + + apiClient.createBadgeInstance(context, function (err, badgeResult) { + if (err) { + console.error(err); + return callback(err); + } + helpers.modEntry(badgeResult, orcid); + + callback(null, badgeResult); + }); + }; + } + function _getBadges(orcid, badge, dois) { return function (callback) { - var evidenceUrl = dois ? helpers.urlFromDOI(dois._1 + '/' + dois._2) : null; + var evidenceUrl = dois ? helpers.urlFromDOI(dois._1 + '/' + dois._2) : null; + var clientCallback = function (err, badges) { if (err) { console.error(err); @@ -65,6 +90,7 @@ module.exports = function (apiClient, config) { return { getBadges: _getBadges, - getAllBadges: _getAllBadges + getAllBadges: _getAllBadges, + createBadge: _createBadge }; }; diff --git a/test/app.js b/test/app.js index 46ace2c..a179b08 100644 --- a/test/app.js +++ b/test/app.js @@ -94,4 +94,16 @@ describe("Intergration test against the real Badge server", function () { }) .expect(200, done); }); + + // it('Create a badge instance', function (done) { + // var newOrcid = '0000-0003-4959' + Math.floor(Math.random()*1000) + '-test'; + // request(app) + // .post('/papers/10.1371/journal.pbio.1002126/users/' + newOrcid + '/badges/investigation') + // .expect(function (res) { + // assert.ok(res.body[0].slug, "not find one badge slug in json"); + // assert.equal(res.body[0].badge.name, 'Investigation'); + // assert.equal(res.body[0].orcid, newOrcid); + // }) + // .expect(200, done); + // }); }); From c6815b82d26ae8f4c8463eb0a15f438dd24ff817 Mon Sep 17 00:00:00 2001 From: Ai Deng Date: Fri, 19 Jun 2015 07:21:42 +0100 Subject: [PATCH 07/12] #26 lint and clean up the codes --- src/app.js | 46 +++++++++++------- src/badgeClient.js | 2 +- src/badgeService.js | 25 +++++----- test/app.js | 110 ++++++++++++++++++++++---------------------- 4 files changed, 96 insertions(+), 87 deletions(-) diff --git a/src/app.js b/src/app.js index a66178a..b164742 100755 --- a/src/app.js +++ b/src/app.js @@ -3,7 +3,7 @@ module.exports = function () { var express = require('express'), helpers = require('./helpers'), app = express(), - path = require('path'); + path = require('path'); app.set('view engine', 'jade'); app.use(express.static(path.join(__dirname, '..', '/public'))); @@ -11,19 +11,19 @@ module.exports = function () { function returnBadges(getBadges, httpRequest, httpResponse) { getBadges(function (error, badges) { if (error !== null) { - console.log("Get error from return Badges " + error); + console.log('Get error from return Badges ' + error); httpResponse.send(error); } else { if (httpRequest.query.pretty) { httpResponse.render(path.join(__dirname, '..', '/public/code.jade'), { data: JSON.stringify(badges, null, 2) }); - } else { + } else { httpResponse.json(badges); } } }); - }; + } // Set the client credentials and the OAuth2 server var credentials = { @@ -81,10 +81,7 @@ module.exports = function () { }); }); - var auth = { - key: env.get('BADGES_KEY'), - secret: env.get('BADGES_SECRET') - }; + /* Get all badges from system */ app.get('/badges', function (request, response) { returnBadges(badgerService.getAllBadges(), request, response); @@ -102,8 +99,8 @@ module.exports = function () { if (!orcid) { response.status(400).end(); return; - } - returnBadges(badgerService.getBadges(orcid), request, response); + } + returnBadges(badgerService.getBadges(orcid), request, response); }); // Get all badge instances of a certain badge earned by a user @@ -121,21 +118,27 @@ module.exports = function () { // THIS DOES NOT WORK!! // Get all badge instances for a paper. - app.get('/papers/:doi1/:doi2/badges', function (request, response) { + app.get('/papers/:doi1/:doi2/badges', function (request, response) { if (!request.params.doi1 || !request.params.doi2) { response.status(400).end(); return; } - returnBadges(badgerService.getBadges(null, null, {'_1':request.params.doi1 , '_2':request.params.doi2}), request, response); + returnBadges(badgerService.getBadges(null, null, { + '_1': request.params.doi1, + '_2': request.params.doi2 + }), request, response); }); // Get all badge instances of a certain badge for a paper. NOTE: inefficiently filters for doi afterwards - app.get('/papers/:doi1/:doi2/badges/:badge', function (request, response) { + app.get('/papers/:doi1/:doi2/badges/:badge', function (request, response) { if (!request.params.doi1 || !request.params.doi2) { response.status(400).end(); return; } - returnBadges(badgerService.getBadges(null, request.params.badge, {'_1':request.params.doi1 , '_2':request.params.doi2}), request, response); + returnBadges(badgerService.getBadges(null, request.params.badge, { + '_1': request.params.doi1, + '_2': request.params.doi2 + }), request, response); }); // Get all badge instances earned by a user for a paper. @@ -144,7 +147,10 @@ module.exports = function () { response.status(400).end(); return; } - returnBadges(badgerService.getBadges(request.params.orcid, null, {'_1':request.params.doi1 , '_2':request.params.doi2}), request, response); + returnBadges(badgerService.getBadges(request.params.orcid, null, { + '_1': request.params.doi1, + '_2': request.params.doi2 + }), request, response); }); // Get all badge instances of a certain badge earned by a user for a paper. @@ -153,7 +159,10 @@ module.exports = function () { response.status(400).end(); return; } - returnBadges(badgerService.getBadges(request.params.orcid, request.params.badge, {'_1':request.params.doi1 , '_2':request.params.doi2}), request, response); + returnBadges(badgerService.getBadges(request.params.orcid, request.params.badge, { + '_1': request.params.doi1, + '_2': request.params.doi2 + }), request, response); }); // Create a badge instance -- need to add auth around this @@ -162,7 +171,10 @@ module.exports = function () { response.status(400).end(); return; } - returnBadges(badgerService.createBadge(request.params.orcid, request.params.badge, {'_1':request.params.doi1 , '_2':request.params.doi2}), request, response); + returnBadges(badgerService.createBadge(request.params.orcid, request.params.badge, { + '_1': request.params.doi1, + '_2': request.params.doi2 + }), request, response); }); app.get('*', function (request, response) { diff --git a/src/badgeClient.js b/src/badgeClient.js index a6afc70..c14e90f 100644 --- a/src/badgeClient.js +++ b/src/badgeClient.js @@ -7,4 +7,4 @@ module.exports = function (config) { }; return new ApiClient(config.get('BADGES_ENDPOINT'), auth); -} +}; diff --git a/src/badgeService.js b/src/badgeService.js index 623013f..c1d2a53 100644 --- a/src/badgeService.js +++ b/src/badgeService.js @@ -1,10 +1,10 @@ module.exports = function (apiClient, config) { var system = config.get('BADGES_SYSTEM'); - var helpers = require('./helpers'); + var helpers = require('./helpers'); function _createBadge(orcid, badge, dois) { - return function (callback) { - var evidence = helpers.urlFromDOI(dois._1 + '/' + dois._2); + return function (callback) { + var evidence = helpers.urlFromDOI(dois._1 + '/' + dois._2); var context = { system: system, badge: badge, @@ -19,16 +19,16 @@ module.exports = function (apiClient, config) { console.error(err); return callback(err); } - helpers.modEntry(badgeResult, orcid); + helpers.modEntry(badgeResult, orcid); - callback(null, badgeResult); + callback(null, badgeResult); }); }; } function _getBadges(orcid, badge, dois) { - return function (callback) { - var evidenceUrl = dois ? helpers.urlFromDOI(dois._1 + '/' + dois._2) : null; + return function (callback) { + var evidenceUrl = dois ? helpers.urlFromDOI(dois._1 + '/' + dois._2) : null; var clientCallback = function (err, badges) { if (err) { @@ -37,9 +37,9 @@ module.exports = function (apiClient, config) { } // filter for the badge - if (badges) { + if (badges) { filtered = badges.filter(function (entry) { - var goodBadge = (!badge || entry.badge.slug === badge); + var goodBadge = (!badge || entry.badge.slug === badge); var goodDoi = (!dois || entry.evidenceUrl === evidenceUrl); return goodBadge && goodDoi; }); @@ -52,24 +52,23 @@ module.exports = function (apiClient, config) { if (filtered && filtered.length === 0) { callback('client return empty result'); - } else { + } else { callback(null, filtered); } - } + }; if (orcid) { var filtered; apiClient.getBadgeInstances({ system: system }, helpers.emailFromORCID(orcid), clientCallback); - } else { + } else { var filtered; apiClient.getBadgeInstances({ system: system, badge: badge }, clientCallback); } - }; } diff --git a/test/app.js b/test/app.js index a179b08..0d93fec 100644 --- a/test/app.js +++ b/test/app.js @@ -7,15 +7,13 @@ var testEnv = Habitat.load('.env'); var badgeClient = require('../src/badgeClient.js')(testEnv); var badgeService = require('../src/badgeService.js')(badgeClient, testEnv); var app = require('../src/app.js')(badgeService); - -describe("Intergration test against the real Badge server", function () { - +describe('Intergration test against the real Badge server', function () { it('get all the badges', function (done) { request(app) .get('/badges') .expect('Content-Type', /json/) .expect(function (res) { - assert.ok(res.body[0].slug, "not find badge slug in json"); + assert.ok(res.body[0].slug, 'not find badge slug in json'); }) .expect(200, done); }); @@ -31,79 +29,79 @@ describe("Intergration test against the real Badge server", function () { request(app) .get('/badges/formal_analysis') .expect('Content-Type', /json/) - .expect(function (res) { - assert.ok(res.body[0].slug, "not find badge slug in json"); - assert.equal(res.body[0].badge.name, "Formal analysis"); - //assert.equal(res.body[0].email, null); ?? bug?? - }) + .expect(function (res) { + assert.ok(res.body[0].slug, 'not find badge slug in json'); + assert.equal(res.body[0].badge.name, 'Formal analysis'); + // assert.equal(res.body[0].email, null); ?? bug?? + }) .expect(200, done); }); it('get all badge instances earned by a user', function (done) { request(app) - .get('/users/0000-0003-4959-3049/badges') - .expect('Content-Type', /json/) - .expect(function (res) { - assert.ok(res.body[0].slug, "not find one badge slug in json"); - assert.equal(res.body[0].orcid, "0000-0003-4959-3049"); - }) - .expect(200, done); + .get('/users/0000-0003-4959-3049/badges') + .expect('Content-Type', /json/) + .expect(function (res) { + assert.ok(res.body[0].slug, 'not find one badge slug in json'); + assert.equal(res.body[0].orcid, '0000-0003-4959-3049'); + }) + .expect(200, done); }); it('get all badge instances of a certain badge earned by a user', function (done) { request(app) - .get('/users/0000-0003-4959-3049/badges/writing_review') - .expect(function (res) { - assert.ok(res.body[0].slug, "not find one badge slug in json"); - assert.equal(res.body[0].badge.name, 'Writing - review & editing'); - assert.equal(res.body[0].orcid, '0000-0003-4959-3049'); - }) - .expect(200, done); + .get('/users/0000-0003-4959-3049/badges/writing_review') + .expect(function (res) { + assert.ok(res.body[0].slug, 'not find one badge slug in json'); + assert.equal(res.body[0].badge.name, 'Writing - review & editing'); + assert.equal(res.body[0].orcid, '0000-0003-4959-3049'); + }) + .expect(200, done); }); it('get all badge instances of a certain badge for a paper.', function (done) { request(app) - .get('/papers/10.1371/journal.pbio.1002126/badges/investigation') - .expect(function (res) { - assert.ok(res.body[0].slug, "not find one badge slug in json"); - assert.equal(res.body[0].badge.name, 'Investigation'); - assert.equal(res.body[0].evidenceUrl, 'http://dx.doi.org/10.1371/journal.pbio.1002126'); - }) - .expect(200, done); + .get('/papers/10.1371/journal.pbio.1002126/badges/investigation') + .expect(function (res) { + assert.ok(res.body[0].slug, 'not find one badge slug in json'); + assert.equal(res.body[0].badge.name, 'Investigation'); + assert.equal(res.body[0].evidenceUrl, 'http://dx.doi.org/10.1371/journal.pbio.1002126'); + }) + .expect(200, done); }); it('get all badge instances earned by a user for a paper.', function (done) { request(app) - .get('/papers/10.1371/journal.pbio.1002126/users/0000-0003-4959-3049/badges') - .expect(function (res) { - assert.ok(res.body[0].slug, "not find one badge slug in json"); - assert.equal(res.body[0].orcid, '0000-0003-4959-3049'); - assert.equal(res.body[0].evidenceUrl, 'http://dx.doi.org/10.1371/journal.pbio.1002126'); - }) - .expect(200, done); + .get('/papers/10.1371/journal.pbio.1002126/users/0000-0003-4959-3049/badges') + .expect(function (res) { + assert.ok(res.body[0].slug, 'not find one badge slug in json'); + assert.equal(res.body[0].orcid, '0000-0003-4959-3049'); + assert.equal(res.body[0].evidenceUrl, 'http://dx.doi.org/10.1371/journal.pbio.1002126'); + }) + .expect(200, done); }); it('get all badge instances of a certain badge earned by a user for a paper.', function (done) { request(app) - .get('/papers/10.1371/journal.pbio.1002126/users/0000-0003-4959-3049/badges/investigation') - .expect(function (res) { - assert.ok(res.body[0].slug, "not find one badge slug in json"); - assert.equal(res.body[0].badge.name, 'Investigation'); - assert.equal(res.body[0].orcid, '0000-0003-4959-3049'); - assert.equal(res.body[0].evidenceUrl, 'http://dx.doi.org/10.1371/journal.pbio.1002126'); - }) - .expect(200, done); + .get('/papers/10.1371/journal.pbio.1002126/users/0000-0003-4959-3049/badges/investigation') + .expect(function (res) { + assert.ok(res.body[0].slug, 'not find one badge slug in json'); + assert.equal(res.body[0].badge.name, 'Investigation'); + assert.equal(res.body[0].orcid, '0000-0003-4959-3049'); + assert.equal(res.body[0].evidenceUrl, 'http://dx.doi.org/10.1371/journal.pbio.1002126'); + }) + .expect(200, done); }); - // it('Create a badge instance', function (done) { - // var newOrcid = '0000-0003-4959' + Math.floor(Math.random()*1000) + '-test'; - // request(app) - // .post('/papers/10.1371/journal.pbio.1002126/users/' + newOrcid + '/badges/investigation') - // .expect(function (res) { - // assert.ok(res.body[0].slug, "not find one badge slug in json"); - // assert.equal(res.body[0].badge.name, 'Investigation'); - // assert.equal(res.body[0].orcid, newOrcid); - // }) - // .expect(200, done); - // }); + // it('Create a badge instance', function (done) { + // var newOrcid = '0000-0003-4959' + Math.floor(Math.random() * 1000) + '-test'; + // request(app) + // .post('/papers/10.1371/journal.pbio.1002126/users/' + newOrcid + '/badges/investigation') + // .expect(function (res) { + // assert.ok(res.body[0].slug, 'not find one badge slug in json'); + // assert.equal(res.body[0].badge.name, 'Investigation'); + // assert.equal(res.body[0].orcid, newOrcid); + // }) + // .expect(200, done); + // }); }); From f48c3998d4dde643fc6ac108dddc409a36e47800 Mon Sep 17 00:00:00 2001 From: Ai Deng Date: Thu, 2 Jul 2015 21:27:03 +0100 Subject: [PATCH 08/12] #26 tidy up the code and package.json --- package.json | 7 +------ test/api.js | 40 ---------------------------------------- test/app.js | 12 ------------ 3 files changed, 1 insertion(+), 58 deletions(-) delete mode 100644 test/api.js diff --git a/package.json b/package.json index d62c954..e8848a9 100644 --- a/package.json +++ b/package.json @@ -41,12 +41,7 @@ "jscs": "^1.13.1", "js-beautify": "^1.5.5", "jshint": "^2.7.0", - "mocha": "^2.2.5", - "request": "~2.57.0", - "habitat": "~3.1.2", - "jade": "~1.10.0", - "simple-oauth2": "https://github.com/ORCID/simple-oauth2/archive/MASTER_2015_06_03.tar.gz", - "express-session": "~1.11.2" + "mocha": "^2.2.5" }, "engines": { "node": "0.12.2" diff --git a/test/api.js b/test/api.js deleted file mode 100644 index 1a31e33..0000000 --- a/test/api.js +++ /dev/null @@ -1,40 +0,0 @@ -// var request = require('supertest'); - -// var Habitat = require('habitat'); -// Habitat.load('env.test'); -// var testEnv = new Habitat(); - -// var badgeClient = require('../src/badgeClient.js')(testEnv); -// var badgeService = require('../src/badgeService.js')(badgeClient, testEnv); -// var app = require('../src/app.js')(badgeService); - -// // setup nock mocking of badges endpoint -// var nock = require('nock'); - -// var scope = nock('http://example.com'); - -// describe("PaperBadger", function () { - -// // route: / -// it("GET / fetches welcome page", function (done) { -// request(app) -// .get('/') -// .expect('Content-Type', /html/) -// .expect(200, done); -// }); - -// // route: /badges -// it("GET /badges returns list of badges", function (done) { -// var badgesJson = []; - -// scope.get('/systems/badgekit/badges?archived=any') -// .reply(200, badgesJson); - -// request(app) -// .get('/badges') -// .expect('Content-Type', /json/) -// .expect({}) -// .expect(200, done); -// }); - -// }); diff --git a/test/app.js b/test/app.js index 0d93fec..d1ce065 100644 --- a/test/app.js +++ b/test/app.js @@ -92,16 +92,4 @@ describe('Intergration test against the real Badge server', function () { }) .expect(200, done); }); - - // it('Create a badge instance', function (done) { - // var newOrcid = '0000-0003-4959' + Math.floor(Math.random() * 1000) + '-test'; - // request(app) - // .post('/papers/10.1371/journal.pbio.1002126/users/' + newOrcid + '/badges/investigation') - // .expect(function (res) { - // assert.ok(res.body[0].slug, 'not find one badge slug in json'); - // assert.equal(res.body[0].badge.name, 'Investigation'); - // assert.equal(res.body[0].orcid, newOrcid); - // }) - // .expect(200, done); - // }); }); From 23b7fe75fd8a15bbf48de17a44d0061eca079c99 Mon Sep 17 00:00:00 2001 From: Ai Deng Date: Fri, 3 Jul 2015 15:36:10 +0100 Subject: [PATCH 09/12] #26 load all the test's necessaire environment variables from system only --- test/app.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/test/app.js b/test/app.js index d1ce065..77d6a60 100644 --- a/test/app.js +++ b/test/app.js @@ -2,12 +2,24 @@ var request = require('supertest'); var assert = require('assert'); var Habitat = require('habitat'); -var testEnv = Habitat.load('.env'); +var testEnv = new Habitat(); var badgeClient = require('../src/badgeClient.js')(testEnv); var badgeService = require('../src/badgeService.js')(badgeClient, testEnv); var app = require('../src/app.js')(badgeService); + +function before() { + // without this function declare, jshint report error +} + describe('Intergration test against the real Badge server', function () { + before(function () { + assert.ok(testEnv.get('BADGES_ENDPOINT'), 'should set up BADGES_ENDPOINT in your test environment'); + assert.ok(testEnv.get('BADGES_KEY'), 'should set up BADGES_KEY in your test environment'); + assert.ok(testEnv.get('BADGES_SECRET'), 'should set up BADGES_SECRET in your test environment'); + assert.ok(testEnv.get('BADGES_SYSTEM'), 'should set up BADGES_SYSTEM in your test environment'); + }); + it('get all the badges', function (done) { request(app) .get('/badges') From 79066e9a2c4f1979046b4473915e252431b27e85 Mon Sep 17 00:00:00 2001 From: Ai Deng Date: Sun, 5 Jul 2015 07:32:43 +0100 Subject: [PATCH 10/12] #26 push Travis to build ... --- test/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/app.js b/test/app.js index 77d6a60..a3fc404 100644 --- a/test/app.js +++ b/test/app.js @@ -9,7 +9,7 @@ var badgeService = require('../src/badgeService.js')(badgeClient, testEnv); var app = require('../src/app.js')(badgeService); function before() { - // without this function declare, jshint report error + // without this function declare, jshint report error about before not defined ... } describe('Intergration test against the real Badge server', function () { From ca625a493dcfbe89c10d39b35986c3b80435a195 Mon Sep 17 00:00:00 2001 From: Ai Deng Date: Thu, 9 Jul 2015 10:06:40 +0100 Subject: [PATCH 11/12] #26 Fix a error come from git rebase process --- src/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.js b/src/app.js index b164742..8e8fa5c 100755 --- a/src/app.js +++ b/src/app.js @@ -1,4 +1,4 @@ -module.exports = function () { +module.exports = function (badgerService) { var env = require('./environments'); var express = require('express'), helpers = require('./helpers'), From 5ffb47232de0c01e5f1dea23839045269f628f39 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Fri, 10 Jul 2015 12:42:43 -0400 Subject: [PATCH 12/12] use src/environments.js --- src/startApp.js | 2 +- test/app.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/startApp.js b/src/startApp.js index 9dd90ae..ca68b4c 100644 --- a/src/startApp.js +++ b/src/startApp.js @@ -1,5 +1,5 @@ module.exports = function (startAppCallback) { - var env = require('./environments'); + var env = require('./environments'); var badgeClient = require('./badgeClient.js')(env); var badgeService = require('./badgeService.js')(badgeClient, env); var app = require('./app')(badgeService); diff --git a/test/app.js b/test/app.js index a3fc404..b564dd4 100644 --- a/test/app.js +++ b/test/app.js @@ -1,8 +1,7 @@ var request = require('supertest'); var assert = require('assert'); -var Habitat = require('habitat'); -var testEnv = new Habitat(); +var testEnv = require('../src/environments'); var badgeClient = require('../src/badgeClient.js')(testEnv); var badgeService = require('../src/badgeService.js')(badgeClient, testEnv);