From 9deee61976841ce5260fa25678f77e1d6ccac40a Mon Sep 17 00:00:00 2001 From: kent Date: Sat, 27 Dec 2025 22:55:36 +0900 Subject: [PATCH] =?UTF-8?q?fix(menu):=20=EC=8B=9C=EC=8A=A4=ED=85=9C=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EC=83=9D=EC=84=B1=20=EC=8B=9C=20?= =?UTF-8?q?GlobalMenu=20+=20Menu=20=EB=91=98=20=EB=8B=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - createMenuForBoard(): 시스템 게시판 생성 시 global_menus와 menus 테이블 모두에 추가 - deleteMenuForBoard(): 시스템 게시판 삭제 시 GlobalMenu와 Menu 둘 다 삭제 - restoreMenuForBoard(): 시스템 게시판 복원 시 GlobalMenu와 Menu 둘 다 복원 이제 시스템 게시판이 /menus/global과 /menus 페이지 모두에 표시됨 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- app/Services/MenuService.php | 143 ++++++++++++++++++++++++----------- 1 file changed, 100 insertions(+), 43 deletions(-) diff --git a/app/Services/MenuService.php b/app/Services/MenuService.php index 809db3c9..96ebce57 100644 --- a/app/Services/MenuService.php +++ b/app/Services/MenuService.php @@ -1234,28 +1234,48 @@ public function createMenuForBoard(array $boardData): GlobalMenu|Menu|null $parentId = $this->findParentMenuForBoard($isSystem, $tenantId); if ($isSystem) { - // 시스템 게시판 → global_menus에 추가 + // 시스템 게시판 → global_menus + menus 둘 다 추가 $url = '/customer-center/'.$boardCode; - // 중복 체크 - $exists = GlobalMenu::where('url', $url)->exists(); - if ($exists) { - return null; + // 1. GlobalMenu에 추가 + $globalMenu = null; + $globalExists = GlobalMenu::where('url', $url)->exists(); + if (! $globalExists) { + $maxOrder = GlobalMenu::where('parent_id', $parentId)->max('sort_order') ?? 0; + + $globalMenu = GlobalMenu::create([ + 'parent_id' => $parentId, + 'name' => $boardName, + 'url' => $url, + 'icon' => 'document-text', + 'sort_order' => $maxOrder + 1, + 'is_active' => true, + 'hidden' => false, + 'is_external' => false, + ]); } - // 정렬 순서 계산 - $maxOrder = GlobalMenu::where('parent_id', $parentId)->max('sort_order') ?? 0; + // 2. Menu에도 추가 (tenant_id = null로 시스템 메뉴) + $menuParentId = $this->findParentMenuForBoard(false, null); + $menuExists = Menu::where('url', $url)->whereNull('tenant_id')->exists(); + if (! $menuExists) { + $maxMenuOrder = Menu::where('parent_id', $menuParentId)->whereNull('tenant_id')->max('sort_order') ?? 0; - return GlobalMenu::create([ - 'parent_id' => $parentId, - 'name' => $boardName, - 'url' => $url, - 'icon' => 'document-text', // 기본 아이콘 - 'sort_order' => $maxOrder + 1, - 'is_active' => true, - 'hidden' => false, - 'is_external' => false, - ]); + Menu::create([ + 'tenant_id' => null, + 'parent_id' => $menuParentId, + 'name' => $boardName, + 'url' => $url, + 'icon' => 'document-text', + 'sort_order' => $maxMenuOrder + 1, + 'is_active' => true, + 'hidden' => false, + 'is_external' => false, + 'created_by' => auth()->id(), + ]); + } + + return $globalMenu; } else { // 테넌트 게시판 → menus에 추가 $url = '/boards/'.$boardCode; @@ -1307,13 +1327,30 @@ public function deleteMenuForBoard(string $boardCode, bool $isSystem, ?int $tena { if ($isSystem) { $url = '/customer-center/'.$boardCode; - $menu = $forceDelete + + // 1. GlobalMenu 삭제 + $globalMenu = $forceDelete ? GlobalMenu::withTrashed()->where('url', $url)->first() : GlobalMenu::where('url', $url)->first(); - if ($menu) { - return $forceDelete ? $menu->forceDelete() : $menu->delete(); + if ($globalMenu) { + $forceDelete ? $globalMenu->forceDelete() : $globalMenu->delete(); } + + // 2. Menu도 삭제 (tenant_id = null인 시스템 메뉴) + $menu = $forceDelete + ? Menu::withTrashed()->where('url', $url)->whereNull('tenant_id')->first() + : Menu::where('url', $url)->whereNull('tenant_id')->first(); + + if ($menu) { + if (! $forceDelete) { + $menu->deleted_by = auth()->id(); + $menu->save(); + } + $forceDelete ? $menu->forceDelete() : $menu->delete(); + } + + return true; } else { $url = '/boards/'.$boardCode; $query = $forceDelete @@ -1357,33 +1394,53 @@ public function restoreMenuForBoard(string $boardCode, string $boardName, 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; + // === GlobalMenu 처리 === + $globalTrashed = GlobalMenu::onlyTrashed()->where('url', $url)->first(); + if ($globalTrashed) { + $globalTrashed->restore(); + $globalTrashed->deleted_by = null; + $globalTrashed->save(); + } elseif (! GlobalMenu::where('url', $url)->exists()) { + // 없으면 생성 + $parentId = $this->findParentMenuForBoard(true, null); + $maxOrder = GlobalMenu::where('parent_id', $parentId)->max('sort_order') ?? 0; + GlobalMenu::create([ + 'parent_id' => $parentId, + 'name' => $boardName, + 'url' => $url, + 'icon' => 'document-text', + 'sort_order' => $maxOrder + 1, + 'is_active' => true, + 'hidden' => false, + 'is_external' => false, + ]); } - // 2. 활성 메뉴가 이미 있는지 확인 - $activeMenu = GlobalMenu::where('url', $url)->first(); - if ($activeMenu) { - return true; // 이미 존재, 아무것도 안함 + // === Menu 처리 (tenant_id = null) === + $menuTrashed = Menu::onlyTrashed()->where('url', $url)->whereNull('tenant_id')->first(); + if ($menuTrashed) { + $menuTrashed->restore(); + $menuTrashed->deleted_by = null; + $menuTrashed->save(); + } elseif (! Menu::where('url', $url)->whereNull('tenant_id')->exists()) { + // 없으면 생성 + $menuParentId = $this->findParentMenuForBoard(false, null); + $maxMenuOrder = Menu::where('parent_id', $menuParentId)->whereNull('tenant_id')->max('sort_order') ?? 0; + Menu::create([ + 'tenant_id' => null, + 'parent_id' => $menuParentId, + 'name' => $boardName, + 'url' => $url, + 'icon' => 'document-text', + 'sort_order' => $maxMenuOrder + 1, + 'is_active' => true, + 'hidden' => false, + 'is_external' => false, + 'created_by' => auth()->id(), + ]); } - // 3. 둘 다 없으면 새로 생성 - $created = $this->createMenuForBoard([ - 'board_code' => $boardCode, - 'name' => $boardName, - 'is_system' => true, - 'tenant_id' => null, - ]); - - return $created !== null; + return true; } else { $url = '/boards/'.$boardCode;