From 77c49c5351ca50b3fab280e58810d3f3986393cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Wed, 18 Mar 2026 10:03:56 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[menu-sync]=20import=20=EC=8B=9C=20tenan?= =?UTF-8?q?t=5Fid=EB=A5=BC=20=EC=9A=94=EC=B2=AD=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - import() API가 세션 없이 호출되어 항상 tenant_id=1로 저장되던 버그 수정 - push()에서 현재 선택된 tenant_id를 함께 전송 - importMenu()에 tenant_id 파라미터 추가하여 재귀 호출 시에도 올바른 테넌트 유지 --- app/Http/Controllers/MenuSyncController.php | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/MenuSyncController.php b/app/Http/Controllers/MenuSyncController.php index e260f994..9abcf0ec 100644 --- a/app/Http/Controllers/MenuSyncController.php +++ b/app/Http/Controllers/MenuSyncController.php @@ -158,6 +158,7 @@ public function import(Request $request): JsonResponse } $validated = $request->validate([ + 'tenant_id' => 'nullable|integer', 'menus' => 'required|array', 'menus.*.name' => 'required|string|max:100', 'menus.*.url' => 'nullable|string|max:255', @@ -168,9 +169,12 @@ public function import(Request $request): JsonResponse 'menus.*.children' => 'nullable|array', ]); + // 요청에서 tenant_id를 받으면 사용 (API 호출 시 세션 없으므로 필수) + $importTenantId = $validated['tenant_id'] ?? $this->getTenantId(); + $imported = 0; foreach ($validated['menus'] as $menuData) { - $this->importMenu($menuData); + $this->importMenu($menuData, null, $importTenantId); $imported++; } @@ -232,6 +236,7 @@ public function push(Request $request): JsonResponse 'X-Menu-Sync-Key' => $env['api_key'], 'Accept' => 'application/json', ])->timeout(15)->post(rtrim($env['url'], '/').'/menu-sync/import', [ + 'tenant_id' => $this->getTenantId(), 'menus' => $menuData, ]); @@ -683,12 +688,14 @@ private function applyOrder(array $orderMap, int $tenantId, ?int $parentId = nul /** * 메뉴 Import */ - private function importMenu(array $data, ?int $parentId = null): void + private function importMenu(array $data, ?int $parentId = null, ?int $tenantId = null): void { + $tenantId = $tenantId ?? $this->getTenantId(); + // 부모 메뉴 찾기 if (! $parentId && ! empty($data['parent_name'])) { $parent = Menu::withoutGlobalScopes() - ->where('tenant_id', $this->getTenantId()) + ->where('tenant_id', $tenantId) ->where('name', $data['parent_name']) ->first(); $parentId = $parent?->id; @@ -697,7 +704,7 @@ private function importMenu(array $data, ?int $parentId = null): void // name + parent_id로 매칭 (동명 메뉴가 다른 계층에 있을 때 자기참조 방지) $menu = Menu::withoutGlobalScopes()->updateOrCreate( [ - 'tenant_id' => $this->getTenantId(), + 'tenant_id' => $tenantId, 'name' => $data['name'], 'parent_id' => $parentId, ], @@ -713,7 +720,7 @@ private function importMenu(array $data, ?int $parentId = null): void // 자식 메뉴 처리 if (! empty($data['children'])) { foreach ($data['children'] as $child) { - $this->importMenu($child, $menu->id); + $this->importMenu($child, $menu->id, $tenantId); } } }