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;