diff --git a/services/sourceforge/sourceforge-open-tickets.service.js b/services/sourceforge/sourceforge-open-tickets.service.js new file mode 100644 index 0000000000..971ed71d8e --- /dev/null +++ b/services/sourceforge/sourceforge-open-tickets.service.js @@ -0,0 +1,66 @@ +'use strict' + +const Joi = require('@hapi/joi') +const { metric } = require('../text-formatters') +const { nonNegativeInteger } = require('../validators') +const { BaseJsonService } = require('..') + +const schema = Joi.object({ + count: nonNegativeInteger.required(), +}).required() + +module.exports = class SourceforgeOpenTickets extends BaseJsonService { + static get category() { + return 'other' + } + + static get route() { + return { + base: 'sourceforge/open-tickets', + pattern: ':project/:type(bugs|feature-requests)', + } + } + + static get examples() { + return [ + { + title: 'Sourceforge Open Tickets', + namedParams: { + type: 'bugs', + project: 'sevenzip', + }, + staticPreview: this.render({ count: 1338 }), + }, + ] + } + + static get defaultBadgeData() { + return { + label: 'open tickets', + color: 'blue', + } + } + + static render({ count }) { + return { + message: metric(count), + } + } + + async fetch({ type, project }) { + const url = `https://sourceforge.net/rest/p/${project}/${type}/search?limit=1&q=status%3Aopen` + + return this._requestJson({ + schema, + url, + errorMessages: { + 404: 'project not found', + }, + }) + } + + async handle({ type, project }) { + const { count } = await this.fetch({ type, project }) + return this.constructor.render({ count }) + } +} diff --git a/services/sourceforge/sourceforge-open-tickets.tester.js b/services/sourceforge/sourceforge-open-tickets.tester.js new file mode 100644 index 0000000000..3636eb9aea --- /dev/null +++ b/services/sourceforge/sourceforge-open-tickets.tester.js @@ -0,0 +1,27 @@ +'use strict' + +const { isMetric } = require('../test-validators') +const t = (module.exports = require('../tester').createServiceTester()) + +t.create('bugs') + .get('/sevenzip/bugs.json') + .expectBadge({ + label: 'open tickets', + message: isMetric, + }) + .timeout(10000) + +t.create('feature requests') + .get('/sevenzip/feature-requests.json') + .expectBadge({ + label: 'open tickets', + message: isMetric, + }) + .timeout(10000) + +t.create('invalid project') + .get('/invalid/bugs.json') + .expectBadge({ + label: 'open tickets', + message: 'project not found', + })