Refactor [Swagger] Service (#2215)

This commit is contained in:
Tagan Hoyle
2018-10-27 10:30:26 +02:00
committed by Pierre-Yves B
parent b866089c64
commit 6e8c71b01b
3 changed files with 111 additions and 63 deletions

View File

@@ -1523,11 +1523,6 @@ const allBadgeExamples = [
previewUrl: '/amo/users/dustman.svg',
keywords: ['amo', 'firefox'],
},
{
title: 'Swagger Validator',
previewUrl:
'/swagger/valid/2.0/https/raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v2.0/json/petstore-expanded.json.svg',
},
{
title: 'Vaadin Directory',
previewUrl: '/vaadin-directory/status/vaadinvaadin-grid.svg',

View File

@@ -1,67 +1,73 @@
'use strict'
const LegacyService = require('../legacy-service')
const { makeBadgeData: getBadgeData } = require('../../lib/badge-data')
const Joi = require('joi')
const BaseJsonService = require('../base-json')
// For a Swagger Validator.
module.exports = class Swagger extends LegacyService {
static registerLegacyRouteHandler({ camp, cache }) {
camp.route(
/^\/swagger\/(valid)\/(2\.0)\/(https?)\/(.+)\.(svg|png|gif|jpg|json)$/,
cache((data, match, sendBadge, request) => {
// match[1] is not used // e.g. `valid` for validate
// match[2] is reserved for future use // e.g. `2.0` for OpenAPI 2.0
const scheme = match[3] // e.g. `https`
const swaggerUrl = match[4] // e.g. `api.example.com/swagger.yaml`
const format = match[5]
const validatorSchema = Joi.object()
.keys({
schemaValidationMessages: Joi.array().items(
Joi.object({
level: Joi.string().required(),
message: Joi.string().required(),
}).required()
),
})
.required()
const badgeData = getBadgeData('swagger', data)
module.exports = class SwaggerValidatorService extends BaseJsonService {
static render({ message, clr }) {
return { message: message, color: clr }
}
const urlParam = encodeURIComponent(scheme + '://' + swaggerUrl)
const url = 'http://online.swagger.io/validator/debug?url=' + urlParam
const options = {
method: 'GET',
url: url,
gzip: true,
json: true,
}
request(options, (err, res, json) => {
try {
if (
err != null ||
res.statusCode >= 500 ||
typeof json !== 'object'
) {
badgeData.text[1] = 'inaccessible'
sendBadge(format, badgeData)
return
}
static get url() {
return {
base: 'swagger/valid/2.0',
format: '(http(?:s)?)/(.+)',
capture: ['scheme', 'url'],
}
}
const messages = json.schemaValidationMessages
if (messages == null || messages.length === 0) {
badgeData.colorscheme = 'brightgreen'
badgeData.text[1] = 'valid'
} else {
badgeData.colorscheme = 'red'
static get defaultBadgeData() {
return { label: 'swagger' }
}
const firstMessage = messages[0]
if (
messages.length === 1 &&
firstMessage.level === 'error' &&
/^Can't read from/.test(firstMessage.message)
) {
badgeData.text[1] = 'not found'
} else {
badgeData.text[1] = 'invalid'
}
}
sendBadge(format, badgeData)
} catch (e) {
badgeData.text[1] = 'inaccessible'
sendBadge(format, badgeData)
}
})
})
)
async handle({ scheme, url }) {
const json = await this.fetch({ scheme, urlF: url })
const valMessages = json.schemaValidationMessages
if (!valMessages || valMessages.length === 0) {
return this.constructor.render({ message: 'valid', clr: 'brightgreen' })
} else {
return this.constructor.render({ message: 'invalid', clr: 'red' })
}
}
async fetch({ scheme, urlF }) {
const url = 'http://online.swagger.io/validator/debug'
return this._requestJson({
url,
schema: validatorSchema,
options: {
qs: {
url: `${scheme}://${urlF}`,
},
},
})
}
static get category() {
return 'other'
}
static get examples() {
return [
{
title: 'Swagger Validator',
urlPattern: ':scheme/:url',
staticExample: this.render({ message: 'valid', clr: 'brightgreen' }),
exampleUrl:
'https/raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v2.0/json/petstore-expanded.json',
},
]
}
}

View File

@@ -0,0 +1,47 @@
'use strict'
const createServiceTester = require('../create-service-tester')
const { colorScheme } = require('../test-helpers')
const t = createServiceTester()
const getURL = '/https/example.com/example.json.json?style=_shields_test'
const apiURL = 'http://online.swagger.io'
const apiGetURL = '/validator/debug'
const apiGetQueryParams = { url: 'https://example.com/example.json' }
t.create('Valid (mocked)')
.get(getURL)
.intercept(nock =>
nock(apiURL)
.get(apiGetURL)
.query(apiGetQueryParams)
.reply(200, {})
)
.expectJSON({
name: 'swagger',
value: 'valid',
colorB: colorScheme.brightgreen,
})
t.create('Invalid (mocked)')
.get(getURL)
.intercept(nock =>
nock(apiURL)
.get(apiGetURL)
.query(apiGetQueryParams)
.reply(200, {
schemaValidationMessages: [
{
level: 'error',
message: 'error',
},
],
})
)
.expectJSON({
name: 'swagger',
value: 'invalid',
colorB: colorScheme.red,
})
module.exports = t