Skip to content
This repository was archived by the owner on Nov 27, 2019. It is now read-only.

Commit 83029ff

Browse files
committed
Added possibility to pass options such as validate function and transform function
1 parent d8b9468 commit 83029ff

File tree

3 files changed

+79
-10
lines changed

3 files changed

+79
-10
lines changed

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,15 @@ module.exports.lambda = R((data) => {
3030
});
3131
```
3232

33+
Also it's possible to pass `handler` as second param and `settings` object as first.
34+
35+
Default `settings` fields:
36+
```
37+
const defaultSettings = {
38+
transform: data => data, // called first
39+
validate: data => data, // than validate and after validation handler is called
40+
}
41+
```
3342

3443
## Responses
3544

lib/index.js

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,44 @@ const isEmpty = v => v === null || v === undefined;
1616
/**
1717
* Wrapper for function that handled aws event, context, callback
1818
* and returns unified response for errors and success statuses
19+
* @param {object} settings - Optional settings for function
1920
* @param {handlerFunction} handler - Handles the response
2021
*/
21-
function R(handler) {
22+
function R(...params) {
23+
const defaultSettings = {
24+
validate: data => Promise.resolve(data),
25+
transform: data => Promise.resolve(data),
26+
};
27+
28+
let settings;
29+
let handler;
30+
31+
if (params.length === 2) {
32+
[settings, handler] = params;
33+
}
34+
35+
if (params.length === 1) {
36+
[handler] = params;
37+
settings = {};
38+
}
39+
40+
const usedSettings = Object.assign({}, defaultSettings, settings);
41+
2242
return (event, context, callback) => {
2343
const startTime = process.hrtime();
2444
const data = event && event.body
2545
? JSON.parse(event.body)
2646
: event.queryStringParameters || {};
2747

2848
// calling handler for function
29-
let result;
30-
try {
31-
result = handler(data);
32-
} catch (e) {
33-
result = Promise.reject(e);
34-
}
49+
let transformed;
3550

36-
Promise.resolve(result)
51+
Promise.resolve(usedSettings.transform(data))
52+
.then(usedSettings.validate)
53+
.then((transformedData) => {
54+
transformed = transformedData;
55+
return handler(transformedData);
56+
})
3757
.then((response) => {
3858
callback(null, {
3959
statusCode: 200,
@@ -45,7 +65,7 @@ function R(handler) {
4565
requestId: context.requestId,
4666
dataAvailable: !isEmpty(response),
4767
executionTimeInMs: calculateExecution(process.hrtime(startTime)),
48-
originalRequest: data,
68+
originalRequest: transformed,
4969
data: response,
5070
}),
5171
});
@@ -61,7 +81,7 @@ function R(handler) {
6181
requestId: context.requestId,
6282
dataAvailable: false,
6383
executionTimeInMs: calculateExecution(process.hrtime(startTime)),
64-
originalRequest: data,
84+
originalRequest: transformed,
6585
errorMessage: err.message || 'Unknown error. No error message',
6686
errorName: err.name || 'UnknownError',
6787
errorData: err.data ? err.data : null,

test/index.test.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,46 @@ const { expect } = require('chai');
22
const R = require('../lib/index');
33

44
describe('Test handling request', () => {
5+
it('should check if transform works correctly', (cb) => {
6+
const event = require('./sample-requests/GET-request-aws.json');
7+
8+
const handler = R({
9+
transform: (data) => {
10+
expect(data).to.be.deep.equal(event.queryStringParameters);
11+
return Object.assign({}, data, { newField: 12134 });
12+
}
13+
},(data) => {
14+
expect(data.newField).to.be.equal(12134);
15+
return { ok: 1 };
16+
});
17+
18+
handler(event, { requestId: 12345 }, (err, result) => {
19+
20+
cb();
21+
});
22+
});
23+
24+
25+
it('should check if validation works correctly', (cb) => {
26+
const event = require('./sample-requests/GET-request-aws.json');
27+
28+
const handler = R({
29+
validate: (data) => {
30+
expect(data).to.be.deep.equal(event.queryStringParameters);
31+
throw new Error('VALIDATION');
32+
}
33+
},(data) => {
34+
return { ok: 1 };
35+
});
36+
37+
handler(event, { requestId: 12345 }, (err, result) => {
38+
expect(result.body).to.be.a('string');
39+
const body = JSON.parse(result.body);
40+
expect(body.errorMessage).to.be.equal('VALIDATION');
41+
cb();
42+
});
43+
});
44+
545
it('should check if get params parsed correctly', (cb) => {
646
const event = require('./sample-requests/GET-request-aws.json');
747

0 commit comments

Comments
 (0)