From a7b7cc00b52e51f8f74b39df1903cf5bf3bf31a9 Mon Sep 17 00:00:00 2001 From: Wangchong Zhou Date: Tue, 18 Feb 2020 02:08:04 +0800 Subject: [PATCH] Added [OPM] version badge (#4615) Co-Authored-By: Caleb Cartwright Co-authored-by: Caleb Cartwright --- services/opm/opm-version.service.js | 69 +++++++++++++++++++++++++++++ services/opm/opm-version.tester.js | 23 ++++++++++ 2 files changed, 92 insertions(+) create mode 100644 services/opm/opm-version.service.js create mode 100644 services/opm/opm-version.tester.js diff --git a/services/opm/opm-version.service.js b/services/opm/opm-version.service.js new file mode 100644 index 0000000000..9644a60201 --- /dev/null +++ b/services/opm/opm-version.service.js @@ -0,0 +1,69 @@ +'use strict' + +const { renderVersionBadge } = require('../version') +const { BaseService, NotFound, InvalidResponse } = require('..') + +module.exports = class OpmVersion extends BaseService { + static get category() { + return 'version' + } + + static get route() { + return { + base: 'opm/v', + pattern: ':user/:moduleName', + } + } + + static get examples() { + return [ + { + title: 'OPM', + namedParams: { + user: 'openresty', + moduleName: 'lua-resty-lrucache', + }, + staticPreview: renderVersionBadge({ version: 'v0.08' }), + }, + ] + } + + static get defaultBadgeData() { + return { + label: 'opm', + } + } + + async fetch({ user, moduleName }) { + const { res } = await this._request({ + url: `https://opm.openresty.org/api/pkg/fetch`, + options: { + method: 'HEAD', + qs: { + account: user, + name: moduleName, + }, + }, + errorMessages: { + 404: 'module not found', + }, + }) + + // XXX: intercept 302 redirects and set followRedirect to false + const location = res.request.path + if (!location) { + throw new NotFound({ prettyMessage: 'module not found' }) + } + const version = location.match(`${moduleName}-(.+).opm`)[1] + if (!version) { + throw new InvalidResponse({ prettyMessage: 'version invalid' }) + } + return version + } + + async handle({ user, moduleName }) { + const version = await this.fetch({ user, moduleName }) + + return renderVersionBadge({ version }) + } +} diff --git a/services/opm/opm-version.tester.js b/services/opm/opm-version.tester.js new file mode 100644 index 0000000000..18e9c2cef0 --- /dev/null +++ b/services/opm/opm-version.tester.js @@ -0,0 +1,23 @@ +'use strict' + +const Joi = require('@hapi/joi') +const t = (module.exports = require('../tester').createServiceTester()) + +const isValidVersion = Joi.string() + .regex(/^v[\d+.]+$/) + .required() + +t.create('version') + .get('/openresty/lua-resty-lrucache.json') + .expectBadge({ + label: 'opm', + message: isValidVersion, + }) + +t.create('unknown module') + .get('/openresty/does-not-exist.json') + .expectBadge({ label: 'opm', message: 'module not found' }) + +t.create('unknown user') + .get('/nil/does-not-exist.json') + .expectBadge({ label: 'opm', message: 'module not found' })