From 5d96ff871d5b7f07d0843d72c6059d8a9d30cf5a Mon Sep 17 00:00:00 2001 From: kent Date: Sun, 28 Dec 2025 00:17:53 +0900 Subject: [PATCH] =?UTF-8?q?feat(board):=20=EA=B2=8C=EC=8B=9C=ED=8C=90=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=8B=9C=20=EB=A9=94=EB=89=B4=20URL/?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=9E=90=EB=8F=99=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MenuService::updateMenuForBoard() 메서드 추가 - 시스템 게시판: global_menus + 연결된 모든 menus URL 업데이트 - 테넌트 게시판: 해당 테넌트의 menus만 URL 업데이트 - BoardService::updateAnyBoard()에서 board_code/name 변경 감지 시 호출 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- app/Services/BoardService.php | 35 ++++++++++++++++++++--- app/Services/MenuService.php | 54 +++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 4 deletions(-) diff --git a/app/Services/BoardService.php b/app/Services/BoardService.php index 8e9441a4..c04d940c 100644 --- a/app/Services/BoardService.php +++ b/app/Services/BoardService.php @@ -406,10 +406,17 @@ public function getAllBoards(array $filters = [], int $perPage = 15): LengthAwar ->withCount('fields') ->withTrashed(); - // 테넌트 필터: 선택 없으면 시스템만, 선택하면 해당 테넌트만 - if (! empty($filters['tenant_id'])) { - $query->where('tenant_id', $filters['tenant_id']); + // 헤더에서 선택한 테넌트 기준: 시스템 게시판 + 해당 테넌트 게시판 + $selectedTenantId = session('selected_tenant_id'); + + if ($selectedTenantId && $selectedTenantId !== 'all') { + // 시스템 게시판 + 선택된 테넌트 게시판 + $query->where(function ($q) use ($selectedTenantId) { + $q->where('is_system', true) + ->orWhere('tenant_id', $selectedTenantId); + }); } else { + // 전체 보기: 시스템 게시판만 (테넌트 게시판은 테넌트 선택 후 표시) $query->where('is_system', true); } @@ -499,12 +506,32 @@ public function updateAnyBoard(int $id, array $data): bool { $board = Board::findOrFail($id); + // 기존 값 저장 (메뉴 업데이트용) + $oldCode = $board->board_code; + $oldName = $board->name; + $data['updated_by'] = auth()->id(); // tenant_id 변경 방지 (시스템 ↔ 테넌트 전환 불가) unset($data['tenant_id'], $data['is_system']); - return $board->update($data); + $result = $board->update($data); + + // board_code 또는 name 변경 시 메뉴도 업데이트 + $newCode = $data['board_code'] ?? $oldCode; + $newName = $data['name'] ?? $oldName; + + if ($oldCode !== $newCode || $oldName !== $newName) { + $this->menuService->updateMenuForBoard( + $oldCode, + $newCode, + $newName, + $board->is_system, + $board->tenant_id + ); + } + + return $result; } /** diff --git a/app/Services/MenuService.php b/app/Services/MenuService.php index 83c07142..a842259f 100644 --- a/app/Services/MenuService.php +++ b/app/Services/MenuService.php @@ -1498,4 +1498,58 @@ public function restoreMenuForBoard(string $boardCode, string $boardName, bool $ return $created !== null; } } + + /** + * 게시판 코드 변경 시 연결된 메뉴 URL도 업데이트 + * + * @param string $oldCode 기존 게시판 코드 + * @param string $newCode 새 게시판 코드 + * @param string $newName 새 게시판 이름 + * @param bool $isSystem 시스템 게시판 여부 + * @param int|null $tenantId 테넌트 ID (테넌트 게시판인 경우) + */ + public function updateMenuForBoard(string $oldCode, string $newCode, string $newName, bool $isSystem, ?int $tenantId = null): bool + { + if ($isSystem) { + // 시스템 게시판: global_menus + 연결된 모든 menus 업데이트 + $oldUrl = '/customer-center/'.$oldCode; + $newUrl = '/customer-center/'.$newCode; + + // 1. GlobalMenu 업데이트 + $globalMenu = GlobalMenu::where('url', $oldUrl)->first(); + if ($globalMenu) { + $globalMenu->update([ + 'url' => $newUrl, + 'name' => $newName, + ]); + + // 2. 해당 global_menu_id를 참조하는 모든 menus 업데이트 + Menu::where('global_menu_id', $globalMenu->id) + ->update([ + 'url' => $newUrl, + 'name' => $newName, + ]); + } + + return true; + } else { + // 테넌트 게시판: 해당 테넌트의 menus만 업데이트 + $oldUrl = '/boards/'.$oldCode; + $newUrl = '/boards/'.$newCode; + + $query = Menu::where('url', $oldUrl); + if ($tenantId) { + $query->where('tenant_id', $tenantId); + } else { + $query->whereNull('tenant_id'); + } + + $query->update([ + 'url' => $newUrl, + 'name' => $newName, + ]); + + return true; + } + } }