Refactor [Swagger] Service (#2215)
This commit is contained in:
committed by
Pierre-Yves B
parent
b866089c64
commit
6e8c71b01b
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
47
services/swagger/swagger.tester.js
Normal file
47
services/swagger/swagger.tester.js
Normal 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
|
||||
Reference in New Issue
Block a user