Skip to content

Commit 15846ad

Browse files
authored
Merge pull request mapado#77 from mapado/sg-setHeaders
Sg set headers
2 parents 0795c70 + 820afdb commit 15846ad

File tree

2 files changed

+131
-25
lines changed

2 files changed

+131
-25
lines changed

__tests__/client/AbstractClient.test.js

+97
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,103 @@ describe('Fix bugs', () => {
493493
});
494494
});
495495

496+
test('allow passing request params in find', () => {
497+
fetchMock.mock(() => true, {
498+
'@id': '/v2/test/8',
499+
foo: 'bar',
500+
});
501+
502+
return SomeSdk.getRepository('test')
503+
.find('/v2/test/8', {}, {}, { headers: { foo: 'bar' } })
504+
.then(() => {
505+
expect(fetchMock.lastOptions().headers.foo).toEqual('bar');
506+
});
507+
});
508+
509+
test('allow passing request params in findBy', () => {
510+
fetchMock.mock(() => true, [
511+
{
512+
'@id': '/v2/test/8',
513+
foo: 'bar',
514+
},
515+
]);
516+
517+
return SomeSdk.getRepository('test')
518+
.findBy({ id: '/v2/test/8' }, {}, { headers: { foo: 'bar' } })
519+
.then(() => {
520+
expect(fetchMock.lastOptions().headers.foo).toEqual('bar');
521+
});
522+
});
523+
524+
test('allow passing request params in findAll', () => {
525+
fetchMock.mock(() => true, [
526+
{
527+
'@id': '/v2/test/8',
528+
foo: 'bar',
529+
},
530+
]);
531+
532+
return SomeSdk.getRepository('test')
533+
.findAll({ id: '/v2/test/8' }, {}, { headers: { foo: 'bar' } })
534+
.then(() => {
535+
expect(fetchMock.lastOptions().headers.foo).toEqual('bar');
536+
});
537+
});
538+
539+
test('allow passing request params in create', () => {
540+
const test = {
541+
'@id': '/v2/tests/1',
542+
};
543+
544+
fetchMock.mock(() => true, {});
545+
546+
return SomeSdk.getRepository('test')
547+
.create(test, {}, {}, { headers: { foo: 'bar' } })
548+
.then(() => {
549+
expect(fetchMock.lastOptions().headers.foo).toEqual('bar');
550+
});
551+
});
552+
553+
test('allow passing request params in update', () => {
554+
const test = {
555+
'@id': '/v2/tests/1',
556+
};
557+
558+
fetchMock.mock(() => true, {});
559+
560+
return SomeSdk.getRepository('test')
561+
.update(test, {}, { headers: { foo: 'bar' } })
562+
.then(() => {
563+
expect(fetchMock.lastOptions().headers.foo).toEqual('bar');
564+
});
565+
});
566+
567+
test('allow passing request params in delete', () => {
568+
fetchMock.mock(() => true, {});
569+
const test = {
570+
'@id': '/v2/tests/1',
571+
};
572+
573+
return SomeSdk.getRepository('test')
574+
.delete(test, { headers: { foo: 'bar' } })
575+
.then(() => {
576+
expect(fetchMock.lastOptions().headers.foo).toEqual('bar');
577+
});
578+
});
579+
580+
test('allow overriding request params', () => {
581+
fetchMock.mock(() => true, {
582+
'@id': '/v2/test/8',
583+
foo: 'bar',
584+
});
585+
586+
return SomeSdk.getRepository('test')
587+
.find('/v2/test/8', {}, {}, { method: 'POST' })
588+
.then(() => {
589+
expect(fetchMock.lastOptions().method).toEqual('POST');
590+
});
591+
});
592+
496593
test('check that the request done after refreshing a token contains the refreshed token', () => {
497594
fetchMock
498595
.mock({

src/client/AbstractClient.js

+34-25
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,29 @@ class AbstractClient {
3434
return `${pathBase}/${idValue}`;
3535
}
3636

37-
find(id, queryParam = {}, pathParameters = {}) {
37+
find(id, queryParam = {}, pathParameters = {}, requestParams = {}) {
3838
const url = this._generateUrlFromParams(queryParam, pathParameters, id);
3939

40-
return this.deserializeResponse(this.authorizedFetch(url), 'item');
40+
return this.deserializeResponse(
41+
this.authorizedFetch(url, requestParams),
42+
'item'
43+
);
4144
}
4245

43-
findBy(queryParam, pathParameters = {}) {
46+
findBy(queryParam, pathParameters = {}, requestParams = {}) {
4447
const url = this._generateUrlFromParams(queryParam, pathParameters);
4548

46-
return this.deserializeResponse(this.authorizedFetch(url), 'list');
49+
return this.deserializeResponse(
50+
this.authorizedFetch(url, requestParams),
51+
'list'
52+
);
4753
}
4854

49-
findAll(queryParam = {}, pathParameters = {}) {
50-
return this.findBy(queryParam, pathParameters);
55+
findAll(queryParam = {}, pathParameters = {}, requestParams = {}) {
56+
return this.findBy(queryParam, pathParameters, requestParams);
5157
}
5258

53-
create(entity, queryParam = {}, pathParameters = {}) {
59+
create(entity, queryParam = {}, pathParameters = {}, requestParams = {}) {
5460
const url = new URI(this.getPathBase(pathParameters));
5561
url.addSearch(queryParam);
5662

@@ -70,12 +76,13 @@ class AbstractClient {
7076
this.authorizedFetch(url, {
7177
method: 'POST',
7278
body: this.serializer.encodeItem(diff, this.metadata),
79+
...requestParams,
7380
}),
7481
'item'
7582
);
7683
}
7784

78-
update(entity, queryParam = {}) {
85+
update(entity, queryParam = {}, requestParams = {}) {
7986
const url = new URI(this.getEntityURI(entity));
8087
url.addSearch(queryParam);
8188

@@ -99,17 +106,19 @@ class AbstractClient {
99106
this.authorizedFetch(url, {
100107
method: 'PUT',
101108
body: this.serializer.encodeItem(newSerializedModel, this.metadata),
109+
...requestParams,
102110
}),
103111
'item'
104112
);
105113
}
106114

107-
delete(entity) {
115+
delete(entity, requestParams = {}) {
108116
const url = this.getEntityURI(entity);
109117
const identifier = this._getEntityIdentifier(entity);
110118

111119
return this.authorizedFetch(url, {
112120
method: 'DELETE',
121+
...requestParams,
113122
}).then(response => {
114123
this.sdk.unitOfWork.clear(identifier);
115124

@@ -186,10 +195,10 @@ class AbstractClient {
186195
return url;
187196
}
188197

189-
authorizedFetch(input, init) {
198+
authorizedFetch(input, requestParams = {}) {
190199
const url = this.makeUri(input);
191200

192-
return this._fetchWithToken(url.toString(), init);
201+
return this._fetchWithToken(url.toString(), requestParams);
193202
}
194203

195204
_generateUrlFromParams(queryParam, pathParameters = {}, id = null) {
@@ -222,7 +231,7 @@ class AbstractClient {
222231
return url;
223232
}
224233

225-
_fetchWithToken(input, init) {
234+
_fetchWithToken(input, requestParams = {}) {
226235
if (!input) {
227236
throw new Error('input is empty');
228237
}
@@ -244,24 +253,24 @@ class AbstractClient {
244253

245254
return accessToken;
246255
})
247-
.then(token => this._doFetch(token, input, init));
256+
.then(token => this._doFetch(token, input, requestParams));
248257
}
249258

250-
return this._doFetch(null, input, init);
259+
return this._doFetch(null, input, requestParams);
251260
}
252261

253-
_refreshTokenAndRefetch(response, input, init) {
262+
_refreshTokenAndRefetch(response, input, requestParams = {}) {
254263
return this._tokenStorage.refreshToken().then(() => {
255-
const params = Object.assign({}, init, {
256-
headers: Object.assign({}, init.headers),
264+
const updatedRequestParams = Object.assign({}, requestParams, {
265+
headers: Object.assign({}, requestParams.headers),
257266
});
258-
delete params.headers.Authorization;
267+
delete updatedRequestParams.headers.Authorization;
259268

260-
return this._fetchWithToken(input, params);
269+
return this._fetchWithToken(input, updatedRequestParams);
261270
});
262271
}
263272

264-
_manageUnauthorized(response, input, init) {
273+
_manageUnauthorized(response, input, requestParams = {}) {
265274
const error = getHttpErrorFromResponse(response);
266275

267276
// https://tools.ietf.org/html/rfc2617#section-1.2
@@ -271,7 +280,7 @@ class AbstractClient {
271280
'error = "invalid_grant"'
272281
);
273282
if (invalidGrant && this._tokenStorage) {
274-
return this._refreshTokenAndRefetch(response, input, init);
283+
return this._refreshTokenAndRefetch(response, input, requestParams);
275284
}
276285

277286
throw error;
@@ -281,11 +290,11 @@ class AbstractClient {
281290
.json()
282291
.then(body => {
283292
if (this._tokenStorage && body.error === 'invalid_grant') {
284-
return this._refreshTokenAndRefetch(response, input, init);
293+
return this._refreshTokenAndRefetch(response, input, requestParams);
285294
}
286295
throw error;
287296
})
288-
.catch((err) => {
297+
.catch(err => {
289298
if (err instanceof OauthError) {
290299
throw err;
291300
}
@@ -294,8 +303,8 @@ class AbstractClient {
294303
}
295304
}
296305

297-
_doFetch(accessToken, input, init) {
298-
let params = init;
306+
_doFetch(accessToken, input, requestParams) {
307+
let params = requestParams;
299308

300309
const baseHeaders = {
301310
'Content-Type': 'application/json',

0 commit comments

Comments
 (0)