feat: 글로벌 메뉴 분리 및 테넌트 메뉴 동기화 시스템 구현

- global_menus 테이블 분리를 위한 menus 컬럼 추가 (global_menu_id, is_customized)
- GlobalMenuController: 글로벌 메뉴 CRUD API
- GlobalMenuService: 글로벌 메뉴 비즈니스 로직
- MenuSyncService: 테넌트 메뉴 동기화 서비스
- MenuBootstrapService: 테넌트 초기 메뉴 생성 로직 개선
- MenuController: 메뉴 재동기화 엔드포인트 추가
This commit is contained in:
2025-12-02 22:11:08 +09:00
parent 84eb4f5ab4
commit a72a744612
8 changed files with 1140 additions and 4 deletions

View File

@@ -5,10 +5,15 @@
use App\Helpers\ApiResponse;
use App\Http\Controllers\Controller;
use App\Services\MenuService;
use App\Services\MenuSyncService;
use Illuminate\Http\Request;
class MenuController extends Controller
{
public function __construct(
protected MenuSyncService $menuSyncService
) {}
public function index(Request $request)
{
return ApiResponse::handle(function () use ($request) {
@@ -63,4 +68,79 @@ public function toggle(Request $request, $id)
return MenuService::toggle($params);
}, '메뉴 상태 토글');
}
/**
* 삭제된 메뉴 복원
*/
public function restore($id)
{
return ApiResponse::handle(function () use ($id) {
return MenuService::restore(['id' => (int) $id]);
}, '메뉴 복원');
}
/**
* 삭제된 메뉴 목록 조회
*/
public function trashed()
{
return ApiResponse::handle(function () {
return MenuService::trashedList();
}, '삭제된 메뉴 목록 조회');
}
/**
* 복제 가능한 글로벌 메뉴 목록
*/
public function availableGlobal()
{
return ApiResponse::handle(function () {
return $this->menuSyncService->getAvailableGlobalMenus();
}, '복제 가능한 글로벌 메뉴 목록');
}
/**
* 동기화 상태 목록 조회
*/
public function syncStatus(Request $request)
{
return ApiResponse::handle(function () use ($request) {
$statusFilter = $request->query('status');
return $this->menuSyncService->getSyncStatus($statusFilter);
}, '동기화 상태 조회');
}
/**
* 선택 동기화 (신규 생성 또는 기존 업데이트)
*/
public function sync(Request $request)
{
return ApiResponse::handle(function () use ($request) {
$menuIds = $request->input('menu_ids', []);
$force = $request->boolean('force', false);
return $this->menuSyncService->syncMenus($menuIds, $force);
}, '메뉴 동기화');
}
/**
* 신규 글로벌 메뉴 일괄 가져오기
*/
public function syncNew()
{
return ApiResponse::handle(function () {
return $this->menuSyncService->importNewMenus();
}, '신규 메뉴 가져오기');
}
/**
* 변경된 기존 메뉴 일괄 업데이트 (커스텀 제외)
*/
public function syncUpdates()
{
return ApiResponse::handle(function () {
return $this->menuSyncService->syncUpdates();
}, '메뉴 업데이트 동기화');
}
}