diff --git a/server.js b/server.js index 39bb32ad81..05ca81ab94 100644 --- a/server.js +++ b/server.js @@ -2796,6 +2796,52 @@ cache(function(data, match, sendBadge, request) { }); })); +// dotnet-status integration. +camp.route(/^\/dotnetstatus\/(.+)\.(svg|png|gif|jpg|json)$/, +cache(function(data, match, sendBadge, request) { + var projectUri = match[1]; // gh/{USER}/{REPO}/{PROJECT} + var format = match[2]; + var url = 'http://dotnet-status.com/api/status/' + projectUri + '/'; + var badgeData = getBadgeData('dependencies', data); + var sendErrorBadge = function() { + badgeData.text[1] = 'inconclusive'; + sendBadge(format, badgeData); + }; + + request(url, function (err, res, buffer) { + if (err != null || res.statusCode === 404) { + sendErrorBadge(); + return; + } + + if (res.statusCode === 202) { + badgeData.text[1] = 'processing'; + sendBadge(format, badgeData); + return; + } + + try { + var data = JSON.parse(buffer); + if(data.projectResults.length === 1 && data.projectResults[0] !== null) { + if (data.projectResults[0].outOfDate) { + badgeData.text[1] = 'out of date'; + badgeData.colorscheme = 'red'; + } else { + badgeData.text[1] = 'up to date'; + badgeData.colorscheme = 'blue'; + } + } + else { + badgeData.text[1] = 'project not found'; + } + sendBadge(format, badgeData); + } + catch (e) { + sendErrorBadge(); + } + }); +})); + // Gemnasium integration camp.route(/^\/gemnasium\/(.+)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { diff --git a/service-tests/dotnetstatus.js b/service-tests/dotnetstatus.js new file mode 100644 index 0000000000..8eb62c92f8 --- /dev/null +++ b/service-tests/dotnetstatus.js @@ -0,0 +1,30 @@ +"use strict"; + +const Joi = require("joi"); +const ServiceTester = require("./runner/service-tester"); + +const t = new ServiceTester({ + id: "dotnetstatus", + title: "dotnet-status" +}); +module.exports = t; + +t + .create("get nuget package status") + .get("/gh/jaredcnance/dotnet-status/API.json") + .expectJSONTypes( + Joi.object().keys({ + name: Joi.equal("dependencies"), + value: Joi.equal("up to date", "out of date", "processing") + }) + ); + +t + .create("get nuget package status") + .get("/gh/jaredcnance/dotnet-status/invalid-project.json") + .expectJSON({ name: "dependencies", value: "project not found" }); + +t + .create("get nuget package status error") + .get("/not-a-valid-uri.json") + .expectJSON({ name: "dependencies", value: "inconclusive" }); diff --git a/try.html b/try.html index 98b3d15f88..37932e62c7 100644 --- a/try.html +++ b/try.html @@ -1208,6 +1208,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/david/peer/webcomponents/generator-element.svghttps://img.shields.io/dotnetstatus/gh/jaredcnance/dotnet-status/API.svghttps://img.shields.io/bithound/dependencies/github/rexxars/sse-channel.svg