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:
2025-12-27 23:12:04 +09:00
parent 5bd09096dd
commit a84fc9ab77
4 changed files with 75 additions and 68 deletions

View File

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