lambdasync
Version:
Easy sync between local code and AWS lambda functions
135 lines (109 loc) • 3.92 kB
JavaScript
const users = [{id: 1, name: 'Joe'}, {id: 2, name: 'Jane'}];
const defaultHeaders = {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json'
};
function createProxyReturnObject(statusCode, body = null, headers = defaultHeaders) {
return {
statusCode,
headers,
body: JSON.stringify(body)
};
}
function contextSucceed(event, context) {
context.succeed(createProxyReturnObject(200, 'Everything is awesome!'));
};
function contextFail(event, context) {
context.fail(createProxyReturnObject(404, 'Oops! Not found.'));
};
function contextDone(event, context) {
context.done(createProxyReturnObject(500, {error: 'This test failed.'}));
};
function callback(event, context, callback) {
callback(createProxyReturnObject(200, 'Everything is awesome!'));
};
function usersPostWithBody(event, context, callback) {
if (event.httpMethod === 'POST' && event.path === '/users') {
context.succeed(createProxyReturnObject(200, JSON.parse(event.body)));
}
return context.fail(createProxyReturnObject(500, {error: 'This test failed.'}));
};
function usersPatchWithBody(event, context, callback) {
if (event.httpMethod === 'PATCH' && event.path === '/users/1') {
context.succeed(createProxyReturnObject(200, JSON.parse(event.body)));
}
return context.fail(createProxyReturnObject(500, {error: 'This test failed.'}));
};
function usersDelete(event, context, callback) {
if (event.httpMethod === 'DELETE' && event.path === '/users/1') {
context.succeed(createProxyReturnObject(200));
}
return context.fail(createProxyReturnObject(500, {error: 'This test failed.'}));
};
function expressApp() {
const awsServerlessExpress = require('aws-serverless-express');
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const awsServerlessExpressMiddleware = require('aws-serverless-express/middleware');
const app = express();
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(awsServerlessExpressMiddleware.eventContext());
// Ephemeral in-memory data store
const users = [{id: 1, name: 'Joe'}, {id: 2, name: 'Jane'}];
let userIdCounter = users.length;
// User functions
const getUser = userId => users.find(u => u.id === parseInt(userId, 10));
const getUserIndex = userId => users.findIndex(u => u.id === parseInt(userId, 10));
app.get('/', (req, res) => {
res.sendFile(`${__dirname}/index.html`);
});
app.get('/users', (req, res) => {
res.json(users);
});
app.get('/users/:userId', (req, res) => {
const user = getUser(req.params.userId);
if (!user) {
return res.status(404).json({});
}
return res.json(user);
});
app.post('/users', (req, res) => {
const user = {
id: ++userIdCounter,
name: req.body.name
};
users.push(user);
res.status(201).json(user);
});
app.put('/users/:userId', (req, res) => {
const user = getUser(req.params.userId);
if (!user) {
return res.status(404).json({});
}
user.name = req.body.name;
res.json(user);
});
app.delete('/users/:userId', (req, res) => {
const userIndex = getUserIndex(req.params.userId);
if (userIndex === -1) {
return res.status(404).json({});
}
users.splice(userIndex, 1);
res.json(users);
});
const server = awsServerlessExpress.createServer(app);
return (event, context) => awsServerlessExpress.proxy(server, event, context);
}
exports = module.exports = {};
exports.createProxyReturnObject = createProxyReturnObject;
exports.contextSucceed = contextSucceed;
exports.contextFail = contextFail;
exports.contextDone = contextDone;
exports.callback = callback;
exports.usersPostWithBody = usersPostWithBody;
exports.usersPatchWithBody = usersPatchWithBody;
exports.usersDelete = usersDelete;
exports.expressApp = expressApp;