From b1621a7147db986648c2600072dc76f01cc7d8a2 Mon Sep 17 00:00:00 2001 From: kent Date: Sat, 27 Dec 2025 22:32:00 +0900 Subject: [PATCH] =?UTF-8?q?fix(board-menu):=20=EA=B2=8C=EC=8B=9C=ED=8C=90?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C/=EB=B3=B5=EC=9B=90=20=EC=8B=9C=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=20=EC=97=B0=EB=8F=99=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BoardController: *Board() → *AnyBoard() 메서드로 변경하여 메뉴 연동 활성화 - MenuService: restoreMenuForBoard() 메서드 추가 - soft-deleted 메뉴 있으면 복원 - 활성 메뉴가 이미 있으면 스킵 (중복 방지) - 둘 다 없으면 새로 생성 - BoardService: restoreAnyBoard()에서 board name 전달하도록 수정 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../Controllers/Api/Admin/BoardController.php | 12 +-- .../Controllers/Api/Admin/MenuController.php | 2 +- app/Services/BoardService.php | 14 +-- app/Services/MenuService.php | 90 +++++++++++++++++++ 4 files changed, 104 insertions(+), 14 deletions(-) diff --git a/app/Http/Controllers/Api/Admin/BoardController.php b/app/Http/Controllers/Api/Admin/BoardController.php index 1b916bb1..83e02210 100644 --- a/app/Http/Controllers/Api/Admin/BoardController.php +++ b/app/Http/Controllers/Api/Admin/BoardController.php @@ -143,11 +143,11 @@ public function update(Request $request, int $id): JsonResponse } /** - * 게시판 삭제 (Soft Delete) + * 게시판 삭제 (Soft Delete) - 연결된 메뉴도 함께 삭제 */ public function destroy(int $id): JsonResponse { - $this->boardService->deleteBoard($id); + $this->boardService->deleteAnyBoard($id); return response()->json([ 'success' => true, @@ -156,11 +156,11 @@ public function destroy(int $id): JsonResponse } /** - * 게시판 복원 + * 게시판 복원 - 연결된 메뉴도 함께 복원 */ public function restore(int $id): JsonResponse { - $this->boardService->restoreBoard($id); + $this->boardService->restoreAnyBoard($id); return response()->json([ 'success' => true, @@ -169,11 +169,11 @@ public function restore(int $id): JsonResponse } /** - * 게시판 영구 삭제 + * 게시판 영구 삭제 - 연결된 메뉴도 함께 영구 삭제 */ public function forceDestroy(int $id): JsonResponse { - $this->boardService->forceDeleteBoard($id); + $this->boardService->forceDeleteAnyBoard($id); return response()->json([ 'success' => true, diff --git a/app/Http/Controllers/Api/Admin/MenuController.php b/app/Http/Controllers/Api/Admin/MenuController.php index 9d207b43..9206ff70 100644 --- a/app/Http/Controllers/Api/Admin/MenuController.php +++ b/app/Http/Controllers/Api/Admin/MenuController.php @@ -36,7 +36,7 @@ public function index(Request $request): JsonResponse|\Illuminate\Http\Response // HTMX 요청인 경우 HTML 직접 반환 if ($request->header('HX-Request')) { - return view('menus.partials.table', compact('menus', 'importMode')); + return response(view('menus.partials.table', compact('menus', 'importMode'))); } // 일반 API 요청인 경우 JSON 반환 diff --git a/app/Services/BoardService.php b/app/Services/BoardService.php index 3da100e2..f18d187b 100644 --- a/app/Services/BoardService.php +++ b/app/Services/BoardService.php @@ -531,14 +531,14 @@ public function restoreAnyBoard(int $id): bool // 게시판 복원 $result = $board->restore(); - // 메뉴가 없으면 다시 생성 + // 연결된 메뉴도 복원 (없으면 생성) if ($result) { - $this->menuService->createMenuForBoard([ - 'board_code' => $board->board_code, - 'name' => $board->name, - 'is_system' => $board->is_system, - 'tenant_id' => $board->tenant_id, - ]); + $this->menuService->restoreMenuForBoard( + $board->board_code, + $board->name, + $board->is_system, + $board->tenant_id + ); } return $result; diff --git a/app/Services/MenuService.php b/app/Services/MenuService.php index bec6ae50..809db3c9 100644 --- a/app/Services/MenuService.php +++ b/app/Services/MenuService.php @@ -1340,4 +1340,94 @@ public function deleteMenuForBoard(string $boardCode, bool $isSystem, ?int $tena return false; } + + /** + * 게시판 복원 시 연결된 메뉴도 복원 + * - soft-deleted 메뉴가 있으면 복원 + * - 활성 메뉴가 이미 있으면 아무것도 안함 + * - 둘 다 없으면 새로 생성 + * + * @param string $boardCode 게시판 코드 + * @param string $boardName 게시판 이름 (메뉴 생성 시 필요) + * @param bool $isSystem 시스템 게시판 여부 + * @param int|null $tenantId 테넌트 ID + */ + public function restoreMenuForBoard(string $boardCode, string $boardName, bool $isSystem, ?int $tenantId = null): bool + { + if ($isSystem) { + $url = '/customer-center/'.$boardCode; + + // 1. soft-deleted 메뉴 확인 + $trashedMenu = GlobalMenu::onlyTrashed()->where('url', $url)->first(); + if ($trashedMenu) { + $restored = $trashedMenu->restore(); + if ($restored) { + $trashedMenu->deleted_by = null; + $trashedMenu->save(); + } + + return $restored; + } + + // 2. 활성 메뉴가 이미 있는지 확인 + $activeMenu = GlobalMenu::where('url', $url)->first(); + if ($activeMenu) { + return true; // 이미 존재, 아무것도 안함 + } + + // 3. 둘 다 없으면 새로 생성 + $created = $this->createMenuForBoard([ + 'board_code' => $boardCode, + 'name' => $boardName, + 'is_system' => true, + 'tenant_id' => null, + ]); + + return $created !== null; + } else { + $url = '/boards/'.$boardCode; + + // 1. soft-deleted 메뉴 확인 + $trashedQuery = Menu::onlyTrashed()->where('url', $url); + if ($tenantId) { + $trashedQuery->where('tenant_id', $tenantId); + } else { + $trashedQuery->whereNull('tenant_id'); + } + $trashedMenu = $trashedQuery->first(); + + if ($trashedMenu) { + $restored = $trashedMenu->restore(); + if ($restored) { + $trashedMenu->deleted_by = null; + $trashedMenu->save(); + } + + return $restored; + } + + // 2. 활성 메뉴가 이미 있는지 확인 + $activeQuery = Menu::where('url', $url); + if ($tenantId) { + $activeQuery->where('tenant_id', $tenantId); + } else { + $activeQuery->whereNull('tenant_id'); + } + $activeMenu = $activeQuery->first(); + + if ($activeMenu) { + return true; // 이미 존재, 아무것도 안함 + } + + // 3. 둘 다 없으면 새로 생성 + $created = $this->createMenuForBoard([ + 'board_code' => $boardCode, + 'name' => $boardName, + 'is_system' => false, + 'tenant_id' => $tenantId, + ]); + + return $created !== null; + } + } }