dynamodb-service

1.6.2 • Public • Published

dynamodb-service

Managing records saved in Dynamodb

Scenario

I want to save scheduling information

{
  recurrence: string,
  time: string,
  timeZone: string,
  mediumType: enum, // SLACK, GMAIL, ...
  meta: json // ex: { channelId, slackBotId, slackBotName }
}

Goal

Create node package that exposes a DynamoDBService along with CRUD methods.

example usage

const DynamoDBService = require('dynamodb-service');
// profile = 'not-default' // => this is the aws credentials found in `.aws/credentials` file
let dynamoDBService = new DynamoDBService(tableName, primaryKeyName, profile);
 
dynamoDBService.create(data) // => @return Promise

pre-requisite

  • Create a credentials file at ~/.aws/credentials on Mac/Linux or C:\Users\USERNAME.aws\credentials on Windows
[default]
aws_access_key_id = your_access_key
aws_secret_access_key = your_secret_key
 
[not-default]
aws_access_key_id = your_access_key
aws_secret_access_key = your_secret_key

Other ways to provide credentials

  • Create a table
aws dynamodb create-table --table-name scheduling-configuration \
  --attribute-definitions AttributeName=configurationId,AttributeType=S \
  --key-schema AttributeName=configurationId,KeyType=HASH \
  --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
  --query TableDescription.TableArn --output text \
  --region=us-east-1 --profile default
# the tableName 'scheduling-configuration' can be anything 
# note the 'AttributeName', you can change 'configurationId' to whatever you want  

Step by step

The TDD way

  • Create dynamodb-service
mkdir dynamodb-service
  • add initial npm packge files
cd dynamodb-service && npm init
// follow the prompt and provide all required info
  • Create a test folder
mkdir test
  • Create and add logic to the test file
// we first create a test file for create method
// it should take in data and return a Promise that resolve with 
// the saved record
// ./test/create.test.js 
 
let DynamoDBService = require('../index.js');
let tableName = 'scheduling-configuration',
    primaryKeyName = 'configurationId';
let dynamodbService = new DynamodbService(tableName, primaryKeyName);
 
let data = {
  recurrence: 'string',
  time: 'string',
  timeZone: 'string',
  mediumType: 'SLACK', // SLACK, GMAIL, ...
  meta: { channelId: 'string', slackBotId: 'string', slackBotName: 'string' }
};
 
dynamoDBService.create(data)
.then(createdRecord => console.log(createdRecord))
.catch(e => console.error(e.message || 'error', e));
  • Run the test
# you should get errors 
node test/create.test.js
  • Create and add logic to the index.js file
// ./index.js
'use strict';
const DynamoDBService = require('./src/services/DynamoDBService');
module.exports = DynamoDBService;
  • Create DynamoDBService file
# ./src/services/DynamoDBService.js 
  • Add initialisation logic
// we are using es6 classes
// ./src/services/DynamoDBService.js
 
...
  constructor(tableName, primaryKeyName, profile) {
    this.tableName = tableName;
    this.primaryKeyName = primaryKeyName;
 
    let credentials = new AWS.SharedIniFileCredentials({profile});
    AWS.config.credentials = credentials;
 
    this.DYNAMO_DB = new AWS.DynamoDB.DocumentClient();
 
  }
...
 
  • Add logic for create method
// ./src/services/DynamoDBService.js
 
...
    let params = {
      TableName: this.tableName,
      Item: data
    };
    return this.dynamoDb.put(params).promise()
    .then((/* success */) => this.read(data[this.keyName]));
...
 
  • Add logic for read method
// ./src/services/DynamoDBService.js
 
...
    let Key = {};
    Key[this.keyName] = id;
    let params = {
      TableName: this.tableName,
      Key
    };
    return this.dynamoDb.get(params).promise()
    .then(function (response) {
      return response.Item;
    });
...
 

resource

Dependencies (1)

Dev Dependencies (0)

    Package Sidebar

    Install

    npm i dynamodb-service

    Weekly Downloads

    1

    Version

    1.6.2

    License

    ISC

    Last publish

    Collaborators

    • nshimiye