이제는 사용자가 ID를 사용하여 노트를 새 노트 객체로 업데이트 할 수있는 API를 작성해 보겠습니다.

함수 추가하기

update.js 파일을 새로 만들고 아래 코드 내용을 붙여 넣으세요.

import handler from "./libs/handler-lib";
import dynamoDb from "./libs/dynamodb-lib";

export const main = handler(async (event, context) => {
  const data = JSON.parse(event.body);
  const params = {
    TableName: "notes",
    // 'Key' 수정하고자 하는 아이템의 파티션 키와 정렬 키를 정의합니다.
    // - 'userId': 인증된 사용자의 Cognito Identity Pool의 인증 ID
    // - 'noteId': 경로 파라미터
    Key: {
      userId: event.requestContext.identity.cognitoIdentityId,
      noteId: event.pathParameters.id,
    },
    // 'UpdateExpression' 업데이트 될 속성을 정의합니다.
    // 'ExpressionAttributeValues' 업데이트 표현식의 값을 정의합니다.
    UpdateExpression: "SET content = :content, attachment = :attachment",
    ExpressionAttributeValues: {
      ":attachment": data.attachment || null,
      ":content": data.content || null,
    },
    // 'ReturnValues' 아이템 속성을 반환할지 여부와 방법을 지정합니다.
    // 여기서 ALL_NEW는 업데이트 후 항목의 모든 속성을 반환합니다.
    // 아래에서 '결과값'을 검사하여 다른 설정에서 작동하는 방식을 확인할 수 있습니다.
    ReturnValues: "ALL_NEW",
  };

  await dynamoDb.update(params);
  return { status: true };
});

이것은 create.js 함수와 비슷하게 보일 것입니다. 여기서 우리는 매개 변수에 새로운contentattachment 값으로 update DynamoDB를 호출합니다.

API 엔드포인트 구서하기

serverless.yml 파일을 열어서 아래 코드를 추가합니다.

update:
  # update.js의 메인 함수를 호출하는 HTTP API 엔드포인트를 정의합니다.
  # - path: url 경로는 /notes/{id} 입니다.
  # - method: PUT 요청
  handler: update.main
  events:
    - http:
        path: notes/{id}
        method: put
        cors: true
        authorizer: aws_iam

여기에서는 PUT 요청에 대한 핸들러를 /notes/{id} 엔드 포인트에 추가합니다.

테스트

mocks/update-event.json 파일을 생성하고 아래 내용을 추가합니다.

그리고 pathParameters 블록에 있는 id에 이전에 사용했던 noteId 값으로 대체하는 것을 잊지 마세요.

{
  "body": "{\"content\":\"new world\",\"attachment\":\"new.jpg\"}",
  "pathParameters": {
    "id": "578eb840-f70f-11e6-9d1a-1359b3b22944"
  },
  "requestContext": {
    "identity": {
      "cognitoIdentityId": "USER-SUB-1234"
    }
  }
}

그리고 루트 디렉토리에서 새로 만든 함수를 실행합니다.

$ serverless invoke local --function update --path mocks/update-event.json

반환되는 결과는 아래와 유사해야합니다.

{
  statusCode: 200,
  headers: {
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Credentials': true
  },
  body: '{"status":true}'
}

다음은 ID 값을 이용해 해당 노트를 삭제하는 API를 추가해 보겠습니다.