Skip to content

Commit

Permalink
feat(api-gateway-localdev): enable to define multiple responses with …
Browse files Browse the repository at this point in the history
…selectionPattern

```
responses: {
  "200": {
    "responseTemplates": {},
    "responseModels": {}
  },
  "404": {
    "selectionPattern": ".*404.*",
    "responseTemplates": {},
    "responseModels": {}
  }
}
```

BREAKING CHANGE: .responseTemplates and .responseModels, .statusCode are removed from top-level property
  • Loading branch information
ToQoz committed May 28, 2016
1 parent 978371d commit 98e2a46
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 38 deletions.
19 changes: 16 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,20 @@ var app = apiGatewayLocal(express(), [
lambda: require("./lambda").handler,
method: "GET",
path: "/users/{username}",
statusCode: 200,
responses: {
"200": {
"responseTemplates": {},
"responseModels": {}
},
"404": {
"selectionPattern": ".*404.*",
"responseTemplates": {},
"responseModels": {}
}
}
requestTemplates: {
"application/json": '{"username": "$input.params(\'username\')"}'
},
responseTemplates: {},
}
]);

Expand Down Expand Up @@ -65,7 +74,11 @@ var apiGatewayLocal = require('api-gateway-localdev')
- method - `String`
- path - `String`
- statusCode - `Number`
- responses - `map<String, map>`
- 'status code' e.g. "200"
- selectionPattern - `String`
- responseTemplates - `map<String, String|Buffer>`
- responseModels - `map<String, String|Buffer>`
- requestTemplates - `map<String, String|Buffer>`
- responseTemplates - `map<String, String|Buffer>`
- Return value
- app
46 changes: 34 additions & 12 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ module.exports = function(app, routes) {
});

routes.forEach(function(route) {
if (!('responses' in route)) {
throw new Error("responses is not found in route");
}

var path = route.path
.split("/")
.map(function(segment) {
Expand Down Expand Up @@ -68,21 +72,39 @@ module.exports = function(app, routes) {
done: function(err, obj) {
obj = obj || "";
var contentType, responseTemplates, responseTemplate, responseBody, statusCode;
var response;

// default
Object.keys(route.responses).forEach(function(code) {
var res = route.responses[code];
if (!res.selectionPattern) {
statusCode = code;
response = res;
}
});

if (err) {
statusCode = 400;
contentType = "application/json";
responseTemplate = "$input.json('$')";
obj = {error: err.toString()};
// selection pattern
Object.keys(route.responses).forEach(function(code) {
var res = route.responses[code];
if ((new RegExp(res.selectionPattern)).test(JSON.stringify(err))) {
statusCode = code;
response = res;
}
});
}

responseTemplates = response.responseTemplates || {};
if (Object.keys(responseTemplates).length > 0) {
contentType = req.accepts(Object.keys(responseTemplates)) || "application/json";
} else {
statusCode = route.statusCode;
responseTemplates = route.responseTemplates || {};
if (Object.keys(responseTemplates).length > 0) {
contentType = req.accepts(Object.keys(responseTemplates)) || "application/json";
} else {
contentType = "application/json";
}
responseTemplate = responseTemplates[contentType.toLowerCase()] || "$input.json('$')";
contentType = "application/json";
}
responseTemplate = responseTemplates[contentType.toLowerCase()] || "$input.json('$')";

if (err) {
// obj = {error: err.toString()};
obj = err
}

responseBody = mappingTemplate({
Expand Down
70 changes: 47 additions & 23 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,79 +10,103 @@ var apiGatewayRoutes = [
lambda: function(_, context) { context.done(null, "all"); },
method: "GET",
path: "/{all}",
statusCode: 200,
requestTemplates: {},
responseTemplates: {
"text/plain": "$input.path('$')"
},
responses: {
"200": {
responseTemplates: {
"text/plain": "$input.path('$')"
},
}
}
},
{
lambda: function(_, context) { context.done(null, "hello"); },
method: "GET",
path: "/hello",
statusCode: 200,
requestTemplates: {},
responseTemplates: {
"text/plain": "$input.path('$')"
responses: {
"200": {
responseTemplates: {
"text/plain": "$input.path('$')"
},
}
}
},
{
lambda: lambdas.users.index,
method: "GET",
path: "/json/users",
statusCode: 200,
requestTemplates: {},
responseTemplates: {},
responses: {
"200": {
responseTemplates: {},
}
}
},
{
lambda: lambdas.users.index,
method: "GET",
path: "/json/users",
statusCode: 200,
requestTemplates: {},
responseTemplates: {},
responses: {
"200": {
responseTemplates: {},
}
}
},
{
lambda: lambdas.users.create,
method: "POST",
path: "/json/users",
statusCode: 201,
requestTemplates: {},
responseTemplates: {},
responses: {
"201": {
responseTemplates: {},
}
}
},
{
lambda: lambdas.users.show,
method: "GET",
path: "/json/users/{username}",
statusCode: 200,
requestTemplates: {
"application/json": '{"username": "$input.params(\'username\')"}'
},
responseTemplates: {},
responses: {
"200": {
responseTemplates: {},
}
}
},
{
lambda: lambdas.users.showHtml,
method: "GET",
path: "/html/users/{username}",
statusCode: 200,
requestTemplates: {
"application/json": '{"username": "$input.params(\'username\')"}'
},
responseTemplates: {
"text/html": "<h1>$input.path('$.name')</h1>"
},
responses: {
"200": {
responseTemplates: {
"text/html": "<h1>$input.path('$.name')</h1>"
},
}
}
},
{
lambda: lambdas.users.showHtml_v2,
method: "GET",
path: "/html/v2/users/{username}",
statusCode: 200,
requestTemplates: {
"application/json": '{"username": "$input.params(\'username\')"}'
},
responseTemplates: {
"text/html": "$input.path('$')"
},
responses: {
"200": {
responseTemplates: {
"text/html": "$input.path('$')"
},
}
}
}
];

Expand Down

0 comments on commit 98e2a46

Please sign in to comment.