본문 바로가기
내일배움 과제/CH4-2(배달앱)

식당 조회 api 구현

by GREEN나무 2025. 1. 8.
728x90

 

기능 method URL response header response
랭킹 조회(매출별) GET /api/restaurants/ranking Content-Type: application/json 404
{"messege" : "매장 매출 정보가 존재하지 않습니다"}
500
{"messege" : "서버에 문제가 발생했습니다."}


성공 200
"랭킹 10"{
"data":{{
"id": 1,
"name": "맛있는 중국집",
"type": "중국집",
"image":"http...이미지URL..."
"address": "서울특별시 강남구 ...",
"phone_number":"070-1234-1234"
}
...9개 매장 추가
}
매장 조회(영역별) GET /api/restaurants?type=type


type 예시
city = seoul
dong = 강남
Content-Type: application/json 404
{"messege" : "선택한 매장의 정보가 존재하지 않습니다"}
500
{"messege" : "서버에 문제가 발생했습니다."}


성공 200
"data":{
"id": 1,
"name": "맛있는 중국집",
"type": "중국집",
"image":"http...이미지URL..."
"address": "서울특별시 강남구 ...",
"phone_number":"070-1234-1234"
}
매장 전체 조회 GET /api/restaurants Content-Type: application/json 404
{"messege" : "매장 정보가 존재하지 않습니다"}
500
{"messege" : "서버에 문제가 발생했습니다."}
성공 200
"data":{
"id": 1,
"name": "맛있는 중국집",
"type": "중국집",
"image":"http...이미지URL...”
"address": "서울특별시 강남구 ...",
"phone_number":"070-1234-1234"
}
매장검색 GET /api/restaurants?search=“맛있는 Content-Type: application/json 404
{"messege" : "일치하는 매장이 존재하지 않습니다"}
500
{"messege" : "서버에 문제가 발생했습니다."}
성공 200
"data":{
"id": 1,
"name": "맛있는 중국집",
"type": "중국집",
"image":"http...이미지URL...”
"address": "서울특별시 강남구 ...",
"phone_number":"070-1234-1234"
}
매장 상세조회 GET /api/restaurants/:id Content-Type: application/json 404
{"messege" : "일치하는 매장이 존재하지 않습니다"}
500
{"messege" : "서버에 문제가 발생했습니다."}
성공 200
"data":{
"id": 1,
"name": "맛있는 중국집",
"type": "중국집",
"image":"http...이미지URL...”
"address": "서울특별시 강남구 ...",
"phone_number":"070-1234-1234", "menu":{"1번매뉴","2번매뉴","3번매뉴"}
}

 

prisma 에서 부분 일치하는 값으로 where조건 사용하기

where: {
        menu: {
          some: {
            menuName: {
              contains: nameKeyword, // 검색어
              mode: 'insensitive', // 대소문자 구분하지 않음
            },
          },
        },
      },

prisma 에서 다수의 where조건 사용하기

      where: {
        menu: {
          some: {
            OR: [
              {
                menuName: {
                  contains: menuKeyword, // 메뉴 이름에 검색어 포함
                  mode: 'insensitive', // 대소문자 구분하지 않음
                },
              },
              {
                content: {
                  contains: menuKeyword, // 메뉴 소개에 검색어 포함
                  mode: 'insensitive', // 대소문자 구분하지 않음
                },
              },
            ],
          },
        },
      },

 

url 쿼리 사용하기

const { type } = req.query; // 쿼리

 

복수 쿼리 사용

// URL 예시
// GET http://localhost:3000/api/restaurants/search?search=맛있는&type=name
// GET http://localhost:3000/api/restaurants/search?search=짜장&type=menu
// GET http://localhost:3000/api/restaurants/search?search=중국집

 

// getRestaurants.routes.js
// 매장 검색 (이름, 메뉴 포함)
// (쿼리 파라미터 타입 search(종합검색), name(상호명), menu(메뉴,설명명) 사용)
router.get('/search', GetRestaurantsController.searchRestaurants);
// getRestaurants.controller.js
// 매장검색
  searchRestaurants = async (req, res) => {
    console.log('Controller searchRestaurants');
    try {
      const { search, type } = req.query; // 쿼리 파라미터로 전달된 search, type 값

      if (!search) {
        return res.status(400).json({ message: '검색어를 입력해 주세요.' });
      }

      // 검색 타입에 따른 분기 처리
      let restaurants;
      if (type === 'name') {
        restaurants = await this.#service.searchRestaurantsByName(search);
      } else if (type === 'menu') {
        restaurants = await this.#service.searchRestaurantsByMenu(search);
      } else {
        restaurants = await this.#service.searchRestaurantsByNameMenu(search);
      }

      if (!restaurants || restaurants.length === 0) {
        return res
          .status(404)
          .json({ message: '일치하는 매장 정보가 존재하지 않습니다.' });
      }

      return res.status(200).json(restaurants);
    } catch (error) {
      console.error('Error in searchRestaurants:', error);
      return res.status(500).json({ message: '서버에 문제가 발생했습니다.' });
    }
  };

 

'내일배움 과제 > CH4-2(배달앱)' 카테고리의 다른 글

테스트 중에 막힌 것 250109  (0) 2025.01.09
6조 과제 설계  (0) 2025.01.06