Created
September 2, 2017 08:21
-
-
Save petebarber/fa0b96226bf51f0602f1348c6cb06960 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
const AWS = require("aws-sdk"); | |
const errors = require("./Errors.js"); | |
const findUserByEmailAddress = function(emailAddress) | |
{ | |
AWS.config.dynamodb = { endpoint: "http://localhost:8000" }; | |
const docClient = new AWS.DynamoDB.DocumentClient(); | |
const query = | |
{ | |
TableName: "TestTable", | |
Key: | |
{ | |
emailAddress: emailAddress | |
} | |
}; | |
return docClient.get(query).promise(function(err, data) | |
{ | |
if (err) | |
reject(err); | |
else | |
resolve(data.Item); | |
}); | |
} | |
const addUser = function(emailAddress) | |
{ | |
const newItem = | |
{ | |
TableName: "TestTable", | |
Item: | |
{ | |
version: 0, | |
emailAddress : emailAddress, | |
info: {} | |
} | |
} | |
return new Promise(function(resolve, reject) | |
{ | |
AWS.config.dynamodb = { endpoint: "http://localhost:8000" }; | |
const docClient = new AWS.DynamoDB.DocumentClient(); | |
docClient.put(newItem).promise() | |
.then(() => resolve(newItem.Item)) | |
.catch(err => reject(err)) | |
}); | |
} | |
const updateUserInfo = function(user, info) | |
{ | |
const currentVersion = user.version; | |
const updatedVersion = currentVersion + 1; | |
const updateRequest = | |
{ | |
TableName: "TestTable", | |
Key: { emailAddress: user.emailAddress }, | |
ReturnValues: "ALL_NEW", | |
UpdateExpression: "SET info = :info, version=:updatedVersion", | |
ConditionExpression: "version = :currenVersion", | |
ExpressionAttributeValues : | |
{ | |
":currenVersion": currentVersion, | |
":updatedVersion": updatedVersion, | |
":info": info | |
} | |
} | |
const docClient = new AWS.DynamoDB.DocumentClient(); | |
return new Promise(function(resolve, reject) | |
{ | |
docClient.update(updateRequest).promise() | |
.then(updateRequest => resolve(updateRequest.Attributes)) | |
.catch(err => reject(err)); | |
}); | |
} | |
const isValidVersion = function(event) | |
{ | |
return event.rpcVersion === 1 || false; | |
} | |
const updateOrAddUser = function(request) | |
{ | |
if (isValidVersion(request) === false) | |
{ | |
return Promise.reject({ Error: -1 }); | |
} | |
return new Promise(function(resolve, reject) | |
{ | |
findUserByEmailAddress(request.emailAddress) | |
.then(user => | |
{ | |
if (JSON.stringify(user) === "{}") | |
return addUser(request.emailAddress); | |
else | |
return user; | |
}) | |
.then(function(user) | |
{ | |
return updateUserInfo(user, request.info); | |
}) | |
.then(updatedUser => resolve(updatedUser)) | |
.catch(function(err) | |
{ | |
reject(err); | |
}) | |
}); | |
} | |
exports.handler = (event, context, callback) => | |
{ | |
console.log('Received event:', JSON.stringify(event, null, 2)); | |
updateOrAddUser(event) | |
.then(function(user) | |
{ | |
console.log("RESULT:", user); | |
callback(null, user); | |
}) | |
.catch(function(err) | |
{ | |
callback(JSON.stringify(err)); | |
}); | |
}; | |
exports._test = | |
{ | |
findUserByEmailAddress: findUserByEmailAddress, | |
addUser: addUser, | |
updateUserInfo: updateUserInfo, | |
updateOrAddUser: updateOrAddUser | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment