/dyn

Experiment library to read from dynamodb

Primary LanguageJavaScript

Dyn

Super crude idea for a library to talk with dynamodb. Does not handle paging at the moment. An interesting use of js proxies.

npm i @nargella/dyn
const Dyn = require("@nargella/dyn");
const AWS = require("aws-sdk");
AWS.config.region = "us-east-1";
const {
  reader,
  query,
  queryByIndex,
  queryAndFilter,
  scan,
  create,
  update,
  updateConditionally,
  del
} = new Dyn(new AWS.DynamoDB.DocumentClient());

See dyn_data for some data.

Create

// create[table] = {}

create.ProductCatalog = {
  Id: 500,
  Price: 222,
  ProductCategory: "Bicycle",
  Title: "99-Bike-212",
  BicycleType: "Hybrid",
  Brand: "Brand 212",
  Color: ["Red"],
  Description: "212 Description"
}

Read

Basic key/value:

// reader[table]({partitionkey: value, [sortkey: value]})

await reader.Movies({
	year: 2013,
	title: "2 Guns"
})

Query:

// query[table]["key condition template"]({template_var: value})

// note: year is a reserved keyword, hence the # sign
await query.Movies["#year = :yyyy"]({
	":yyyy": 2009
})

await query.Movies["#year = :yyyy and title between :letter1 and :letter2"]({
	":yyyy": 2009,
	":letter1": "A",
	":letter2": "L"
})

Query and Filter:

// queryAndFilter[table]["key condition template"]["filter condition template"]({template_var: value})

await queryAndFilter.Movies["#year = :year and begins_with(title, :title)"]["rated = :rated"]({
	":title": "A",
	":year": 2013,
	":rated": "PG"
})

Scan:

// scan[table]["filter condition template"]({template_var: value})

// note: year is a reserved keyword, hence the # sign
await scan.Movies["#year between :start_yr and :end_yr"]({
	":start_yr": 2009,
	":end_yr": 2018
})

await scan.ProductCatalog["id between :start and :end"]({
	":start": 200,
	":end": 300
})

// get the whole table (within dynamodb limits)
await scan.ProductCatalog[""]()

Update

Update:

// update[table]({partitionkey: value, [sortkey: value]})["update expression template"]({template_var: value})

await update.ProductCatalog({Id: 500})["set Price = :price"]({
    ":price": 300
})

await update.ProductCatalog({Id: 500})["set Color = :color"]({
    ":color": ["Green"]
})

const product500 = update.ProductCatalog({Id: 500});
const product205 = update.ProductCatalog({Id: 205});
await product500["set Color = :color"]({
    ":color": ["Yellow"]
});
await product205["set Color = :color"]({
    ":color": ["Yellow"]
})

Update Conditionally:

// updateConditionally[table]({partitionkey: value, [sortkey: value]})["conditional template"]["update expression template"]({template_var: value})

try {
    await updateConditionally.ProductCatalog({Id: 202})["Price < :price"]["set Price = :price"]({
        ":price": 500
    });
} catch(e) {
    if (e.code === "ConditionalCheckFailedException") {
        // no update found
    }
}

Delete

// del[table](partitionkey: value, [sortkey: value]})

await del.ProductCatalog({Id: 500})