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:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user