Skip to content

Instantly share code, notes, and snippets.

@petebarber
Created September 2, 2017 08:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save petebarber/fa0b96226bf51f0602f1348c6cb06960 to your computer and use it in GitHub Desktop.
Save petebarber/fa0b96226bf51f0602f1348c6cb06960 to your computer and use it in GitHub Desktop.
'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