Skip to content

Commit 221d0d8

Browse files
committed
update api wrapper responses
1 parent e169f6c commit 221d0d8

File tree

6 files changed

+50
-37
lines changed

6 files changed

+50
-37
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@manwaring/lambda-wrapper",
33
"description": "A lambda handler wrapper to abstract common functionality and provide useful defaults",
4-
"version": "1.0.5",
4+
"version": "1.0.6",
55
"scripts": {
66
"publish-please-dry-run": "publish-please --dry-run",
77
"publish-please": "publish-please",

src/api/responses.test.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
import { Responses } from './responses';
1+
import { successWrapper, errorWrapper, invalidWrapper, redirectWrapper } from './responses';
22
import { Metrics } from '../common';
33

44
describe('API responses', () => {
55
const metrics = new Metrics('API Gateway');
66
const callback = jest.fn((err, result) => (err ? new Error(err) : result));
7-
const responses = new Responses(metrics, callback);
87

98
beforeEach(() => jest.resetAllMocks());
109

1110
it('Handles success response', () => {
12-
responses.success('success');
11+
const success = successWrapper(metrics, callback);
12+
success('success');
1313
expect(callback).toHaveBeenCalledWith(null, {
1414
body: JSON.stringify('success'),
1515
headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': true },
@@ -18,20 +18,23 @@ describe('API responses', () => {
1818
});
1919

2020
it('Handles success response without payload', () => {
21-
responses.success();
21+
const success = successWrapper(metrics, callback);
22+
success();
2223
expect(callback).toHaveBeenCalledWith(null, {
2324
headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': true },
2425
statusCode: 200
2526
});
2627
});
2728

2829
it('Handles error response', () => {
29-
responses.error('error');
30+
const error = errorWrapper(metrics, callback);
31+
error('error');
3032
expect(callback).toHaveBeenCalledWith(new Error('error'));
3133
});
3234

3335
it('Handles invalid response', () => {
34-
responses.invalid(['invalid']);
36+
const invalid = invalidWrapper(metrics, callback);
37+
invalid(['invalid']);
3538
expect(callback).toHaveBeenCalledWith(null, {
3639
body: JSON.stringify({ errors: ['invalid'] }),
3740
headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': true },
@@ -40,15 +43,17 @@ describe('API responses', () => {
4043
});
4144

4245
it('Handles invalid response without validation errors', () => {
43-
responses.invalid();
46+
const invalid = invalidWrapper(metrics, callback);
47+
invalid();
4448
expect(callback).toHaveBeenCalledWith(null, {
4549
headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': true },
4650
statusCode: 400
4751
});
4852
});
4953

5054
it('Handles redirect response', () => {
51-
responses.redirect('url');
55+
const redirect = redirectWrapper(metrics, callback);
56+
redirect('url');
5257
expect(callback).toHaveBeenCalledWith(null, {
5358
headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': true, Location: 'url' },
5459
statusCode: 302

src/api/responses.ts

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,40 @@ const HEADERS = {
66
'Access-Control-Allow-Credentials': true
77
};
88

9-
export class Responses {
10-
constructor(private metrics: Metrics, private callback: Callback) {}
11-
12-
success(payload?: any) {
9+
export function successWrapper(metrics: Metrics, callback: Callback) {
10+
return function success(payload?: any) {
1311
const response = { statusCode: 200, headers: HEADERS };
1412
if (payload) {
1513
response['body'] = JSON.stringify(payload);
1614
}
17-
this.metrics.success(payload);
18-
this.callback(null, response);
19-
}
15+
metrics.success(payload);
16+
callback(null, response);
17+
};
18+
}
2019

21-
invalid(errors?: string[]) {
20+
export function invalidWrapper(metrics: Metrics, callback: Callback) {
21+
return function invalid(errors?: string[]) {
2222
const response = { statusCode: 400, headers: HEADERS };
2323
if (errors) {
2424
response['body'] = JSON.stringify({ errors });
2525
}
26-
this.metrics.invalid(response);
27-
this.callback(null, response);
28-
}
26+
metrics.invalid(response);
27+
callback(null, response);
28+
};
29+
}
2930

30-
redirect(url: string) {
31+
export function errorWrapper(metrics: Metrics, callback: Callback) {
32+
return function error(error?: any) {
33+
metrics.error(error);
34+
callback(new Error(error));
35+
};
36+
}
37+
38+
export function redirectWrapper(metrics: Metrics, callback: Callback) {
39+
return function redirect(url: string) {
3140
HEADERS['Location'] = url;
3241
const response = { statusCode: 302, headers: HEADERS };
33-
this.metrics.redirect(response);
34-
this.callback(null, response);
35-
}
36-
37-
error(error?: any) {
38-
this.metrics.error(error);
39-
this.callback(new Error(error));
40-
}
42+
metrics.redirect(response);
43+
callback(null, response);
44+
};
4145
}

src/api/wrapper.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ describe('API wrapper', () => {
99
queryStringParameters: { name: 'a test' },
1010
headers: { 'content-type': 'application/json', 'Test-Request': 'true' }
1111
});
12+
const context = {};
13+
const callback = jest.fn((err, result) => (err ? new Error(err) : result));
1214

1315
it('Has expected properties and response functions', () => {
1416
function mockHandler({
@@ -35,7 +37,9 @@ describe('API wrapper', () => {
3537
expect(invalid).toBeInstanceOf(Function);
3638
expect(redirect).toBeInstanceOf(Function);
3739
expect(error).toBeInstanceOf(Function);
40+
success('success');
3841
}
39-
api(mockHandler)(requestEvent);
42+
// @ts-ignore
43+
api(mockHandler)(requestEvent, context, callback);
4044
});
4145
});

src/api/wrapper.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { APIGatewayEvent, Context, Callback } from 'aws-lambda';
22
import { Request } from './parser';
33
import { Metrics } from '../common';
4-
import { Responses } from './responses';
4+
import { successWrapper, invalidWrapper, errorWrapper, redirectWrapper } from './responses';
55

66
const metrics = new Metrics('API Gateway');
77

88
export function api<T extends Function>(fn: T): T {
99
return <any>function(event: APIGatewayEvent, context: Context, callback: Callback) {
10-
const responses = new Responses(metrics, callback);
10+
// const responses = new Responses(metrics, callback).getResponses();
1111
const { body, path, query, auth, headers, testRequest } = new Request(event).getProperties();
1212

1313
const signature: ApiSignature = {
@@ -18,10 +18,10 @@ export function api<T extends Function>(fn: T): T {
1818
headers,
1919
testRequest,
2020
auth,
21-
success: responses.success,
22-
invalid: responses.invalid,
23-
redirect: responses.redirect,
24-
error: responses.error
21+
success: successWrapper(metrics, callback),
22+
invalid: invalidWrapper(metrics, callback),
23+
error: errorWrapper(metrics, callback),
24+
redirect: redirectWrapper(metrics, callback)
2525
};
2626
return fn(signature);
2727
};

0 commit comments

Comments
 (0)