아직 덜 만든 테이블은 마이그레이션 하지말자
괜히 더 복잡해진다.
뭔가 잘못 됐을 때는...
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에서 불러오는데 실패해서 그만두었다.