documents/dev/snippets/aws/Lambda Dynamo.md
Lambda Dynamo
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.03.html
const AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB.DocumentClient({
apiVersion: '2012-08-10',
region: process.env.AWS_REGION,
sslEnabled: false,
paramValidation: false,
convertResponseTypes: false
});
const { TABLE_NAME } = process.env;
Delete
const removeConnection = async (connectionId)=> {
const deleteParams = {
TableName: TABLE_NAME,
Key: { connectionId }
};
try {
await ddb.delete(deleteParams).promise();
} catch (err) {
return { statusCode: 500, body: 'Failed to disconnect: ' + JSON.stringify(err) };
}
return { statusCode: 200, body: 'Disconnected.' };
};
Put
const addConnection = async (connectionId, channel)=> {
const putParams = {
TableName: TABLE_NAME,
Item: { connectionId, channel }
};
try {
await ddb.put(putParams).promise();
} catch (err) {
return { statusCode: 500, body: 'Failed to connect: ' + JSON.stringify(err) };
}
return { statusCode: 200, body: 'Connected.' };
};
Query
const getConnections = async (channel)=> {
try {
const connectionData = await ddb.query({
TableName: TABLE_NAME,
IndexName: 'channel-index',
KeyConditionExpression: "channel=:channel",
ExpressionAttributeValues: {":channel": channel}
}).promise();
// [{connectionId, channel}]
return connectionData.Items;
} catch (e) {
return [];
}
};
UPDATE
const UpdateItem = async (TableName, id, props)=> {
const attrNames = {};
const attrVals = {};
const expr = [];
Object.keys(props).forEach(prop=> {
attrNames[`#key_${prop}`] = prop;
attrVals[`:val_${prop}`] = props[prop];
expr.push(`#key_${prop}=:val_${prop}`);
});
const exprStr = "SET " + expr.join(', ');
try {
const params = {
TableName: TableName,
Key: {id},
UpdateExpression: exprStr,
ExpressionAttributeNames: attrNames,
ExpressionAttributeValues: attrVals,
ReturnValues: "UPDATED_NEW"
};
return await ddb.update(params).promise();
} catch (e) {
return e;
}
};