Skip to content

Commit 0c73fcd

Browse files
author
Kevin Coenegrachts
committedAug 15, 2019
Do not allow for middleware to be inserted twice + made it easier to setup a bearer token and apply it in a header
1 parent c63d20d commit 0c73fcd

File tree

6 files changed

+119
-1
lines changed

6 files changed

+119
-1
lines changed
 

‎.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
/node_modules
33
coverage
44
.idea
5-
lib/
5+
lib/
6+
.vscode

‎README.md

+3
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ Devour takes an object as the initializer. The following options are available:
9191

9292
**auth**: An object with username and password, used to pass in HTTP Basic Authentication Headers, `new JsonApi({apiUrl: 'http://your-api-here.com', auth: {username: 'secret', password: 'cheesecake'})`
9393

94+
**bearer**: A string containing the bearer token, used to add a HTTP Authorization Header `new JsonApi({apiUrl: 'http://your-api-here.com', bearer: 'your-token-here'})
95+
9496
**trailingSlash**: An optional object to use trailing slashes on resource and/or collection urls (defaults to false), `new JsonApi({apiUrl: 'http://your-api-here.com', trailingSlash: {resource: false, collection: true})`
9597

9698
### Relationships
@@ -155,6 +157,7 @@ let errorMiddleware = {
155157
jsonApi.insertMiddlewareBefore('axios-request', requestMiddleware)
156158
jsonApi.insertMiddlewareAfter('response', responseMiddleware)
157159
jsonApi.replaceMiddleware('errors', errorMiddleware)
160+
jsonApi.removeMiddleware('response')
158161
```
159162

160163
#### The payload object

‎package.json

+2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
"main": "lib/",
66
"scripts": {
77
"prepublish": "npm run compile",
8+
"prepublish-windows": "npm run compile:windows",
89
"publish": "git push origin && git push origin --tags",
910
"release:patch": "npm version patch && npm publish",
1011
"release:minor": "npm version minor && npm publish",
1112
"release:major": "npm version major && npm publish",
1213
"compile": "rm -rf lib/ && babel -d lib/ src/",
14+
"compile:windows": "rd /s /q \"lib/\" && babel -d lib/ src/",
1315
"watch": "babel --watch -d lib/ src/",
1416
"autofix": "standard --fix",
1517
"test": "standard && mocha"

‎src/index.js

+28
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const jsonApiDeleteMiddleware = require('./middleware/json-api/req-delete')
3636
const jsonApiGetMiddleware = require('./middleware/json-api/req-get')
3737
const jsonApiHeadersMiddleware = require('./middleware/json-api/req-headers')
3838
const railsParamsSerializer = require('./middleware/json-api/rails-params-serializer')
39+
const bearerTokenMiddleware = require('./middleware/json-api/req-bearer')
3940
const sendRequestMiddleware = require('./middleware/request')
4041
const deserializeResponseMiddleware = require('./middleware/json-api/res-deserialize')
4142
const errorsMiddleware = require('./middleware/json-api/res-errors')
@@ -56,6 +57,7 @@ class JsonApi {
5657
jsonApiDeleteMiddleware,
5758
jsonApiGetMiddleware,
5859
jsonApiHeadersMiddleware,
60+
bearerTokenMiddleware,
5961
railsParamsSerializer,
6062
sendRequestMiddleware,
6163
processErrors,
@@ -66,6 +68,7 @@ class JsonApi {
6668
logger: true,
6769
resetBuilderOnCall: true,
6870
auth: {},
71+
bearer: null,
6972
trailingSlash: {collection: false, resource: false}
7073
}
7174

@@ -89,6 +92,7 @@ class JsonApi {
8992
this.axios = axios
9093
this.auth = options.auth
9194
this.apiUrl = options.apiUrl
95+
this.bearer = options.bearer
9296
this.models = {}
9397
this.deserialize = deserialize
9498
this.serialize = serialize
@@ -259,6 +263,11 @@ class JsonApi {
259263
}
260264

261265
insertMiddleware (middlewareName, direction, newMiddleware) {
266+
if (this.middlewareExists(newMiddleware.name)) {
267+
Logger.error('The middleware ' + newMiddleware.name + ' already exists')
268+
return
269+
}
270+
262271
let middleware = this.middleware.filter(middleware => (middleware.name === middlewareName))
263272
if (middleware.length > 0) {
264273
let index = this.middleware.indexOf(middleware[0])
@@ -270,10 +279,29 @@ class JsonApi {
270279
}
271280

272281
replaceMiddleware (middlewareName, newMiddleware) {
282+
if (!this.middlewareExists(newMiddleware.name)) {
283+
Logger.error('The middleware ' + newMiddleware.name + ' does not exists')
284+
return
285+
}
286+
273287
let index = _findIndex(this.middleware, ['name', middlewareName])
274288
this.middleware[index] = newMiddleware
275289
}
276290

291+
removeMiddleware (middlewareName) {
292+
if (!this.middlewareExists(middlewareName)) {
293+
Logger.error('The middleware ' + middlewareName + ' does not exists')
294+
return
295+
}
296+
297+
let index = _findIndex(this.middleware, ['name', middlewareName])
298+
this.middleware.splice(index, 1)
299+
}
300+
301+
middlewareExists (middlewareName) {
302+
return this.middleware.some(middleware => (middleware.name === middlewareName))
303+
}
304+
277305
define (modelName, attributes, options = {}) {
278306
this.models[modelName] = {
279307
attributes: attributes,

‎src/middleware/json-api/req-bearer.js

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const _isNil = require('lodash/isNil')
2+
const _assign = require('lodash/assign')
3+
4+
module.exports = {
5+
name: 'add-bearer-token',
6+
req: payload => {
7+
if (!_isNil(payload.jsonApi.bearer)) {
8+
payload.req.headers = _assign({}, payload.req.headers, {'Authorization': 'Bearer ' + payload.jsonApi.bearer})
9+
}
10+
return payload
11+
}
12+
}

‎test/api/api-test.js

+72
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,42 @@ describe('JsonApi', () => {
102102
jsonApi.one('foo', 1).get().then(() => done())
103103
})
104104

105+
it('should allow users to add Authorization header (bearer token)', (done) => {
106+
jsonApi = new JsonApi({apiUrl: 'http://myapi.com', bearer: 'abc'})
107+
jsonApi.define('foo', {title: ''})
108+
109+
let inspectorMiddleware = {
110+
name: 'inspector-middleware',
111+
req: (payload) => {
112+
expect(payload.req.headers.Authorization).to.be.eql('Bearer abc')
113+
return {}
114+
}
115+
}
116+
const bearerTokenMiddleware = require('./../../src/middleware/json-api/req-bearer')
117+
118+
jsonApi.middleware = [bearerTokenMiddleware, inspectorMiddleware]
119+
120+
jsonApi.one('foo', 1).get().then(() => done())
121+
})
122+
123+
it('should not add HTPP Authorization header if not set', (done) => {
124+
jsonApi = new JsonApi({apiUrl: 'http://myapi.com'})
125+
jsonApi.define('foo', {title: ''})
126+
127+
let inspectorMiddleware = {
128+
name: 'inspector-middleware',
129+
req: (payload) => {
130+
expect(payload.req.headers).to.be.eql(undefined)
131+
return {}
132+
}
133+
}
134+
const bearerTokenMiddleware = require('./../../src/middleware/json-api/req-bearer')
135+
136+
jsonApi.middleware = [bearerTokenMiddleware, inspectorMiddleware]
137+
138+
jsonApi.one('foo', 1).get().then(() => done())
139+
})
140+
105141
describe('Pluralize options', () => {
106142
context('no options passed -- default behavior', () => {
107143
it('should use the pluralize package', () => {
@@ -382,6 +418,42 @@ describe('JsonApi', () => {
382418
expect(jsonApi.middleware.indexOf(beforeMiddleware)).to.eql(index)
383419
expect(jsonApi.middleware.indexOf(afterMiddleware)).to.eql(index + 2)
384420
})
421+
422+
it('should not allow users to register the same middleware twice', () => {
423+
let responseMiddleware = jsonApi.middleware.filter(middleware => middleware.name === 'response')[0]
424+
let catMiddleWare = {
425+
name: 'cat-middleware',
426+
req: function (req) {
427+
return req
428+
},
429+
res: function (res) {
430+
return res
431+
}
432+
}
433+
let index = jsonApi.middleware.indexOf(responseMiddleware)
434+
jsonApi.insertMiddlewareBefore('response', catMiddleWare)
435+
expect(jsonApi.middleware.indexOf(catMiddleWare)).to.eql(index)
436+
jsonApi.insertMiddlewareAfter('response', catMiddleWare)
437+
expect(jsonApi.middleware.indexOf(catMiddleWare)).to.not.eql(index + 2)
438+
expect(jsonApi.middleware.indexOf(catMiddleWare)).to.eql(index)
439+
})
440+
441+
it('should allow users to remove existing middleware', () => {
442+
let catMiddleWare = {
443+
name: 'cat-middleware',
444+
req: function (req) {
445+
return req
446+
},
447+
res: function (res) {
448+
return res
449+
}
450+
}
451+
jsonApi.insertMiddlewareBefore('response', catMiddleWare)
452+
const middlewareLength = jsonApi.middleware.length
453+
jsonApi.removeMiddleware('cat-middleware')
454+
expect(jsonApi.middleware.length).to.eql(middlewareLength - 1)
455+
expect(jsonApi.middleware.findIndex(middleware => middleware.name === 'cat-middleware')).to.eql(-1)
456+
})
385457
})
386458

387459
describe('Models and serializers', () => {

0 commit comments

Comments
 (0)
Please sign in to comment.