Lambda functions for reading and writing messages

  1. At Lambda function
  • Choose Create function
  1. At Basic information
  • Function name: Chat-Messages-GET
  • Runtime: Node.js 18.x
  • Use an existing role : Lambda-Role-ChatApp
  • Choose Create function
  1. Copy code and paste it
import {DynamoDBClient, paginateQuery} from '@aws-sdk/client-dynamodb';

const client = new DynamoDBClient({});

export const handler = async function (event) {
    let messages = [];
    const paginator = paginateQuery({client: client}, {
        TableName: 'Chat-Messages',
        ProjectionExpression: '#T, Sender, Message',
        ExpressionAttributeNames: {'#T': 'Timestamp'},
        KeyConditionExpression: 'ConversationId = :id',
        ExpressionAttributeValues: {':id': {S: event.id}}
    });

    for await (const page of paginator) {
        for (const message of page.Items) {
            messages.push({
                sender: message.Sender.S,
                time: Number(message.Timestamp.N),
                message: message.Message.S
            });
        }
    }
    return loadConversationDetail(event.id, messages);
}

async function loadConversationDetail(id, messages) {
    const paginator = paginateQuery({client: client}, {
        TableName: 'Chat-Conversations',
        Select: 'ALL_ATTRIBUTES',
        KeyConditionExpression: 'ConversationId = :id',
        ExpressionAttributeValues: {':id': {S: id}}
    });

    let participants = [];

    for await (const page of paginator) {
        for (const item of page.Items) {
            participants.push(item.Username.S);
        }
    }

    return {
        id: id,
        participants: participants,
        last: messages.length > 0 ? messages[messages.length - 1].time : undefined,
        messages: messages
    }
}
  • Choose Deploy
  1. At Lambda function
  • Choose Create function
  • Function name: Chat-Messages-POÓT
  • Runtime: Node.js 18.x
  • Use an existing role : Lambda-Role-ChatApp
  • Choose Create function
  1. Copy code and paste it
import {DynamoDBClient, PutItemCommand} from '@aws-sdk/client-dynamodb';

const client = new DynamoDBClient({});

export const handler = async function (event) {
    await client.send(new PutItemCommand({
        TableName: 'Chat-Messages',
        Item: {
            ConversationId: {S: event.id},
            Timestamp: {
                N: "" + new Date().getTime()
            },
            Message: {S: event.message},
            Sender: {S: 'Student'}
        }
    }));
};
  • Choose Deploy

6. At API Interface

  • Choose /{id}
  • Choose Create method
  1. At Method details
  • Method type: GET
  • Integration type: Lambda function
  • Choose lambda function: Chat-Messages-GET
  • Choose create method
  1. At API Interface
  • Choose /{id}
  • Choose Create method
  1. At Method details
  • Method type: POST
  • Integration type: Lambda function
  • Choose lambda function: Chat-Messages-POST
  • Choose create method
  1. At API gateway
  • Choose Models
  • Choose Create models
  • Name: Conversation
  • Content type: application/json
  • Model schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "participants": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "last": {
      "type": "number",
      "format": "utc-millisec"
    },
    "messages": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "sender": {
            "type": "string"
          },
          "time": {
            "type": "number",
            "format": "utc-millisec"
          },
          "message": {
            "type": "string"
          }
        }
      }
    }
  }
}

  • Choose Create
  1. At API gateway
  • Choose Models
  • Choose Create models
  • Name: newMessages
  • Content type: application/json

  • Model schema
{
  "type": "string"
}
  • Choose Create
  1. At API resource
  • Choose GET in /{id}
  • Choose Integration request
  • Choose Edit
  1. Choose Mapping templates
  • Choose Add mapping template
  • Content type: application/json
  • Template body
#set($inputRoot = $input.path('$'))
{
    "id": "$input.params('id')"
}

  • Choose Save
  1. Choose Test at GET in /{id}
  2. Test
  • id: 1
  • Choose Test
  1. Check the results
  2. At API resource
  • Choose GET in /{id}
  • Choose Method response
  • Choose Edit
  1. Update Response body
  • Content type: application/json
  • Model: Conversation
  • Choose: Save
  1. At API resource
  • Choose POST in /{id}
  • Choose Integration request
  • Choose Edit
  1. Choose Mapping templates
  • Choose Add mapping template
  • Content type: application/json

  • Template body
#set($inputRoot = $input.path('$'))
{
    "id": "$input.params('id')",
    "message": "$inputRoot"
}

  • Choose Save
  1. At API resource
  • Choose POST in /{id}
  • Choose Method request
  • Choose Edit
  1. Update Response body
  • Content type: application/json
  • Model: newMessage
  • Choose: Save
  1. Choose Test at POST in /{id}
  • id: 1
  • Request body: test message
  • Choose Test
  1. Check the results
  2. At API resource
  • Choose POST in /{id}
  • Choose Method response
  • Choose Create response
  1. At response details
  • HTTP status code: 204
  • Choose: Save
  1. At API resource
  • Choose POST in /{id}
  • Choose Method response
  • Choose Delete Response 200
  • Choose Delete
  1. At API resource
  • Choose POST in /{id}
  • Choose Integration response
  • Choose Delete Default - response
  • Choose Delete
  1. At API resource
  • Choose POST in /{id}
  • Choose Integration response
  • Choose Create response
  1. At response details
  • Method response status code: 204
  • Choose: Create
  1. Choose Test at POST in /{id}
  • id: 1
  • Request body: Test case
  • Check the new status for POST Method
  1. Choose /{id}
  • Choose Enable CORS
  1. At CORS interface
  • Choose GET
  • Choose POST
  • Choose Save