refactor [maven-metadata] service (#3085)

This commit is contained in:
chris48s
2019-02-23 20:29:46 +00:00
committed by Paul Melnikow
parent 6684f4b566
commit 7d1d74cfcf
2 changed files with 40 additions and 59 deletions

View File

@@ -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],
})
}
}

View File

@@ -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' })