카테고리 없음

12주차 (2)

jaeoun0238 2025. 1. 14. 23:59

메뉴 생성

메뉴 조회

메뉴 수정

 

메뉴 삭제

메뉴 부분 무사히 완료!

menu.router.js

import Menucontrolleruser from '../../controllers/user/user.restaurants.controller.js';
import Menucontrollerpartner from '../../controllers/partner/menu.controller.js';
import express from 'express';
// Express Router 설정
const menuRouter = express.Router();

// 메뉴 생성
menuRouter.post('/', Menucontrollerpartner.createMenu);
// 유저와 업주 둘다 사용가능한 메뉴조회
menuRouter.get('/:restaurantId', Menucontrollerpartner.getRestaurantMenus);
// 메뉴 수정
menuRouter.patch('/:menuId', Menucontrollerpartner.updateMenu);
// 메뉴 삭제
menuRouter.delete('/:menuId', Menucontrollerpartner.deleteMenu);

export default menuRouter;

menu.repository.js

import { prisma } from '../../utils/prisma/index.js';

class Menurepository {
  #orm;
  constructor(prisma) {
    this.#orm = prisma;
  }
  // 메뉴 등록(사장님용)
  createMenu = async ({ name, price, spicyLevel, restaurantId }) => {
    const menu = await this.#orm.menu.create({
      data: {
        name,
        price: Number(price),
        spicyLevel: Number(spicyLevel),
        restaurantId: Number(restaurantId),
      },
    });
    return menu;
  };
  // 메뉴 목록 조회(소비자/사장님 공용)
  restaurantIdMenu = async ({ restaurantId }) => {
    const restaurantIdMenu = await this.#orm.menu.findMany({
      where: {
        restaurantId: { equals: Number(restaurantId) },
      },
    });
    return restaurantIdMenu;
  };

  // 메뉴 수정(사장님용)
  updateMenu = async ({ menuId, data }) => {
    const updateMenu = await this.#orm.menu.update({
      where: {
        id: Number(menuId),
      },
      data: {
        name: data.name,
        price: Number(data.price),
        spicyLevel: Number(data.spicyLevel),
        restaurantId: Number(data.restaurantId),
      },
    });
    return updateMenu;
  };
  // 메뉴 삭제(사장님용)
  deleteMenu = async ({ menuId }) => {
    console.log('메뉴아이디', menuId);
    const deleteMenu = await this.#orm.menu.delete({
      where: {
        id: Number(menuId),
      },
    });
    return deleteMenu;
  };
}
export default new Menurepository(prisma);

menu.service.js

import menuRepository from '../../repositories/partner/menu.repository.js';

class Menuservice {
  #repository;

  constructor(menuRepository) {
    this.#repository = menuRepository;
  }
  createMenu = async ({ name, price, spicyLevel, restaurantId }) => {
    if (!name || price === undefined || restaurantId === undefined) {
      throw new Error('메뉴 이름, 가격, 레스토랑 ID는 필수입니다.');
    }
    const menu = this.#repository.createMenu({
      name,
      price: +price,
      spicyLevel: +spicyLevel,
      restaurantId: +restaurantId,
    });
    return menu;
  };
  // 메뉴 목록 조회(소비자/사장님 공용)
  restaurantIdMenu = async ({ restaurantId }) => {
    const menus = this.#repository.restaurantIdMenu({
      restaurantId: +restaurantId,
    });
    return menus;
  };
  updateMenu = async ({ menuId, data }) => {
    const menu = this.#repository.updateMenu({
      menuId: +menuId,
      data,
    });
    return menu;
  };

  deleteMenu = async ({ menuId }) => {
    const menu = this.#repository.deleteMenu({
      menuId: +menuId,
    });
    return menu;
  };
}

export default new Menuservice(menuRepository);

menu.controller.js

import menuService from '../../services/partner/menu.service.js';
class Menucontrollerpartner {
  #service;

  constructor(menuService) {
    this.#service = menuService;
  }

  // 메뉴 등록(사장님용)
  createMenu = async (req, res) => {
    try {
      const menu = await this.#service.createMenu(req.body);
      res.status(201).json(menu);
    } catch (error) {
      console.error(error.message);
      res.status(400).send('메뉴 등록 중 오류가 발생했습니다.');
    }
  };

  // 메뉴 목록 조회(소비자/사장님 공용)
  getRestaurantMenus = async (req, res) => {
    try {
      // console.log(req.params);
      const menus = await this.#service.restaurantIdMenu({ restaurantId: req.params.restaurantId });
      res.status(200).json(menus);
    } catch (error) {
      console.error(error.message);
      res.status(400).send('메뉴 목록 조회 중 오류가 발생했습니다.');
    }
  };

  // 메뉴 수정(사장님용)
  updateMenu = async (req, res) => {
    try {
      const updatedMenu = await this.#service.updateMenu({
        menuId: req.params.menuId,
        data: req.body,
      });
      res.status(200).json(updatedMenu);
    } catch (error) {
      console.error(error.message);
      res.status(400).send('메뉴 수정 중 오류가 발생했습니다.');
    }
  };

  // 메뉴 삭제(사장님용)
  deleteMenu = async (req, res) => {
    try {
      await this.#service.deleteMenu({ menuId: req.params.menuId });
      res.status(200).send(`메뉴 ${req.params.menuId}가 삭제되었습니다.`);
    } catch (error) {
      console.error(error.message);
      res.status(400).send('메뉴 삭제 중 오류가 발생했습니다.');
    }
  };
}

export default new Menucontrollerpartner(menuService);

일단 코드는 작성 완료했는데 검증 부분을 좀 더 채워 넣어야 할 것 같아서 수정해 보는 걸로 진행될 것 같습니다.

createMenu = async ({ name, price, spicyLevel, restaurantId }) => {
    const menu = await this.#orm.menu.create({
      data: {
        name,
        price: Number(price),
        spicyLevel: Number(spicyLevel),
        restaurantId: Number(restaurantId),
      },
    });
    return menu;
  };

 

메뉴가 담고있는 객체를 data가 받아온다는 것 기본적인 구조를 잘 이해하지 못해서 메뉴 수정 부분에서 어려움이 있었던 것.. 너무 아쉽고 왜 못 봤을까 싶었습니다..

updateMenu = async ({ menuId, data }) => {
    const updateMenu = await this.#orm.menu.update({
      where: {
        id: Number(menuId),
      },
      data: {
        name: data.name,
        price: Number(data.price),
        spicyLevel: Number(data.spicyLevel),
        restaurantId: Number(data.restaurantId),
      },
    });
    return updateMenu;
  };

 

잘 수정해서 number로 int로 잘 받아오도록 수정을 완료했고 data를 가져올때 바로 가져오는 것이 아닌 data.name 등등으로 받아온다는 것도 명심해 보도록 하겠습니다.