Detail on CRUD with DynamoDB
We continue from section
- handler --- spaces/handler.ts (CRUD with DynamoDB) in this post
Suppose that we have initiated a ddbClient
by
const ddbClient = new DynamoDBClient({});
and passed into each of get
, post
, put
, delete
functions.
get.ts
import { DynamoDBClient, GetItemCommand, ScanCommand } from "@aws-sdk/client-dynamodb"; import { unmarshall } from "@aws-sdk/util-dynamodb"; import { APIGatewayProxyEvent, APIGatewayProxyResult } from "aws-lambda"; export default async (event: APIGatewayProxyEvent, ddbClient: DynamoDBClient): Promise<APIGatewayProxyResult> => { const spaceId = event.queryStringParameters?.["id"]; if (event.queryStringParameters) { if (!spaceId) { return { statusCode: 400, body: JSON.stringify("id required") } } event.queryStringParameters const res = await ddbClient.send(new GetItemCommand({ TableName: process.env.TABLE_NAME, Key: { id: { S: spaceId } } })); if (res.Item) { const unmarshalled = unmarshall(res.Item); return { statusCode: 200, body: JSON.stringify(unmarshalled) } } else { return { statusCode: 404, body: JSON.stringify(`space with id: ${spaceId} not found`) } } } else { const result = await ddbClient.send(new ScanCommand({ TableName: process.env.TABLE_NAME, })); const result_ = result.Items?.map(item => unmarshall(item)); return { statusCode: 200, body: JSON.stringify(result_) } } }
post.ts
import { DynamoDBClient, PutItemCommand } from "@aws-sdk/client-dynamodb"; import { marshall } from "@aws-sdk/util-dynamodb"; import { APIGatewayProxyEvent, APIGatewayProxyResult } from "aws-lambda"; import { v4 } from "uuid"; export default async (event: APIGatewayProxyEvent, ddbClient: DynamoDBClient): Promise<APIGatewayProxyResult> => { const randomId = v4(); const item = JSON.parse(event.body || ""); const result = await ddbClient.send(new PutItemCommand({ TableName: process.env.TABLE_NAME, Item: marshall(item) })); return { statusCode: 201, body: JSON.stringify({ id: randomId }) }; }
put.ts
import { DynamoDBClient, PutItemCommand, UpdateItemCommand } from "@aws-sdk/client-dynamodb"; import { APIGatewayProxyEvent, APIGatewayProxyResult } from "aws-lambda"; export default async (event: APIGatewayProxyEvent, ddbClient: DynamoDBClient): Promise<APIGatewayProxyResult> => { if (event.queryStringParameters && "id" in event.queryStringParameters && event.body) { const spaceId = event.queryStringParameters["id"] || ""; const [key, value] = Object.entries(JSON.parse(event.body))[0] as [string, string]; const updateResult = await ddbClient.send(new UpdateItemCommand({ TableName: process.env.TABLE_NAME, Key: { "id": { S: spaceId } }, UpdateExpression: "set #attr = :new", ExpressionAttributeNames: { "#attr": key }, ExpressionAttributeValues: { ":new": { "S": value } }, ReturnValues: "UPDATED_NEW" })) return { statusCode: 204, body: JSON.stringify(updateResult.Attributes) } } return { statusCode: 400, body: JSON.stringify("Please provide value arguments") }; }
delete.ts
import { DeleteItemCommand, DynamoDBClient, PutItemCommand } from "@aws-sdk/client-dynamodb"; import { APIGatewayProxyEvent, APIGatewayProxyResult } from "aws-lambda"; export default async (event: APIGatewayProxyEvent, ddbClient: DynamoDBClient): Promise<APIGatewayProxyResult> => { if (event.queryStringParameters && "id" in event.queryStringParameters && event.body) { const spaceId = event.queryStringParameters["id"] || ""; await ddbClient.send(new DeleteItemCommand({ TableName: process.env.TABLE_NAME, Key: { id: { S: spaceId } } })) return { statusCode: 204, body: JSON.stringify(`deleted item with id ${spaceId}`) } } return { statusCode: 201, body: JSON.stringify("Please provide valid arguments.") }; }