refactor [maven-metadata] service (#3085)
This commit is contained in:
@@ -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],
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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' })
|
||||
|
||||
Reference in New Issue
Block a user