1 minute read

The full documentation is here, https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-dynamodb/index.html

To read and write an item in DynamoDB

// dynamodbClient.ts
import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"
import { DynamoDBClient } from "@aws-sdk/client-dynamodb"
import 'dotenv/config'

export const ddbClient = new DynamoDBClient({ region: 'eu-west-1' })
export const ddbDocClient = DynamoDBDocumentClient.from(ddbClient)
import { GetCommand, PutCommand } from "@aws-sdk/lib-dynamodb"
import config from "../config"
import { ddbDocClient } from "./dynamodbClient"
import { Job } from "./types"

const tableName = `${config.component}-jobs-${config.run_env}`

export async function upsertJob(job: Job) : Promise<[Job, string]> {
  const params = {
    TableName: tableName,
    Item: job
  }

  try {
    await ddbDocClient.send(new PutCommand(params))
    return [job, '']
  } catch (error) {
    console.log(error)
    return [job, (error as Error).message]
  }
}

export async function getJob(email: string, jobId: string)
  : Promise<[Job, string]> {

  const params = {
    TableName: tableName,
    Key: {
      email,
      jobId
    }
  }

  try {
    const result = await ddbDocClient.send(new GetCommand(params))
    return [result.Item as Job, '']
  } catch (error) {
    console.log(error)
    return [{} as Job, (error as Error).message]
  }
}

Query

You have to convert DynamoDB Record to JavaScript object with unmarshall

export async function getJobs(email: string)
  : Promise<[Job[], string, string]> {

  const params = {
    TableName: tableName,
    KeyConditionExpression: "email = :email",
    ExpressionAttributeValues: {
      ":email": { S: email },
    }
  }

  try {
    const result = await ddbDocClient.send(new QueryCommand(params))

    return [
      result.Items?.map(x => unmarshall(x)) as Job[],
      result.$metadata.httpStatusCode.toString(),
      ''
    ]
  } catch (error) {
    console.log(error)
    return [
      {} as Job[],
      error.$metadata.httpStatusCode,
      (error as Error).message
    ]
  }
}

Comments