group(function () { # API KEY 인증 Route::middleware('auth.apikey')->get('/debug-apikey', [ApiController::class, 'debugApikey']); # SAM API Route::middleware('auth.apikey')->group(function () { # Auth API Route::post('login', [ApiController::class, 'login']); Route::middleware('auth:sanctum')->post('/logout', [ApiController::class, 'logout']); // Admin API Route::post('admin/list', [AdminApiController::class, 'list'])->middleware('permission:SR'); // 관리자 리스트 조회 // Common API Route::prefix('common')->group(function () { Route::get('code', [CommonController::class, 'getComeCode'])->name('v1.common.code'); // 공통코드 조회 }); // Product API Route::prefix('product')->group(function () { Route::get('category', [ProductController::class, 'getCategory'])->name('v1.product.category'); // 제품 카테고리 }); // Member API Route::prefix('users')->group(function () { Route::get('index', [UserController::class, 'index'])->name('v1.users.index'); // 회원 목록 조회 Route::get('show/{user_no}', [UserController::class, 'show'])->name('v1.users.show'); // 회원 상세 조회 Route::post('store', [UserController::class, 'store'])->name('v1.users.store')->middleware('permission:AC'); // 회원 저장 (등록/수정) Route::get('me', [UserController::class, 'me'])->name('v1.users.users.me'); // 내 정보 조회 Route::put('me', [UserController::class, 'meUpdate'])->name('v1.users.me.update'); // 내 정보 수정 Route::put('me/password', [UserController::class, 'changePassword'])->name('v1.users.me.password'); // 비밀번호 변겅 Route::get('me/tenants', [UserController::class, 'tenants'])->name('v1.users.me.tenants.index'); // 내 테넌트 목록 Route::patch('me/tenants/switch',[UserController::class, 'switchTenant'])->name('v1.users.me.tenants.switch'); // 활성 테넌트 전환 }); }); // File API Route::prefix('file')->group(function () { Route::post('upload', [FileController::class, 'upload'])->name('v1.file.upload'); // 파일 업로드 (등록/수정) Route::get('list', [FileController::class, 'list'])->name('v1.file.list'); // 파일 목록 조회 Route::delete('delete', [FileController::class, 'delete'])->name('v1.file.delete'); // 파일 삭제 Route::get('info', [FileController::class, 'findFile'])->name('v1.file.info'); // 파일 정보 조회 // Material, Model, BOM API Route::resource('materials', MaterialController::class)->except(['v1.create', 'edit']); // 자재관리 Route::resource('models', ModelController::class)->except(['v1.create', 'edit']); // 모델관리 Route::resource('boms', BomController::class)->except(['v1.create', 'edit']); // BOM관리 }); }); // ───────────────────────────────────────────────────────────── // 공통 미들웨어 메모: // - 'apikey' : X-API-KEY 검사 미들웨어 (커스텀) // - 'auth:sanctum' : Bearer 토큰(Sanctum) 인증 // 필요 시 app/Http/Kernel.php 의 $routeMiddleware 에 별칭 등록 // ───────────────────────────────────────────────────────────── /* |-------------------------------------------------------------------------- | V1 - User 영역 (본인 계정) |-------------------------------------------------------------------------- | Swagger: UserApi.php | - POST /api/v1/auth/login | - POST /api/v1/auth/logout | - GET /api/v1/users/me | - PUT /api/v1/users/me | - PUT /api/v1/users/me/password | - GET /api/v1/users/me/tenants | - PATCH /api/v1/users/me/tenants/switch */ Route::prefix('v1_DEV') ->middleware(['apikey']) // 모든 엔드포인트는 X-API-KEY 필요 ->group(function () { // Auth (User) Route::prefix('auth')->group(function () { Route::post('login', [\App\Http\Controllers\Api\V1\AuthController::class, 'login']) ->name('v1.auth.login'); // Bearer 불필요(로그인) Route::post('logout', [\App\Http\Controllers\Api\V1\AuthController::class, 'logout']) ->middleware('auth:sanctum') ->name('v1.auth.logout'); }); // Users (me) Route::prefix('users')->middleware('auth:sanctum')->group(function () { Route::get('me', [\App\Http\Controllers\Api\V1\User\MeController::class, 'show'])->name('v1.users.me.show'); Route::put('me', [\App\Http\Controllers\Api\V1\User\MeController::class, 'update'])->name('v1.users.me.update'); Route::put('me/password', [\App\Http\Controllers\Api\V1\User\MeController::class, 'changePassword'])->name('v1.users.me.password'); Route::get('me/tenants', [\App\Http\Controllers\Api\V1\User\TenantController::class, 'index'])->name('v1.users.me.tenants.index'); Route::patch('me/tenants/switch',[\App\Http\Controllers\Api\V1\User\TenantController::class, 'switch'])->name('v1.users.me.tenants.switch'); }); }); /* |-------------------------------------------------------------------------- | V1 - Admin 영역 (관리자 전용 사용자 관리) |-------------------------------------------------------------------------- | Swagger: AdminApi.php | - GET /api/v1/admin/users | - POST /api/v1/admin/users | - GET /api/v1/admin/users/{id} | - PUT /api/v1/admin/users/{id} | - PATCH /api/v1/admin/users/{id}/status | - DELETE /api/v1/admin/users/{id} | - POST /api/v1/admin/users/{id}/restore | - POST /api/v1/admin/users/{id}/roles | - DELETE /api/v1/admin/users/{id}/roles/{role} | - POST /api/v1/admin/users/{id}/reset-password */ Route::prefix('v1_DEV/admin') ->middleware(['apikey', 'auth:sanctum', 'can:admin']) // 예: 'can:admin' 또는 커스텀 'is_admin' ->group(function () { // 목록/생성 Route::get('users', [\App\Http\Controllers\Api\V1\Admin\UserController::class, 'index'])->name('v1.admin.users.index'); Route::post('users', [\App\Http\Controllers\Api\V1\Admin\UserController::class, 'store'])->name('v1.admin.users.store'); // 단건 Route::get('users/{id}', [\App\Http\Controllers\Api\V1\Admin\UserController::class, 'show'])->name('v1.admin.users.show'); Route::put('users/{id}', [\App\Http\Controllers\Api\V1\Admin\UserController::class, 'update'])->name('v1.admin.users.update'); Route::delete('users/{id}',[\App\Http\Controllers\Api\V1\Admin\UserController::class, 'destroy'])->name('v1.admin.users.destroy'); // 상태 토글 Route::patch('users/{id}/status', [\App\Http\Controllers\Api\V1\Admin\UserStatusController::class, 'toggle'])->name('v1.admin.users.status.toggle'); // 소프트 삭제 복구 Route::post('users/{id}/restore', [\App\Http\Controllers\Api\V1\Admin\UserRestoreController::class, 'restore'])->name('v1.admin.users.restore'); // 역할 부여/해제 Route::post('users/{id}/roles', [\App\Http\Controllers\Api\V1\Admin\UserRoleController::class, 'attach'])->name('v1.admin.users.roles.attach'); Route::delete('users/{id}/roles/{role}', [\App\Http\Controllers\Api\V1\Admin\UserRoleController::class, 'detach'])->name('v1.admin.users.roles.detach'); // 비밀번호 초기화 Route::post('users/{id}/reset-password', [\App\Http\Controllers\Api\V1\Admin\UserPasswordController::class, 'reset'])->name('v1.admin.users.password.reset'); });