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

Commit

Permalink
Merge pull request #2 from Travelport-Ukraine/dev
Browse files Browse the repository at this point in the history
Custom status can now be passed into aws response
  • Loading branch information
dchertousov authored Jan 19, 2018
2 parents 3e5218b + 689f668 commit 1b18339
Show file tree
Hide file tree
Showing 5 changed files with 151 additions and 120 deletions.
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
6.10.0
6.10
11 changes: 6 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Include to your project as git dependency

Use default exported function in next way

```
```javascript
const R = required('aws-response');

module.exports.lambda = R((data) => {
Expand Down Expand Up @@ -40,7 +40,8 @@ Using this fields in post/get params if forbidden.
Also it's possible to pass `handler` as second param and `settings` object as first.

Default `settings` fields:
```

```javascript
const defaultSettings = {
transform: data => data, // called first
validate: data => data, // than validate and after validation handler is called
Expand All @@ -51,7 +52,7 @@ const defaultSettings = {

All responses have next shape and returned in compatible format with AWS Lambda proxy integration

```
```javascript
{
statusCode: 200 || 500,
header: { Access-Control-Allow-Origin: '*' },
Expand All @@ -61,7 +62,7 @@ All responses have next shape and returned in compatible format with AWS Lambda

### Success body

```
```javascript
{
"data": {
"ok": 1
Expand All @@ -79,7 +80,7 @@ All responses have next shape and returned in compatible format with AWS Lambda

### Error body

```
```javascript
{
"dataAvailable": false,
"errorData": null,
Expand Down
37 changes: 19 additions & 18 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,24 +58,25 @@ function R(...params) {
authorizer: event.requestContext && event.requestContext.authorizer,
}))
)
.then(response =>
Promise.resolve(usedSettings.transform(data)).then((transformed) => {
callback(null, {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': '*',
},
body: JSON.stringify({
status: 'success',
date: new Date(),
requestId: `${context.logStreamName}\\${context.awsRequestId}`,
dataAvailable: !isEmpty(response),
executionTimeInMs: calculateExecution(process.hrtime(startTime)),
originalRequest: transformed,
data: response,
}),
});
})
.then(
({ response, status = 'success' }) => usedSettings.transform(data)
.then((transformed) => {
callback(null, {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': '*',
},
body: JSON.stringify({
status,
date: new Date(),
requestId: `${context.logStreamName}\\${context.awsRequestId}`,
dataAvailable: !isEmpty(response),
executionTimeInMs: calculateExecution(process.hrtime(startTime)),
originalRequest: transformed,
data: response,
}),
});
})
)
.catch(err =>
Promise.resolve(usedSettings.transform(data)).then((transformed) => {
Expand Down
15 changes: 11 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "aws-response",
"version": "1.5.1",
"description": "Aws response handler",
"version": "1.6.0",
"description": "AWS response handler",
"main": "lib/index.js",
"scripts": {
"lint": "eslint .",
Expand All @@ -20,8 +20,15 @@
"husky": "^0.13.3",
"mocha": "^3.2.0"
},
"author": "Mark mail.ormark@gmail.com",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/Travelport-Ukraine/aws-response"
},
"contributors": [
"Mark Orel <mark.orel@travelport.ua>",
"Dmitry Chertousov <d.chertousov@travelport.ua>"
],
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
"lowercase-keys": "^1.0.0"
}
Expand Down
206 changes: 114 additions & 92 deletions test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,10 @@ describe('Test handling request', () => {
}
},(data) => {
expect(data.newField).to.be.equal(12134);
return { ok: 1 };
return { response: { ok: 1 }};
});

handler(event, { requestId: 12345 }, (err, result) => {

cb();
});
});
Expand All @@ -33,22 +32,25 @@ describe('Test handling request', () => {
throw new Error('VALIDATION');
}
},(data) => {
return { ok: 1 };
return { response: { ok: 1 } };
});

handler(event, { requestId: 12345 }, (err, result) => {
expect(result.body).to.be.a('string');
const body = JSON.parse(result.body);
expect(body.errorMessage).to.be.equal('VALIDATION');
cb();
try {
expect(result.body).to.be.a('string');
const body = JSON.parse(result.body);
expect(body.errorMessage).to.be.equal('VALIDATION');
cb();
} catch (err) {
cb(err);
}
});
});

it('should check if get params parsed correctly', (cb) => {
const event = require('./sample-requests/GET-request-aws.json');

const handler = R((data) => {
console.log(data);
expect(data).to.be.deep.equal(Object.assign(
{},
event.queryStringParameters,
Expand All @@ -58,27 +60,31 @@ describe('Test handling request', () => {
context: { logStreamName: '1', awsRequestId: '1' }
}
));
return { ok: 1 };
return { response: { ok: 1 }};
});

handler(event, {logStreamName: '1', awsRequestId: '1'}, (err, result) => {
expect(result).to.have.all.keys(['statusCode', 'body', 'headers']);
expect(result.headers).to.be.an('object');
expect(result.headers).to.have.all.keys('Access-Control-Allow-Origin');
expect(result.statusCode).to.be.equal(200);
expect(result.body).to.be.a('string');
const response = JSON.parse(result.body);
expect(response).to.be.not.null;
expect(response).to.have.all.keys(['data', 'dataAvailable', 'executionTimeInMs', 'originalRequest', 'status', 'requestId', 'date']);
expect(response.data.ok).to.be.equal(1);
expect(response.originalRequest).to.be.deep.equal(
event.queryStringParameters
);
expect(response.dataAvailable).to.be.equal(true);
expect(response.executionTimeInMs).to.be.a('number');
expect(response.status).to.be.equal('success');
expect(response.requestId).to.be.equal('1\\1');
cb();
try {
expect(result).to.have.all.keys(['statusCode', 'body', 'headers']);
expect(result.headers).to.be.an('object');
expect(result.headers).to.have.all.keys('Access-Control-Allow-Origin');
expect(result.statusCode).to.be.equal(200);
expect(result.body).to.be.a('string');
const response = JSON.parse(result.body);
expect(response).to.be.not.null;
expect(response).to.have.all.keys(['data', 'dataAvailable', 'executionTimeInMs', 'originalRequest', 'status', 'requestId', 'date']);
expect(response.data.ok).to.be.equal(1);
expect(response.originalRequest).to.be.deep.equal(
event.queryStringParameters
);
expect(response.dataAvailable).to.be.equal(true);
expect(response.executionTimeInMs).to.be.a('number');
expect(response.status).to.be.equal('success');
expect(response.requestId).to.be.equal('1\\1');
cb();
} catch (err) {
cb(err);
}
});
});

Expand All @@ -92,27 +98,31 @@ describe('Test handling request', () => {
{ headers: lowercaseKeys(event.headers) },
{ context: { logStreamName: '1', awsRequestId: '1' } }
));
return Promise.resolve({ ok: 1 });
return Promise.resolve({ response: { ok: 1 }});
});

handler(event, {logStreamName: '1', awsRequestId: '1'}, (err, result) => {
expect(result).to.have.all.keys(['statusCode', 'body', 'headers']);
expect(result.headers).to.be.an('object');
expect(result.headers).to.have.all.keys('Access-Control-Allow-Origin');
expect(result.statusCode).to.be.equal(200);
expect(result.body).to.be.a('string');
const response = JSON.parse(result.body);
expect(response).to.be.not.null;
expect(response).to.have.all.keys(['data', 'dataAvailable', 'executionTimeInMs', 'originalRequest', 'status', 'requestId', 'date']);
expect(response.data.ok).to.be.equal(1);
expect(response.originalRequest).to.be.deep.equal(
JSON.parse(event.body)
);
expect(response.dataAvailable).to.be.equal(true);
expect(response.executionTimeInMs).to.be.a('number');
expect(response.status).to.be.equal('success');
expect(response.requestId).to.be.equal('1\\1');
cb();
try {
expect(result).to.have.all.keys(['statusCode', 'body', 'headers']);
expect(result.headers).to.be.an('object');
expect(result.headers).to.have.all.keys('Access-Control-Allow-Origin');
expect(result.statusCode).to.be.equal(200);
expect(result.body).to.be.a('string');
const response = JSON.parse(result.body);
expect(response).to.be.not.null;
expect(response).to.have.all.keys(['data', 'dataAvailable', 'executionTimeInMs', 'originalRequest', 'status', 'requestId', 'date']);
expect(response.data.ok).to.be.equal(1);
expect(response.originalRequest).to.be.deep.equal(
JSON.parse(event.body)
);
expect(response.dataAvailable).to.be.equal(true);
expect(response.executionTimeInMs).to.be.a('number');
expect(response.status).to.be.equal('success');
expect(response.requestId).to.be.equal('1\\1');
cb();
} catch (err) {
cb(err);
}
});
});

Expand All @@ -124,22 +134,26 @@ describe('Test handling request', () => {
});

handler(event, {logStreamName: '1', awsRequestId: '1'}, (err, result) => {
expect(result).to.have.all.keys(['statusCode', 'body', 'headers']);
expect(result.headers).to.be.an('object');
expect(result.headers).to.have.all.keys('Access-Control-Allow-Origin');
expect(result.statusCode).to.be.equal(500);
expect(result.body).to.be.a('string');
const response = JSON.parse(result.body);
expect(response).to.be.not.null;
expect(response).to.have.all.keys(['errorData', 'errorMessage','errorName', 'dataAvailable', 'executionTimeInMs', 'originalRequest', 'status', 'requestId', 'date']);
expect(response.originalRequest).to.be.deep.equal(
JSON.parse(event.body)
);
expect(response.dataAvailable).to.be.equal(false);
expect(response.executionTimeInMs).to.be.a('number');
expect(response.status).to.be.equal('error');
expect(response.requestId).to.be.equal('1\\1');
cb();
try {
expect(result).to.have.all.keys(['statusCode', 'body', 'headers']);
expect(result.headers).to.be.an('object');
expect(result.headers).to.have.all.keys('Access-Control-Allow-Origin');
expect(result.statusCode).to.be.equal(500);
expect(result.body).to.be.a('string');
const response = JSON.parse(result.body);
expect(response).to.be.not.null;
expect(response).to.have.all.keys(['errorData', 'errorMessage','errorName', 'dataAvailable', 'executionTimeInMs', 'originalRequest', 'status', 'requestId', 'date']);
expect(response.originalRequest).to.be.deep.equal(
JSON.parse(event.body)
);
expect(response.dataAvailable).to.be.equal(false);
expect(response.executionTimeInMs).to.be.a('number');
expect(response.status).to.be.equal('error');
expect(response.requestId).to.be.equal('1\\1');
cb();
} catch (err) {
cb(err);
}
});
});

Expand All @@ -151,22 +165,26 @@ describe('Test handling request', () => {
});

handler(event, {logStreamName: '1', awsRequestId: '1'}, (err, result) => {
expect(result).to.have.all.keys(['statusCode', 'body', 'headers']);
expect(result.headers).to.be.an('object');
expect(result.headers).to.have.all.keys('Access-Control-Allow-Origin');
expect(result.statusCode).to.be.equal(500);
expect(result.body).to.be.a('string');
const response = JSON.parse(result.body);
expect(response).to.be.not.null;
expect(response).to.have.all.keys(['errorData', 'errorMessage','errorName', 'dataAvailable', 'executionTimeInMs', 'originalRequest', 'status', 'requestId', 'date']);
expect(response.originalRequest).to.be.deep.equal(
JSON.parse(event.body)
);
expect(response.dataAvailable).to.be.equal(false);
expect(response.executionTimeInMs).to.be.a('number');
expect(response.status).to.be.equal('error');
expect(response.requestId).to.be.equal('1\\1');
cb();
try {
expect(result).to.have.all.keys(['statusCode', 'body', 'headers']);
expect(result.headers).to.be.an('object');
expect(result.headers).to.have.all.keys('Access-Control-Allow-Origin');
expect(result.statusCode).to.be.equal(500);
expect(result.body).to.be.a('string');
const response = JSON.parse(result.body);
expect(response).to.be.not.null;
expect(response).to.have.all.keys(['errorData', 'errorMessage','errorName', 'dataAvailable', 'executionTimeInMs', 'originalRequest', 'status', 'requestId', 'date']);
expect(response.originalRequest).to.be.deep.equal(
JSON.parse(event.body)
);
expect(response.dataAvailable).to.be.equal(false);
expect(response.executionTimeInMs).to.be.a('number');
expect(response.status).to.be.equal('error');
expect(response.requestId).to.be.equal('1\\1');
cb();
} catch (err) {
cb(err);
}
});
});

Expand All @@ -179,22 +197,26 @@ describe('Test handling request', () => {
});

handler(event, {logStreamName: '1', awsRequestId: '1'}, (err, result) => {
expect(result).to.have.all.keys(['statusCode', 'body', 'headers']);
expect(result.headers).to.be.an('object');
expect(result.headers).to.have.all.keys('Access-Control-Allow-Origin');
expect(result.statusCode).to.be.equal(500);
expect(result.body).to.be.a('string');
const response = JSON.parse(result.body);
expect(response).to.be.not.null;
expect(response).to.have.all.keys(['errorData', 'errorMessage','errorName', 'dataAvailable', 'executionTimeInMs', 'originalRequest', 'status', 'requestId', 'date']);
expect(response.originalRequest).to.be.deep.equal(
JSON.parse(event.body)
);
expect(response.dataAvailable).to.be.equal(false);
expect(response.executionTimeInMs).to.be.a('number');
expect(response.status).to.be.equal('error');
expect(response.requestId).to.be.equal('1\\1');
cb();
try {
expect(result).to.have.all.keys(['statusCode', 'body', 'headers']);
expect(result.headers).to.be.an('object');
expect(result.headers).to.have.all.keys('Access-Control-Allow-Origin');
expect(result.statusCode).to.be.equal(500);
expect(result.body).to.be.a('string');
const response = JSON.parse(result.body);
expect(response).to.be.not.null;
expect(response).to.have.all.keys(['errorData', 'errorMessage','errorName', 'dataAvailable', 'executionTimeInMs', 'originalRequest', 'status', 'requestId', 'date']);
expect(response.originalRequest).to.be.deep.equal(
JSON.parse(event.body)
);
expect(response.dataAvailable).to.be.equal(false);
expect(response.executionTimeInMs).to.be.a('number');
expect(response.status).to.be.equal('error');
expect(response.requestId).to.be.equal('1\\1');
cb();
} catch (err) {
cb(err);
}
});
});
});

0 comments on commit 1b18339

Please sign in to comment.