From 8e3cab9b104b919251d0eb61bc84bd61a693bdf9 Mon Sep 17 00:00:00 2001 From: caadiq Date: Sun, 11 Jan 2026 21:56:35 +0900 Subject: [PATCH] =?UTF-8?q?feat(Category):=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EB=B3=B4=ED=98=B8=20?= =?UTF-8?q?=EB=B0=8F=20ID=20=EC=9E=AC=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - is_default 컬럼 추가 (기존 6개 카테고리 = 기본) - 카테고리 ID 재정렬: 기타(1), 유튜브(2), X(3), 앨범(4), 팬사인회(5), 콘서트(6) - 일정 테이블 category_id 동기화 - 기본 카테고리 삭제 불가 (백엔드 + 프론트엔드) - 일정 사용 중인 카테고리 삭제 불가 --- backend/routes/admin.js | 19 ++++++++++++++++- .../pages/pc/admin/AdminScheduleCategory.jsx | 21 +++++++++++++------ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/backend/routes/admin.js b/backend/routes/admin.js index cb3cba6..c9b4169 100644 --- a/backend/routes/admin.js +++ b/backend/routes/admin.js @@ -1103,7 +1103,24 @@ router.delete( return res.status(404).json({ error: "카테고리를 찾을 수 없습니다." }); } - // TODO: 해당 카테고리를 사용하는 일정이 있는지 확인 + // 기본 카테고리는 삭제 불가 + if (existing[0].is_default === 1) { + return res + .status(400) + .json({ error: "기본 카테고리는 삭제할 수 없습니다." }); + } + + // 해당 카테고리를 사용하는 일정이 있는지 확인 + const [usedSchedules] = await pool.query( + "SELECT COUNT(*) as count FROM schedules WHERE category_id = ?", + [id] + ); + if (usedSchedules[0].count > 0) { + return res.status(400).json({ + error: `해당 카테고리를 사용하는 일정이 ${usedSchedules[0].count}개 있어 삭제할 수 없습니다.`, + }); + } + await pool.query("DELETE FROM schedule_categories WHERE id = ?", [id]); res.json({ message: "카테고리가 삭제되었습니다." }); diff --git a/frontend/src/pages/pc/admin/AdminScheduleCategory.jsx b/frontend/src/pages/pc/admin/AdminScheduleCategory.jsx index ded9802..8f97904 100644 --- a/frontend/src/pages/pc/admin/AdminScheduleCategory.jsx +++ b/frontend/src/pages/pc/admin/AdminScheduleCategory.jsx @@ -266,12 +266,21 @@ function AdminScheduleCategory() { > - + {category.is_default ? ( + + + + ) : ( + + )} ))}