From 9ea04612098e29cb8482cc61670b662ac090d6ec Mon Sep 17 00:00:00 2001 From: Valentin Laurin Date: Sun, 26 Apr 2020 17:45:42 +0100 Subject: [PATCH 1/2] Add module `express` --- README.md | 5 +++++ main.js | 1 + modules/express.js | 0 modules/express.test.js | 0 4 files changed, 6 insertions(+) create mode 100644 modules/express.js create mode 100644 modules/express.test.js diff --git a/README.md b/README.md index 43bc34a..658d5a3 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ npm i @quickcase/node-toolkit * [Case Access](#case-access) * [Definition](#definition) * [Document](#document) +* [Express](#express) * [Field](#field) * [HTTP Client](#http-client) * [OAuth2](#oauth2) @@ -442,6 +443,10 @@ docDownload: */ ``` +### Express + +Utilities for [ExpressJS](https://expressjs.com/) v4.x.x. + ### Field #### isNo(value) diff --git a/main.js b/main.js index c18d8c5..e4be097 100644 --- a/main.js +++ b/main.js @@ -3,6 +3,7 @@ export * from './modules/case'; export * from './modules/case-access'; export * from './modules/definition'; export * from './modules/document'; +export * from './modules/express'; export * from './modules/field'; export * from './modules/http-client'; export * from './modules/oauth2'; diff --git a/modules/express.js b/modules/express.js new file mode 100644 index 0000000..e69de29 diff --git a/modules/express.test.js b/modules/express.test.js new file mode 100644 index 0000000..e69de29 From 6a80bd21684059385bc2b4a83d5317e9836385b6 Mon Sep 17 00:00:00 2001 From: Valentin Laurin Date: Sun, 26 Apr 2020 22:11:31 +0100 Subject: [PATCH 2/2] Express: Add middlewareFactory(deps)(middleware) Fixes #49 --- README.md | 35 +++++++++++++++++++++++++++++++++++ modules/express.js | 19 +++++++++++++++++++ modules/express.test.js | 23 +++++++++++++++++++++++ 3 files changed, 77 insertions(+) diff --git a/README.md b/README.md index 658d5a3..f39bdb1 100644 --- a/README.md +++ b/README.md @@ -447,6 +447,41 @@ docDownload: Utilities for [ExpressJS](https://expressjs.com/) v4.x.x. +#### middlewareFactory(dependencySuppliers)(middlewareSupplier)(req, res, next) + +Decorator for an Express middleware which dynamically instantiates request-based dependencies and underlying middleware upon processing of a request. + +##### Arguments + +| Name | Type | Description | +|------|------|-------------| +| dependencySuppliers | object | Required. Map of named dependency supplier functions which take the request object as an input | +| middlewareSupplier | function | Function that will be passed the initialised dependencies and return an initialised Express middleware. | + +##### Returns + +ExpressJS middleware function. + +##### Example + +```js +import {middlewareFactory} from '@quickcase/node-toolkit'; +import express from 'express'; + +const router = express.Router(); + +const dependencySuppliers = { + tokenProvider: (req) => () => Promise.resolve(req.accessToken), + service: (req) => {...}, +}; + +const middlewareSupplier = ({tokenProvider, service}) => (req, res) => { + // use initialised `tokenProvider` and `service`... +}; + +router.get('/', middlewareFactory(dependencySuppliers)(middlewareSupplier)); +``` + ### Field #### isNo(value) diff --git a/modules/express.js b/modules/express.js index e69de29..dafad7f 100644 --- a/modules/express.js +++ b/modules/express.js @@ -0,0 +1,19 @@ +/** + * Decorator for an Express middleware which dynamically instantiates request-based + * dependencies and underlying middleware upon processing of a request. + * @param {object} dependencySuppliers Dictionary of named dependency suppliers. + * Each supplier will be invoked with the instance of the current Express request. + * Each dependency supplied will be provided to the middleware under the same name. + * @param {function} middlewareSupplier Function that will be passed + * the initialised dependencies and return an initialised Express middleware. + * @return {ExpressMiddleware} Express middleware function which will invoke the + * initialised middleware when called. + */ +export const middlewareFactory = (dependencySuppliers) => (middlewareSupplier) => (req, res, next) => { + const dependencies = Object.entries(dependencySuppliers) + .reduce((acc, [key, factory]) => { + acc[key] = factory(req); + return acc; + }, {}); + middlewareSupplier(dependencies)(req, res, next); +}; diff --git a/modules/express.test.js b/modules/express.test.js index e69de29..2b7c181 100644 --- a/modules/express.test.js +++ b/modules/express.test.js @@ -0,0 +1,23 @@ +import {middlewareFactory} from './express'; + +describe('middlewareFactory', () => { + const ACCESS_TOKEN = 'ey123'; + const ROLES = ['role1', 'role2']; + + test('should create middleware with initialised dependencies', (done) => { + const middleware = ({tokenSupplier, roles}) => (req, res, next) => { + expect(tokenSupplier()).toEqual(ACCESS_TOKEN); + expect(roles).toEqual(ROLES); + done(); + }; + const req = { + accessToken: ACCESS_TOKEN, + roles: ROLES, + }; + + middlewareFactory({ + tokenSupplier: (req) => () => req.accessToken, + roles: (req) => req.roles, + })(middleware)(req); + }); +});