feat(board-menu): 시스템 게시판 메뉴를 모든 테넌트에 자동 생성/삭제/복원
- createMenuForBoard(): 시스템 게시판 생성 시 GlobalMenu + 모든 활성 테넌트의 Menu에 추가 - deleteMenuForBoard(): 시스템 게시판 삭제 시 GlobalMenu + 모든 테넌트의 Menu 삭제 - restoreMenuForBoard(): 시스템 게시판 복원 시 GlobalMenu + 모든 테넌트의 Menu 복원/생성 - /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,7 +1234,7 @@ public function createMenuForBoard(array $boardData): GlobalMenu|Menu|null
|
||||
$parentId = $this->findParentMenuForBoard($isSystem, $tenantId);
|
||||
|
||||
if ($isSystem) {
|
||||
// 시스템 게시판 → global_menus + menus 둘 다 추가
|
||||
// 시스템 게시판 → global_menus + 모든 테넌트 menus에 추가
|
||||
$url = '/customer-center/'.$boardCode;
|
||||
|
||||
// 1. GlobalMenu에 추가
|
||||
@@ -1255,24 +1255,29 @@ public function createMenuForBoard(array $boardData): GlobalMenu|Menu|null
|
||||
]);
|
||||
}
|
||||
|
||||
// 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;
|
||||
// 2. 모든 테넌트의 Menu에 추가
|
||||
$tenants = Tenant::where('is_active', true)->get();
|
||||
foreach ($tenants as $tenant) {
|
||||
$menuParentId = $this->findParentMenuForBoard(false, $tenant->id);
|
||||
$menuExists = Menu::where('url', $url)->where('tenant_id', $tenant->id)->exists();
|
||||
if (! $menuExists) {
|
||||
$maxMenuOrder = Menu::where('parent_id', $menuParentId)
|
||||
->where('tenant_id', $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(),
|
||||
]);
|
||||
Menu::create([
|
||||
'tenant_id' => $tenant->id,
|
||||
'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;
|
||||
@@ -1337,12 +1342,13 @@ public function deleteMenuForBoard(string $boardCode, bool $isSystem, ?int $tena
|
||||
$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();
|
||||
// 2. 모든 테넌트의 Menu 삭제
|
||||
$menusQuery = $forceDelete
|
||||
? Menu::withTrashed()->where('url', $url)
|
||||
: Menu::where('url', $url);
|
||||
|
||||
if ($menu) {
|
||||
$menus = $menusQuery->get();
|
||||
foreach ($menus as $menu) {
|
||||
if (! $forceDelete) {
|
||||
$menu->deleted_by = auth()->id();
|
||||
$menu->save();
|
||||
@@ -1416,28 +1422,31 @@ public function restoreMenuForBoard(string $boardCode, string $boardName, bool $
|
||||
]);
|
||||
}
|
||||
|
||||
// === 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(),
|
||||
]);
|
||||
// === 모든 활성 테넌트의 Menu 복원/생성 ===
|
||||
$tenants = Tenant::where('is_active', true)->get();
|
||||
foreach ($tenants as $tenant) {
|
||||
$menuTrashed = Menu::onlyTrashed()->where('url', $url)->where('tenant_id', $tenant->id)->first();
|
||||
if ($menuTrashed) {
|
||||
$menuTrashed->restore();
|
||||
$menuTrashed->deleted_by = null;
|
||||
$menuTrashed->save();
|
||||
} elseif (! Menu::where('url', $url)->where('tenant_id', $tenant->id)->exists()) {
|
||||
// 없으면 생성
|
||||
$menuParentId = $this->findParentMenuForBoard(false, $tenant->id);
|
||||
$maxMenuOrder = Menu::where('parent_id', $menuParentId)->where('tenant_id', $tenant->id)->max('sort_order') ?? 0;
|
||||
Menu::create([
|
||||
'tenant_id' => $tenant->id,
|
||||
'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 true;
|
||||
|
||||
Reference in New Issue
Block a user