- global_menus 테이블 분리를 위한 menus 컬럼 추가 (global_menu_id, is_customized) - GlobalMenuController: 글로벌 메뉴 CRUD API - GlobalMenuService: 글로벌 메뉴 비즈니스 로직 - MenuSyncService: 테넌트 메뉴 동기화 서비스 - MenuBootstrapService: 테넌트 초기 메뉴 생성 로직 개선 - MenuController: 메뉴 재동기화 엔드포인트 추가
131 lines
3.4 KiB
PHP
131 lines
3.4 KiB
PHP
<?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();
|
|
}, '글로벌 메뉴 통계 조회');
|
|
}
|
|
}
|