Skip to content
This repository has been archived by the owner on May 21, 2020. It is now read-only.

Feature NodeJS DynamoDB CRUD #59

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,4 @@ Each example contains a README.md with an explanation about the solution and it'
| [`python-crud-google-spreadsheet`](python-crud-google-spreadsheet) <br/> Google Spreadsheet CRUD with functions | python3 |
| [`kmeans-sklearn`](kmeans-sklearn) <br/> Simple kmeans examples using sklearn | python2 |
| [`naive-serverless-map-reduce`](naive-serverless-map-reduce) <br/> Naive serverless MapReduce | nodeJS |
| [`nodejs-crud-dynamo`](nodejs-crud-dynamo) <br/> Basic CRUD example using DynamoDB | nodeJS |
84 changes: 84 additions & 0 deletions nodejs-crud-dynamo/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# NodeJS DynamoDB CRUD

Wraps basic CRUD operations for DynamoDB in Binaris functions.

# Using the CRUD

It is assumed you already have a Binaris account. If you don't have an account yet, worry not, signing up is painless and takes just 2 minutes. Visit [Getting Started](https://dev.binaris.com/tutorials/nodejs/getting-started/) to find concise instructions for the process.

To use any of the functions in this example, you must export the following three variables into your environment (before deployment).

* `AWS_ACCESS_KEY_ID` # AWS access key
* `AWS_SECRET_ACCESS_KEY` # secret AWS credential
* `AWS_REGION` # AWS region used for DynamoDB

## Deploy

A helper command "deploy" is defined in the package.json to simplify the deployment process

```bash
$ npm run deploy
```

## Create the Table

```bash
$ bn invoke createDriversTable
```

## Create a Driver

```bash
$ npm run createDriver
```

or

```bash
$ bn invoke createDriver --json ./queries/createDriver.json
```

## Read a Driver

```bash
$ npm run readDriver
```

or

```bash
$ bn invoke readDriver --json ./queries/readDriver.json
```

## Update a Driver

```bash
$ npm run updateDriver
```

or

```bash
$ bn invoke updateDriver --json ./queries/updateDriver.json
```

## Delete a Driver

```bash
$ npm run deleteDriver
```

or

```bash
$ bn invoke deleteDriver --json ./queries/deleteDriver.json
```


## Remove

A helper command "remove" is defined in the package.json to simplify the removal process

```bash
$ npm run remove
```
46 changes: 46 additions & 0 deletions nodejs-crud-dynamo/binaris.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
functions:
createDriversTable:
file: function.js
entrypoint: createDriversTable
executionModel: concurrent
runtime: node8
env:
AWS_ACCESS_KEY_ID:
AWS_SECRET_ACCESS_KEY:
AWS_REGION:
createDriver:
file: function.js
entrypoint: createDriver
executionModel: concurrent
runtime: node8
env:
AWS_ACCESS_KEY_ID:
AWS_SECRET_ACCESS_KEY:
AWS_REGION:
readDriver:
file: function.js
entrypoint: readDriver
executionModel: concurrent
runtime: node8
env:
AWS_ACCESS_KEY_ID:
AWS_SECRET_ACCESS_KEY:
AWS_REGION:
updateDriver:
file: function.js
entrypoint: updateDriver
executionModel: concurrent
runtime: node8
env:
AWS_ACCESS_KEY_ID:
AWS_SECRET_ACCESS_KEY:
AWS_REGION:
deleteDriver:
file: function.js
entrypoint: deleteDriver
executionModel: concurrent
runtime: node8
env:
AWS_ACCESS_KEY_ID:
AWS_SECRET_ACCESS_KEY:
AWS_REGION:
6 changes: 6 additions & 0 deletions nodejs-crud-dynamo/deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/bash
functions=( createDriversTable createDriver readDriver updateDriver deleteDriver )
for i in "${functions[@]}"
do
bn deploy $i
done
100 changes: 100 additions & 0 deletions nodejs-crud-dynamo/function.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
const AWS = require('aws-sdk');

const {
AWS_ACCESS_KEY_ID,
AWS_SECRET_ACCESS_KEY,
AWS_REGION
} = process.env;

AWS.config.update({
accessKeyId: AWS_ACCESS_KEY_ID,
secretAccessKey: AWS_SECRET_ACCESS_KEY,
region: AWS_REGION,
endpoint: `https://dynamodb.${AWS_REGION}.amazonaws.com`,
});

const dynamoDB = new AWS.DynamoDB();
const docClient = new AWS.DynamoDB.DocumentClient();

function validatedBody(body, ...fields) {
for (const field of fields) {
if (!Object.prototype.hasOwnProperty.call(body, field)) {
throw new Error(`Missing request body parameter: ${field}.`);
}
}
return body;
}

const TableName = 'Drivers';
const PrimaryKey = 'driverID';

exports.createDriversTable = async () => {
return dynamoDB.createTable({
TableName,
KeySchema: [{
AttributeName: PrimaryKey,
KeyType: 'HASH',
}],
AttributeDefinitions: [{
AttributeName: PrimaryKey,
AttributeType: 'S',
}],
ProvisionedThroughput: {
ReadCapacityUnits: 10,
WriteCapacityUnits: 10,
}
}).promise();
};

exports.createDriver = async (body) => {
const {
driverID,
rideStatus,
lastLocation
} = validatedBody(body, 'driverID', 'rideStatus', 'lastLocation');

return docClient.put({
TableName,
Item: {
driverID,
rideStatus,
lastLocation,
}
}).promise();
};

exports.readDriver = async (body) => {
const { driverID } = validatedBody(body, 'driverID');
return docClient.get({ TableName, Key: { driverID } }).promise();
};

exports.updateDriver = async (body) => {
const {
driverID,
rideStatus,
lastLocation
} = validatedBody(body, 'driverID', 'rideStatus', 'lastLocation');

return docClient.update({
TableName,
Key: { driverID },
UpdateExpression: 'SET #loc.#lon = :lonVal, #loc.#lat = :latVal, #rideStatus= :r',
ExpressionAttributeNames: {
'#loc': 'lastLocation',
'#lon': 'longitude',
'#lat': 'latitude',
'#rideStatus': 'rideStatus',
},
ExpressionAttributeValues: {
':r': rideStatus,
':lonVal': lastLocation.longitude,
':latVal': lastLocation.latitude,
},
ReturnValues: 'UPDATED_NEW'
}).promise();
};

exports.deleteDriver = async (body) => {
const { driverID } = validatedBody(body, 'driverID');
return docClient.delete({ TableName, Key: { driverID } }).promise();
};
34 changes: 34 additions & 0 deletions nodejs-crud-dynamo/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"name": "nodejs-crud-dynamo",
"version": "1.0.0",
"private": true,
"license": "MIT",
"description": "An example CRUD around DynamoDB",
"main": "function.js",
"repository": {
"type": "git",
"url": "git+https://github.com/binaris/functions-examples.git"
},
"scripts": {
"deploy": "./deploy",
"remove": "./remove",
"createDriver": "bn invoke createDriver --json ./queries/createDriver.json",
"readDriver": "bn invoke readDriver --json ./queries/readDriver.json",
"updateDriver": "bn invoke updateDriver --json ./queries/updateDriver.json",
"deleteDriver": "bn invoke deleteDriver --json ./queries/deleteDriver.json"
},
"bugs": {
"url": "https://github.com/binaris/functions-examples/issues"
},
"homepage": "https://github.com/binaris/functions-examples/nodejs-crud-dynamo/README.md",
"author": "Ryland Goldstein",
"dependencies": {
"aws-sdk": "^2.430.0"
},
"keywords": [
"Binaris",
"FaaS",
"CRUD",
"DynamoDB"
]
}
8 changes: 8 additions & 0 deletions nodejs-crud-dynamo/queries/createDriver.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"driverID": "a21s312qew313hdg",
"rideStatus": "HAS_RIDER",
"lastLocation": {
"longitude": "-77.0364",
"latitude": "38.8951"
}
}
3 changes: 3 additions & 0 deletions nodejs-crud-dynamo/queries/deleteDriver.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"driverID": "a21s312qew313hdg"
}
3 changes: 3 additions & 0 deletions nodejs-crud-dynamo/queries/readDriver.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"driverID": "a21s312qew313hdg"
}
8 changes: 8 additions & 0 deletions nodejs-crud-dynamo/queries/updateDriver.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"driverID": "a21s312qew313hdg",
"rideStatus": "NO_RIDER",
"lastLocation": {
"longitude": "-78.0364",
"latitude": "38.8851"
}
}
6 changes: 6 additions & 0 deletions nodejs-crud-dynamo/remove.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/bash
functions=( createDriversTable createDriver readDriver updateDriver deleteDriver )
for i in "${functions[@]}"
do
bn remove $i
done
34 changes: 34 additions & 0 deletions typescript-function/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# TypeScript function (NodeJS and TypeScript)

Boilerplate setup for a Binaris function written in TypeScript

It is assumed you already have a Binaris account. If you don't have an account yet, worry not, signing up is painless and takes just 2 minutes. Visit [Getting Started](https://dev.binaris.com/tutorials/nodejs/getting-started/) to find concise instructions for the process.

## Using the function

1. Install dev-dependencies needed to compile TypeScript.

```bash
$ npm install
```

1. Compile the TypeScript function for Binaris deployment.

```bash
$ npm run build
```

1. Deploy the function.

```bash
$ bn deploy typescript
```

1. Invoke.

```bash
$ bn invoke typescript
"Hello World!"
```

> Note: The "npm run deploy" script is a convenience target that compiles and deploys your TypeScript function
6 changes: 6 additions & 0 deletions typescript-function/binaris.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
functions:
typescript:
file: dist/function.js
entrypoint: handler
executionModel: concurrent
runtime: node8
28 changes: 28 additions & 0 deletions typescript-function/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"name": "typescript-function",
"version": "1.0.0",
"private": true,
"license": "MIT",
"description": "A demo showing a common TypeScript setup on Binaris",
"main": "dist/index.js",
"repository": {
"type": "git",
"url": "git+https://github.com/binaris/functions-examples.git"
},
"scripts": {
"deploy": "npm run build && bn deploy typescript",
"build": "tsc --p tsconfig.json",
"lint": "tslint -p tsconfig.json -c tslint.yml"
},
"bugs": {
"url": "https://github.com/binaris/functions-examples/issues"
},
"homepage": "https://github.com/binaris/functions-examples/typescript-function/README.md",
"author": "Ryland Goldstein",
"dependencies": {},
"devDependencies": {
"@types/node": "^11.11.3",
"tslint": "^5.14.0",
"typescript": "^3.3.3333"
}
}
Loading