fix(menu): 시스템 게시판 생성 시 GlobalMenu + Menu 둘 다 추가

- 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 <noreply@anthropic.com>
This commit is contained in:
2025-12-27 22:55:36 +09:00
parent b1621a7147
commit 9deee61976

View File

@@ -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;