UNPKG

@release-notes/hub

Version:

A hub for hosting release notes.

95 lines (81 loc) 2.75 kB
const bodyParser = require('body-parser'); const expressOpenapi = require('express-openapi'); const multer = require('multer'); const ReleaseNotesLoader = require('@release-notes/node/lib/ReleaseNotesLoader'); const Service = require('kermit/Service'); const apiDocV1 = require('../api/openapi-v1'); const BEARER_AUTH_HEADER_REGEX = /^Bearer\s+[0-9a-zA-Z+=\/]+$/; class ApiService extends Service { static get BEARER_AUTH_HEADER_REGEX() { return BEARER_AUTH_HEADER_REGEX; } bind(expressApp) { const version = this.serviceConfig.get('version'); const host = this.serviceConfig.get('host'); const serviceManager = this.serviceManager; const authTokenRepository = serviceManager.get('authTokenRepository'); expressOpenapi.initialize({ app: expressApp, apiDoc: apiDocV1({ version, host }), paths: './api/v1', docsPath: '/api-spec', exposeApiDocs: true, validateApiDoc: true, dependencies: { version, serviceManager, ReleaseNotesLoader, }, consumesMiddleware: { 'application/json': bodyParser.json(), 'multipart/form-data'(req, res, next) { multer().single('file')(req, res, (err) => { if (err) return next(err); req.body.file = req.file; next(); }); } }, securityHandlers: { async Bearer(req, scopes, definition, callback) { const authHeader = req.headers.authorization; if (!ApiService.isValidBearerAuthHeader(authHeader)) { return callback({ status: 401, challenge: 'Bearer', message: { code: 'INVALID_AUTH_HEADER', message: 'Missing or invalid authorization header.', }, }); } const bearerToken = ApiService.parseBearerToken(authHeader); try { const auth = await authTokenRepository.findOneByToken(bearerToken); if (!auth) { return callback({ status: 401, challenge: 'Bearer', message: { code: 'NOT_AUTHORIZED', message: 'Error verifying access token.', }, }); } req.auth = auth; callback(null, true); } catch (err) { callback(err); } }, }, }); } static isValidBearerAuthHeader(bearerAuthHeader) { return ApiService.BEARER_AUTH_HEADER_REGEX.test(bearerAuthHeader); } static parseBearerToken(bearerAuthHeader) { return bearerAuthHeader.substr(bearerAuthHeader.lastIndexOf(' ') + 1); } } module.exports = ApiService;