feat: 글로벌 메뉴 분리 및 테넌트 메뉴 동기화 시스템 구현
- global_menus 테이블 분리를 위한 menus 컬럼 추가 (global_menu_id, is_customized) - GlobalMenuController: 글로벌 메뉴 CRUD API - GlobalMenuService: 글로벌 메뉴 비즈니스 로직 - MenuSyncService: 테넌트 메뉴 동기화 서비스 - MenuBootstrapService: 테넌트 초기 메뉴 생성 로직 개선 - MenuController: 메뉴 재동기화 엔드포인트 추가
This commit is contained in:
130
app/Http/Controllers/Api/Admin/GlobalMenuController.php
Normal file
130
app/Http/Controllers/Api/Admin/GlobalMenuController.php
Normal file
@@ -0,0 +1,130 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\Admin;
|
||||
|
||||
use App\Helpers\ApiResponse;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\GlobalMenuService;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
/**
|
||||
* 글로벌 메뉴 관리 컨트롤러 (시스템 관리자용)
|
||||
*/
|
||||
class GlobalMenuController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
protected GlobalMenuService $globalMenuService
|
||||
) {}
|
||||
|
||||
/**
|
||||
* 글로벌 메뉴 목록 조회
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
return ApiResponse::handle(function () use ($request) {
|
||||
return $this->globalMenuService->index($request->all());
|
||||
}, '글로벌 메뉴 목록 조회');
|
||||
}
|
||||
|
||||
/**
|
||||
* 글로벌 메뉴 트리 조회
|
||||
*/
|
||||
public function tree()
|
||||
{
|
||||
return ApiResponse::handle(function () {
|
||||
return $this->globalMenuService->tree();
|
||||
}, '글로벌 메뉴 트리 조회');
|
||||
}
|
||||
|
||||
/**
|
||||
* 글로벌 메뉴 단건 조회
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
return ApiResponse::handle(function () use ($id) {
|
||||
$menu = $this->globalMenuService->show((int) $id);
|
||||
|
||||
if (! $menu) {
|
||||
return ['error' => __('error.menu_not_found'), 'code' => 404];
|
||||
}
|
||||
|
||||
return $menu;
|
||||
}, '글로벌 메뉴 상세 조회');
|
||||
}
|
||||
|
||||
/**
|
||||
* 글로벌 메뉴 생성
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
return ApiResponse::handle(function () use ($request) {
|
||||
return $this->globalMenuService->store($request->all());
|
||||
}, '글로벌 메뉴 생성');
|
||||
}
|
||||
|
||||
/**
|
||||
* 글로벌 메뉴 수정
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
return ApiResponse::handle(function () use ($request, $id) {
|
||||
$menu = $this->globalMenuService->update((int) $id, $request->all());
|
||||
|
||||
if (! $menu) {
|
||||
return ['error' => __('error.menu_not_found'), 'code' => 404];
|
||||
}
|
||||
|
||||
return $menu;
|
||||
}, '글로벌 메뉴 수정');
|
||||
}
|
||||
|
||||
/**
|
||||
* 글로벌 메뉴 삭제
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
return ApiResponse::handle(function () use ($id) {
|
||||
$result = $this->globalMenuService->destroy((int) $id);
|
||||
|
||||
if (! $result) {
|
||||
return ['error' => __('error.menu_not_found'), 'code' => 404];
|
||||
}
|
||||
|
||||
return __('message.deleted');
|
||||
}, '글로벌 메뉴 삭제');
|
||||
}
|
||||
|
||||
/**
|
||||
* 글로벌 메뉴 순서 변경
|
||||
*/
|
||||
public function reorder(Request $request)
|
||||
{
|
||||
return ApiResponse::handle(function () use ($request) {
|
||||
$items = $request->input('items', []);
|
||||
|
||||
$this->globalMenuService->reorder($items);
|
||||
|
||||
return __('message.reordered');
|
||||
}, '글로벌 메뉴 순서 변경');
|
||||
}
|
||||
|
||||
/**
|
||||
* 특정 글로벌 메뉴를 모든 테넌트에 동기화
|
||||
*/
|
||||
public function syncToTenants($id)
|
||||
{
|
||||
return ApiResponse::handle(function () use ($id) {
|
||||
return $this->globalMenuService->syncToAllTenants((int) $id);
|
||||
}, '모든 테넌트에 메뉴 동기화');
|
||||
}
|
||||
|
||||
/**
|
||||
* 글로벌 메뉴 통계 조회
|
||||
*/
|
||||
public function stats()
|
||||
{
|
||||
return ApiResponse::handle(function () {
|
||||
return $this->globalMenuService->stats();
|
||||
}, '글로벌 메뉴 통계 조회');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user