마이그레이션 되돌리기 + 키오스크 개발

김민준·2023년 8월 3일
0

이어짐

아직 덜 만든 테이블은 마이그레이션 하지말자
괜히 더 복잡해진다.

뭔가 잘못 됐을 때는...

npx sequelize-cli db:migrate:undo:all
모든 마이그레이션 되돌리기 = 테이블 삭제
주의) 이전 마이그레이션이 모두 있어야한다.

npx sequelize-cli migration:generate --name <마이그레이션 명>
새로운 마이그레이션을 만든다.

npx sequelize-cli db:migrate
DB를 마이그레이션대로 최신 업데이트한다.

만들어야 할 기능 설명
1. 발주 넣기 : 특정 물품의 갯수를 추가하기 위한 1차 작업
2. 발주상태 수정 : 발주는 기본적으로 Ordered(주문 됨)이며 Pending(보류중)으로 바꿀 수 도 있다.
Ordered, Pending 상태에서는 Canceled(취소 됨) 나 Completed(완료 됨)로 바꿀 수 있다.
3. Completed 에서 다른 상태로 바꾸려면, 발주한 양보다 많은 재고가 있어야한다.

발주 넣기
물량이 딸릴 경우 보충하는 과정중 하나이다.

itemOrderService = async (orderItemID, amount) => {
class ItemOrderServices {
  ItemOrderRepositories = new ItemOrderRepositories();

  itemOrderService = async (orderItemID, amount) => {
    try {
      // 상품명은 DB를 봐야 알 수있지만, 수량은 미입력은 당장 가능하므로,
      // 수량 체크를 먼저한다.
      if (!amount) {
        return {
          status: 400,
          message: "발주량을 입력하세요.",
        };
      }
      const isExist = await this.ItemOrderRepositories.getItemById(orderItemID);
      if (!isExist) {
        return {
          status: 400,
          message: "상품의 이름을 확인해 주세요.",
        };
      }
      const state = "ORDERED";
      console.log("state :", typeof state, state);
      await this.ItemOrderRepositories.registerOrder(
        orderItemID,
        amount,
        state
      );
      return { status: 200, message: "발주가 완료되었습니다." };
    } catch (err) {
      return { status: 400, message: err.message };
    }
  };
}
class ItemOrderRepositories {
  getItemById = async (orderItemID) => {
    const isExist = await Item.findOne({
      where: {
        id: orderItemID,
      },
      attributes: { exclude: ["itemOrderCustomerId"] },
    });
    // console.log(isExist, orderItemID);
    return isExist;
  };

  registerOrder = async (orderItemID, amount, state) => {
    console.log("amount :", typeof amount, amount);
    const addOrder = await Order_item.create({
      item_id: orderItemID,
      amount,
      state,
    });
    return addOrder;
  };
}

Service 레이어에서 getItemById 요청을 먼저하고, 그 뒤에 isExist가 존재할경우(= 상품이 등록 된 경우)에는 registerOrder에 요청을 보낸다.
즉, itemOrderService에서 Repository 레이어를 두번 참조할 수 있는 것이다.

발주상태수정

itemOrderUpdate_Service = async (orderID, status) => {
    try {
      if (
        status !== "ORDERED" &&
        status !== "PENDING" &&
        status !== "COMPLETED" &&
        status !== "CANCELED"
      ) {
        return {
          status: 400,
          message:
            "적절한 발주 상태를 입력해주세요. (ORDERED, PENDING, COMPLETED, CANCELED)",
        };
      }

      const statusNow = await this.ItemOrderRepositories.getStatusById(
        orderID,
        status
      );
      if (statusNow.state === status) {
        return {
          status: 400,
          message: "발주를 같은 상태로 바꿀 수 없습니다.",
        };
      } else if (statusNow.state === "COMPLETED") {
        console.log("컴플상태");
        const itemAmount = await this.ItemOrderRepositories.getItemById(
          statusNow.item_id
        );
        console.log(itemAmount.amount, statusNow.amount);
        if (itemAmount.amount < statusNow.amount) {
          return {
            status: 400,
            message: "재고가 부족하여 반송할 수 없습니다.",
          };
        }
      }
      await this.ItemOrderRepositories.patchStatusById(orderID, status);
      return { status: 200, message: "발주 수정이 완료되었습니다." };
    } catch (err) {
      return { status: 400, message: err.message };
    }
  };

서비스 레이어가 점점 복잡해지는 것같다...

트랜잭션은 여러가지로 시도했는데 sequelize에서 불러오는데 실패해서 그만두었다.

profile
node 개발자

0개의 댓글

관련 채용 정보