diff --git a/src/app.js b/src/app.js index 831c247..bfe569b 100755 --- a/src/app.js +++ b/src/app.js @@ -121,20 +121,25 @@ module.exports = function (badgerService) { 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); @@ -143,7 +148,8 @@ module.exports = function (badgerService) { // // 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) { @@ -160,165 +166,31 @@ module.exports = function (badgerService) { // }); // }); - /* 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); + }); });