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;
  }
};