UNPKG

@openveo/portal

Version:

OpenVeo Portal gives access to medias exposed by OpenVeo server associated to an OpenVeo Publish plugin

90 lines (73 loc) 3.1 kB
'use strict'; /** * @module portal/controllers/VersionController */ const semver = require('semver'); const https = require('https'); const openVeoApi = require('@openveo/api'); const packageConf = process.require('package.json'); class VersionController extends openVeoApi.controllers.Controller { /** * Defines a VersionController to deal with project version. * * @class VersionController * @extends Controller * @constructor * @see {@link https://github.com/veo-labs/openveo-api|OpenVeo API documentation} for more information about Controller */ constructor() { super(); } /** * Handles version action to get information about OpenVeo Portal version. * * It requests Github atom feed to get the latest available version of OpenVeo Portal. * Then version is compared to actual one using semver. Unstable versions (beta, alpha and release candidate are * ignored). * * @param {Request} request ExpressJS HTTP Request * @param {Response} response ExpressJS HTTP Response * @param {Function} next Function to defer execution to the next registered middleware */ getVersionAction(request, response, next) { const info = { version: packageConf.version }; https.get(`${packageConf.homepage}/tags.atom`, (result) => { let error; const statusCode = result.statusCode; const contentType = result.headers['content-type']; if (statusCode !== 200) error = new Error(`Request Failed. Status Code: ${statusCode}`); else if (!/^application\/atom\+xml/.test(contentType)) error = new Error(`Invalid content-type. Expected application/atom+xml but received ${contentType}`); if (error) { // Consume response data to free up memory process.logger.error(error.message, {error: error, method: 'versionController.getVersionAction'}); result.resume(); return response.send(info); } let rawData = ''; result.setEncoding('utf8'); result.on('data', (chunk) => { rawData += chunk; }); result.on('end', () => { // Filter feed lines to keep only lines containing an XML "id" tag with a version number containing // exclusively numbers and dots to eliminate release candidate / alpha and beta versions let ids = rawData.match(/<id>.*\/([0-9.]*)<\/id>/gi); // Latest version is the first one info.latestVersion = /<id>.*\/([^<]*)<\/id>/.exec(ids[0])[1]; info.latestVersionReleaseUrl = `${packageConf.homepage}/releases/${info.latestVersion}`; info.versionReleaseUrl = `${packageConf.homepage}/releases/${info.version}`; info.versionSourcesUrl = `${packageConf.homepage}/tree/${info.version}`; info.updateAvailable = semver.compare(info.version, info.latestVersion) === -1; response.send(info); }); }).on('error', (error) => { process.logger.error(error.message, {error: error, method: 'versionController.getVersionAction'}); response.send(info); }); } } module.exports = VersionController;