마지막으로 사용자가 특정 노트를 삭제할 수 있도록 API를 만들어 보겠습니다.

함수 추가하기

delete.js 파일을 생성하고 아래 코드를 붙여 넣기 합니다.

import * as dynamoDbLib from "./libs/dynamodb-lib";
import { success, failure } from "./libs/response-lib";

export async function main(event, context) {
  const params = {
    TableName: "notes",
    // 'Key' 삭제할 아이템의 파티션 키와 정렬 키를 정의합니다.
    // - 'userId': 인증 사용자의 Cognito Identity Pool 인증 ID 
    // - 'noteId': 경로 파라미터
    Key: {
      userId: event.requestContext.identity.cognitoIdentityId,
      noteId: event.pathParameters.id
    }
  };

  try {
    const result = await dynamoDbLib.call("delete", params);
    return success({ status: true });
  } catch (e) {
    return failure({ status: false });
  }
}

이 파일은 삭제할 노트의 userIdnoteId 값을 이용해 DynamoDB에 delete를 호출합니다.

API 엔드포인트 구성하기

serverless.yml 파일을 열어서 아래 내용을 추가합니다.

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

이것은 DELETE 요청 핸들러 함수를 /notes/{id} 엔드포인트에 추가합니다.

테스트

mocks/delete-event.json 파일을 만들고 아래 내용을 붙여 넣기 합니다.

역시 이전과 같이 pathParameters 블록에 id 값은 noteId 값으로 대체합니다.

{
  "pathParameters": {
    "id": "578eb840-f70f-11e6-9d1a-1359b3b22944"
  },
  "requestContext": {
    "identity": {
      "cognitoIdentityId": "USER-SUB-1234"
    }
  }
}

루트 디렉토리에서 새로 추가한 함수를 실행합니다.

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

반환된 응답은 아래와 유사해야합니다.

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

마침내 API들이 완성되었습니다. 그리고 이제 배포 준비가 거의 완료되었습니다.