Skip to content

eojjeoda-nest/nest-reservation-6

Repository files navigation

미션 - 식당 예약 API 구현 미션

🍽 이번 미션은 제출기한이 2주인 미션입니다. 2주 동안 화이팅!

🎯 서버 세팅 방식

  • setup.sh 스크립트를 실행하여 서버를 세팅한다.
  • setup.sh 스크립트는 다음과 같은 작업을 수행한다.
    • orm typeorm, prisma, 패키지 매니저 npm, yarn, pnpm 선택
    • npm install | yarn | pnpm install 실행
./setup.sh

🔍 진행 방식

  • 미션은 기능 요구 사항, 프로그래밍 요구 사항, 과제 진행 요구 사항 세 가지로 구성되어 있다.
  • 세 개의 요구 사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다.
  • 기능 요구 사항에 기재되지 않은 내용은 스스로 판단하여 구현한다.

📮 미션 제출 방법

  • 미션 구현을 완료한 후 GitHub PR 요청을 통해 제출합니다.

테스트 실행 가이드

  • 터미널에서 npm run test 명령을 실행하여 모든 테스트가 아래와 같이 통과하는지 확인한다.
Ran all test suites.

🚀 기능 요구 사항

식당 예약 시스템을 구현한다.

총 7개의 API 엔드포인트로 구성한다.

  • 식당 목록 조회
  • 식당 상세 조회
  • 식당 생성
  • 식당 예약 가능 시간 추가
  • 식당 예약가능 시간 조회
  • 식당 예약하기
  • 내 예약 기록 조회

각 API의 기능 요구 사항은 다음과 같다.

  • 식당은 다음과 같이 구성된다.

    • 이름
    • 설명
    • 카테고리
    • 주소
    • 전화번호
    • 로고 이미지
    • 예약가능 시간 리스트
    • 이미지 리스트(옵션)
    • 메뉴 리스트(옵션)
  • 식당 목록 조회

    • 식당 목록은 인기순(클릭수 기반), 최신순, 이름순(ㄱ-ㅎ, A-Z)으로 정렬하여 조회할 수 있어야한다.
    • 식당 목록은 검색어를 통해 식당 이름으로 필터링하여 조회할 수 있어야한다.
    • 식당 목록은 식당 카테고리를 통해 필터링하여 조회할 수 있어야한다.
    • 식당 목록은 페이지네이션을 지원한다.
  • 식당 상세 조회

    • 식당 상세 조회 시 식당의 상세 정보를 조회할 수 있어야한다.
    • 식당 상세 조회 시 식당의 메뉴 리스트를 조회할 수 있어야한다.
  • 식당 생성

    • 식당 생성시 식당의 이름, 설명, 카테고리, 주소, 전화번호, 로고 이미지, 이미지 리스트를 입력하여 생성할 수 있어야한다.
    • 식당 생성시 식당의 이름, 설명, 카테고리, 주소, 전화번호, 로고 이미지, 이미지 리스트는 필수값이다.
    • 식당 생성시 식당의 이름은 중복될 수 없다.
    • 식당 생성시 해당 식당의 기본 관리자는 식당을 생성한 사용자가 된다.
  • 식당 예약가능 시간 추가

    • 식당 예약가능 시간 추가는 해당 식당의 관리자만 가능하다.
    • 식당 예약가능 시간 추가는 30분 단위로만 가능하다. ex) 10:00, 10:30, 11:00, 11:30
    • 식당 예약가능 시간 추가 시 식당의 예약가능 시간 리스트에 추가할 수 있어야한다.
    • 식당 예약가능 시간 추가 시 식당의 예약가능 시간 리스트에 중복된 시간이 존재할 경우 예외처리한다.
  • 식당 예약가능 시간 조회

    • 식당 예약가능 시간 조회 시 식당의 예약가능 시간 리스트를 조회할 수 있어야한다.
    • 식당 예약가능 시간 조회 시 식당의 예약가능 시간 리스트는 오늘 날짜 기준으로 오늘 이후의 예약가능 시간만조회할 수 있어야한다.
  • 식당 예약하기

    • 식당 예약하기는 로그인한 사용자만 가능하다.
    • 식당 예약하기는 식당의 예약가능 시간 리스트 중 하나를 선택하여 예약할 수 있어야한다.
    • 식당 예약하기는 예약자의 이름, 예약 인원수, 전화번호, 이메일, 요청사항을 입력하여 예약할 수 있어야한다.
  • 내 예약 기록 조회

    • 내 예약 기록을 목록 조회할 수 있어야한다.
    • 내 예약 기록 조회는 페이지네이션을 지원한다.
    • 내 예약 기록 조회 시 생성일 기준 최신순으로 정렬되어야한다.

공통 필수 예외처리 사항

  • API에 요청받은 Body 값의 타입을 검증하여 올바르지 않은 타입일 경우 400 BadRequest 에러를 리턴해야한다.
  • API에 요청받은 Body 값의 필수 값이 누락되거나/빈 값인 경우 400 BadRequest 에러를 리턴해야한다.

API 요청/응답 요구 사항

  1. 모든 API의 요청/응답은 DTO를 통해 TypeSafe하게 이루어져야한다.
  2. DTO의 타입은 class-validator를 이용하여 검증한다.
  3. DTO 내부 요소의 명칭은 camelCase로 작성한다.

요청

  1. 식당 목록 조회
    • 식당 목록 조회시 Pagination을 지원한다.
       page : 1
       limit : 10
    • 식당 목록 조회시 정렬 기준을 지정할 수 있다.
       sort : 'popular' | 'latest' | 'name'
    • 식당 목록 조회시 검색어를 통해 식당 이름으로 필터링할 수 있다.
      searchKeyword : '식당 이름'
    • 식당 목록 조회시 식당 카테고리를 통해 필터링할 수 있다.
      category : '한식' | '중식' | '일식' | '양식' | '기타'
  2. 식당 예약가능 시간 추가
    • 식당 예약가능 시간을 리스트 형태로 입력받아야한다.
        availableTimes : [
           "2024-01-10T00:10:30.000Z",
           "2024-01-10T00:11:00.000Z",
           "2024-01-10T00:11:30.000Z",
           "2024-01-10T00:12:00.000Z"
         ]
  3. 식당 예약가능 시간 조회
    • 식당 예약가능 시간 조회시 식당 ID로 조회할 수 있다.
      restarantId : 1
  4. 식당 예약하기
    • 식당 예약시 예약자의 이름, 예약 인원수, 전화번호, 이메일, 요청사항(선택)을 입력받아야한다.
       name : '어쩌다'
       numberOfPeople : 4
       phoneNumber : '010-1234-5678'
       email : '[email protected]'
       request : '창가쪽으로 예약 부탁드립니다.'

응답

  • 정상적으로 식당 목록 조회시 다음과 같은 응답을 받는다.

    {
      "data": [
        {
          "id": 1,
          "name": "식당 이름",
          "description": "식당 설명",
          "category": "식당 카테고리",
          "address": "식당 주소",
          "phoneNumber": "식당 전화번호",
          "logoImage": "식당 로고 이미지",
          "images": [
            "식당 이미지1",
            "식당 이미지2"
          ],
          "menus": [
            {
              "id": 1,
              "name": "메뉴 이름",
              "price": 10000,
              "description": "메뉴 설명",
              "image": "메뉴 이미지"
            }
          ],
          "availableTimes": [
            "2024-01-10T00:10:30.000Z",
            "2024-01-10T00:11:00.000Z",
            "2024-01-10T00:11:30.000Z",
            "2024-01-10T00:12:00.000Z"
          ],
          "createdAt": "2024-01-10T00:00:00.000Z",
          "updatedAt": "2024-01-10T00:00:00.000Z"
        }
      ],
      "meta": {
        "total": 1,
        "page": 1,
        "limit": 10
      }
    }
  • 예약 가능 시간 조회시 다음과 같은 응답을 받는다.

    {
      "data": {
        "restaurantId": 1,
        "availableTimes": {
          "2024-01-10" : [
              "2024-01-10T00:10:30.000Z",
              "2024-01-10T00:11:00.000Z",
              "2024-01-10T00:11:30.000Z",
              "2024-01-10T00:12:00.000Z"
          ],
           "2024-01-11" : [
              "2024-01-11T00:10:30.000Z",
              "2024-01-11T00:11:00.000Z",
              "2024-01-11T00:11:30.000Z",
              "2024-01-11T00:12:00.000Z"
          ]
        }
      }
    }

🎯 프로그래밍 요구 사항

  • Javascript 코드가 아닌 Typescript 코드로만 구현해야 한다.

  • Swagger를 이용하여 API 명세를 작성한다.

  • package.json에 명시된 라이브러리만을 이용하여 구현한다.

  • eslint, prettier 등의 코드 포맷팅 라이브러리를 이용하여 제공된 코드 컨벤션에 맞추어 코드를 작성한다.

  • node, npm 버전은 package.json에 명시된 버전을 사용한다. Volta를 이용하여 node 버전을 관리한다.

  • (선택 사항) API 구현이 완료되고, 유닛 테스트, E2E 테스트등 모든 테스트 코드를 작성하여 테스트를 통과하면 굿!


✏️ 과제 진행 요구 사항

  • 미션은 nest-reservation-6 저장소를 Fork & Clone 하고 시작한다.
  • 기능을 구현하기 전 README.md에 구현할 기능/예외처리를 목록으로 정리해 추가한다.

About

식당 예약 API 구현 미션

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published