Files
sam-api/app/Http/Controllers/Api/V1/MenuController.php
hskwon a72a744612 feat: 글로벌 메뉴 분리 및 테넌트 메뉴 동기화 시스템 구현
- global_menus 테이블 분리를 위한 menus 컬럼 추가 (global_menu_id, is_customized)
- GlobalMenuController: 글로벌 메뉴 CRUD API
- GlobalMenuService: 글로벌 메뉴 비즈니스 로직
- MenuSyncService: 테넌트 메뉴 동기화 서비스
- MenuBootstrapService: 테넌트 초기 메뉴 생성 로직 개선
- MenuController: 메뉴 재동기화 엔드포인트 추가
2025-12-02 22:11:08 +09:00

147 lines
4.0 KiB
PHP

<?php
namespace App\Http\Controllers\Api\V1;
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) {
return MenuService::index($request->all());
}, '메뉴 목록 조회');
}
public function show($id)
{
return ApiResponse::handle(function () use ($id) {
return MenuService::show(['id' => (int) $id]);
}, '메뉴 단건 조회');
}
public function store(Request $request)
{
return ApiResponse::handle(function () use ($request) {
return MenuService::store($request->all());
}, '메뉴 등록');
}
public function update(Request $request, $id)
{
return ApiResponse::handle(function () use ($request, $id) {
$params = $request->all();
$params['id'] = (int) $id;
return MenuService::update($params);
}, '메뉴 수정');
}
public function destroy($id)
{
return ApiResponse::handle(function () use ($id) {
return MenuService::destroy(['id' => (int) $id]);
}, '메뉴 삭제');
}
public function reorder(Request $request)
{
return ApiResponse::handle(function () use ($request) {
return MenuService::reorder($request->all());
}, '메뉴 정렬 변경');
}
public function toggle(Request $request, $id)
{
return ApiResponse::handle(function () use ($request, $id) {
$params = $request->all();
$params['id'] = (int) $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();
}, '메뉴 업데이트 동기화');
}
}