Files
sam-api/routes/api/v1/admin.php
권혁성 a96499a66d feat: API 라우터 분리 및 버전 폴백 시스템 구현
- api.php를 13개 도메인별 파일로 분리 (1,479줄 → 61줄)
- ApiVersionMiddleware 생성 (헤더/쿼리 기반 버전 선택)
- v2 요청 시 v2 없으면 v1으로 자동 폴백
- 지원 헤더: Accept-Version, X-API-Version, api_version 쿼리

분리된 도메인:
auth, admin, users, tenants, hr, finance, sales,
inventory, production, design, files, boards, common

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 17:30:19 +09:00

64 lines
4.5 KiB
PHP

<?php
/**
* 관리자 API 라우트 (v1)
*
* - 테넌트 사용자 관리
* - 글로벌 메뉴 관리
* - FCM 관리자용 API
*/
use App\Http\Controllers\Api\Admin\GlobalMenuController;
use App\Http\Controllers\Api\V1\Admin\FcmController;
use App\Http\Controllers\Api\V1\AdminController;
use Illuminate\Support\Facades\Route;
// Tenant Admin API
Route::prefix('admin')->group(function () {
// 목록/생성
Route::get('users', [AdminController::class, 'index'])->name('v1.admin.users.index'); // 테넌트 사용자 목록 조회
Route::post('users', [AdminController::class, 'store'])->name('v1.admin.users.store'); // 테넌트 사용자 생성
// 단건
Route::get('users/{id}', [AdminController::class, 'show'])->name('v1.admin.users.show'); // 테넌트 사용자 단건 조회
Route::put('users/{id}', [AdminController::class, 'update'])->name('v1.admin.users.update'); // 테넌트 사용자 수정
// 소프트 삭제 복구
Route::delete('users/{id}', [AdminController::class, 'destroy'])->name('v1.admin.users.destroy'); // 테넌트 사용자 삭제(연결 삭제)
Route::post('users/{id}/restore', [AdminController::class, 'restore'])->name('v1.admin.users.restore'); // 테넌트 사용자 삭제 복구
// 상태 토글
Route::patch('users/{id}/status', [AdminController::class, 'toggle'])->name('v1.admin.users.status.toggle'); // 테넌트 사용자 활성/비활성
// 역할 부여/해제
Route::post('users/{id}/roles', [AdminController::class, 'attach'])->name('v1.admin.users.roles.attach'); // 테넌트 사용자 역할 부여
Route::delete('users/{id}/roles/{role}', [AdminController::class, 'detach'])->name('v1.admin.users.roles.detach'); // 테넌트 사용자 역할 해제
// 비밀번호 초기화
Route::post('users/{id}/reset-password', [AdminController::class, 'reset'])->name('v1.admin.users.password.reset'); // 테넌트 사용자 비밀번호 초기화
// 글로벌 메뉴 관리 (시스템 관리자용)
Route::prefix('global-menus')->group(function () {
Route::get('/', [GlobalMenuController::class, 'index'])->name('v1.admin.global-menus.index'); // 글로벌 메뉴 목록
Route::post('/', [GlobalMenuController::class, 'store'])->name('v1.admin.global-menus.store'); // 글로벌 메뉴 생성
Route::get('/tree', [GlobalMenuController::class, 'tree'])->name('v1.admin.global-menus.tree'); // 글로벌 메뉴 트리
Route::get('/stats', [GlobalMenuController::class, 'stats'])->name('v1.admin.global-menus.stats'); // 글로벌 메뉴 통계
Route::post('/reorder', [GlobalMenuController::class, 'reorder'])->name('v1.admin.global-menus.reorder'); // 글로벌 메뉴 순서 변경
Route::get('/{id}', [GlobalMenuController::class, 'show'])->name('v1.admin.global-menus.show'); // 글로벌 메뉴 단건 조회
Route::put('/{id}', [GlobalMenuController::class, 'update'])->name('v1.admin.global-menus.update'); // 글로벌 메뉴 수정
Route::delete('/{id}', [GlobalMenuController::class, 'destroy'])->name('v1.admin.global-menus.destroy'); // 글로벌 메뉴 삭제
Route::post('/{id}/sync-to-tenants', [GlobalMenuController::class, 'syncToTenants'])->name('v1.admin.global-menus.sync-to-tenants'); // 테넌트에 동기화
});
// Admin FCM API (MNG 관리자용 FCM 발송) - API Key 인증만 사용
Route::prefix('fcm')->group(function () {
Route::post('/send', [FcmController::class, 'send'])->name('v1.admin.fcm.send'); // FCM 발송
Route::get('/preview-count', [FcmController::class, 'previewCount'])->name('v1.admin.fcm.preview'); // 대상 토큰 수 미리보기
Route::get('/tokens', [FcmController::class, 'tokens'])->name('v1.admin.fcm.tokens'); // 토큰 목록
Route::get('/tokens/stats', [FcmController::class, 'tokenStats'])->name('v1.admin.fcm.tokens.stats'); // 토큰 통계
Route::patch('/tokens/{id}/toggle', [FcmController::class, 'toggleToken'])->name('v1.admin.fcm.tokens.toggle'); // 토큰 상태 토글
Route::delete('/tokens/{id}', [FcmController::class, 'deleteToken'])->name('v1.admin.fcm.tokens.delete'); // 토큰 삭제
Route::get('/history', [FcmController::class, 'history'])->name('v1.admin.fcm.history'); // 발송 이력
});
});