diff --git a/services/maven-metadata/maven-metadata.service.js b/services/maven-metadata/maven-metadata.service.js index db7dd4af54..13b1267a8c 100644 --- a/services/maven-metadata/maven-metadata.service.js +++ b/services/maven-metadata/maven-metadata.service.js @@ -1,18 +1,24 @@ 'use strict' -const xml2js = require('xml2js') -const LegacyService = require('../legacy-service') -const { makeBadgeData: getBadgeData } = require('../../lib/badge-data') -const { addv: versionText } = require('../../lib/text-formatters') -const { version: versionColor } = require('../../lib/color-formatters') +const Joi = require('joi') +const { BaseXmlService } = require('..') +const { renderVersionBadge } = require('../../lib/version') -// This legacy service should be rewritten to use e.g. BaseJsonService. -// -// Tips for rewriting: -// https://github.com/badges/shields/blob/master/doc/rewriting-services.md -// -// Do not base new services on this code. -module.exports = class MavenMetadata extends LegacyService { +const schema = Joi.object({ + metadata: Joi.object({ + versioning: Joi.object({ + versions: Joi.object({ + version: Joi.array() + .items( + Joi.alternatives(Joi.string().required(), Joi.number().required()) + ) + .required(), + }).required(), + }).required(), + }).required(), +}).required() + +module.exports = class MavenMetadata extends BaseXmlService { static get category() { return 'version' } @@ -20,7 +26,7 @@ module.exports = class MavenMetadata extends LegacyService { static get route() { return { base: 'maven-metadata/v', - pattern: ':protocol(http|https)/:hostAndPath', + pattern: ':protocol(http|https)/:hostAndPath+', } } @@ -33,55 +39,24 @@ module.exports = class MavenMetadata extends LegacyService { hostAndPath: 'central.maven.org/maven2/com/google/code/gson/gson/maven-metadata.xml', }, - staticPreview: { - label: 'maven', - message: 'v2.8.5', - color: 'blue', - }, + staticPreview: renderVersionBadge({ version: '2.8.5' }), }, ] } - static registerLegacyRouteHandler({ camp, cache }) { - camp.route( - /^\/maven-metadata\/v\/(https?)\/(.+\.xml)\.(svg|png|gif|jpg|json)$/, - cache((data, match, sendBadge, request) => { - const [, scheme, hostAndPath, format] = match - const metadataUri = `${scheme}://${hostAndPath}` - request(metadataUri, (error, response, body) => { - const badge = getBadgeData('maven', data) - if ( - !error && - response.statusCode >= 200 && - response.statusCode < 300 - ) { - try { - xml2js.parseString(body, (err, result) => { - if (err) { - badge.text[1] = 'error' - badge.colorscheme = 'red' - sendBadge(format, badge) - } else { - const version = result.metadata.versioning[0].versions[0].version.slice( - -1 - )[0] - badge.text[1] = versionText(version) - badge.colorscheme = versionColor(version) - sendBadge(format, badge) - } - }) - } catch (e) { - badge.text[1] = 'error' - badge.colorscheme = 'red' - sendBadge(format, badge) - } - } else { - badge.text[1] = 'error' - badge.colorscheme = 'red' - sendBadge(format, badge) - } - }) - }) - ) + static get defaultBadgeData() { + return { label: 'maven' } + } + + async fetch({ protocol, hostAndPath }) { + const url = `${protocol}://${hostAndPath}` + return this._requestXml({ schema, url }) + } + + async handle({ protocol, hostAndPath }) { + const data = await this.fetch({ protocol, hostAndPath }) + return renderVersionBadge({ + version: data.metadata.versioning.versions.version.slice(-1)[0], + }) } } diff --git a/services/maven-metadata/maven-metadata.tester.js b/services/maven-metadata/maven-metadata.tester.js index fcf388672f..f3a5a00f49 100644 --- a/services/maven-metadata/maven-metadata.tester.js +++ b/services/maven-metadata/maven-metadata.tester.js @@ -19,3 +19,9 @@ t.create('valid maven-metadata.xml uri') value: isVPlusDottedVersionAtLeastOne, }) ) + +t.create('invalid maven-metadata.xml uri') + .get( + '/v/http/central.maven.org/maven2/com/google/code/gson/gson/foobar.xml.json' + ) + .expectJSON({ name: 'maven', value: 'not found' })