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']); // 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'); // 제품 카테고리 }); // 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'); // 테넌트 사용자 비밀번호 초기화 }); // 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'); // 활성 테넌트 전환 }); // Tenant API Route::prefix('tenants')->group(function () { Route::get('list', [TenantController::class, 'index'])->name('v1.tenant.index'); // 테넌트 목록 조회 Route::get('/', [TenantController::class, 'show'])->name('v1.tenant.show'); // 테넌트 정보 조회 Route::put('/', [TenantController::class, 'update'])->name('v1.tenant.update'); // 테넌트 정보 수정 Route::post('/', [TenantController::class, 'store'])->name('v1.tenant.store'); // 테넌트 등록 Route::delete('/', [TenantController::class, 'destroy'])->name('v1.tenant.destroy'); // 테넌트 삭제(탈퇴) Route::put('/restore/{tenant_id}', [TenantController::class, 'restore'])->name('v1.tenant.restore'); // 테넌트 복구 }); // 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관리 // Menu API Route::middleware(['perm.map', 'permission'])->prefix('menus')->group(function () { Route::get ('/', [MenuController::class, 'index'])->name('v1.menus.index'); Route::get ('/{id}', [MenuController::class, 'show'])->name('v1.menus.show'); Route::post ('/', [MenuController::class, 'store'])->name('v1.menus.store'); Route::patch ('/{id}', [MenuController::class, 'update'])->name('v1.menus.update'); Route::delete('/{id}', [MenuController::class, 'destroy'])->name('v1.menus.destroy'); Route::post ('/reorder', [MenuController::class, 'reorder'])->name('v1.menus.reorder'); Route::post ('/{id}/toggle', [MenuController::class, 'toggle'])->name('v1.menus.toggle'); }); // Role API Route::prefix('roles')->group(function () { Route::get ('/', [RoleController::class, 'index'])->name('v1.roles.index'); // view Route::post ('/', [RoleController::class, 'store'])->name('v1.roles.store'); // create Route::get ('/{id}', [RoleController::class, 'show'])->name('v1.roles.show'); // view Route::patch ('/{id}', [RoleController::class, 'update'])->name('v1.roles.update'); // update Route::delete('/{id}', [RoleController::class, 'destroy'])->name('v1.roles.destroy');// delete }); // Role Permission API Route::prefix('roles/{id}/permissions')->group(function () { Route::get ('/', [RolePermissionController::class, 'index'])->name('v1.roles.perms.index'); // list Route::post ('/', [RolePermissionController::class, 'grant'])->name('v1.roles.perms.grant'); // grant Route::delete('/', [RolePermissionController::class, 'revoke'])->name('v1.roles.perms.revoke'); // revoke Route::put ('/sync', [RolePermissionController::class, 'sync'])->name('v1.roles.perms.sync'); // sync }); // User Role API Route::prefix('users/{id}/roles')->group(function () { Route::get ('/', [UserRoleController::class, 'index'])->name('v1.users.roles.index'); // list Route::post ('/', [UserRoleController::class, 'grant'])->name('v1.users.roles.grant'); // grant Route::delete('/', [UserRoleController::class, 'revoke'])->name('v1.users.roles.revoke'); // revoke Route::put ('/sync', [UserRoleController::class, 'sync'])->name('v1.users.roles.sync'); // sync }); // Department API Route::prefix('departments')->group(function () { Route::get ('', [DepartmentController::class, 'index'])->name('departments.index'); // 목록 Route::post ('', [DepartmentController::class, 'store'])->name('departments.store'); // 생성 Route::get ('/{id}', [DepartmentController::class, 'show'])->name('departments.show'); // 단건 Route::patch ('/{id}', [DepartmentController::class, 'update'])->name('departments.update'); // 수정 Route::delete('/{id}', [DepartmentController::class, 'destroy'])->name('departments.destroy'); // 삭제(soft) // 부서-사용자 Route::get ('/{id}/users', [DepartmentController::class, 'listUsers'])->name('departments.users.index'); // 부서 사용자 목록 Route::post ('/{id}/users', [DepartmentController::class, 'attachUser'])->name('departments.users.attach'); // 사용자 배정(주/부서) Route::delete('/{id}/users/{user}', [DepartmentController::class, 'detachUser'])->name('departments.users.detach'); // 사용자 제거 Route::patch ('/{id}/users/{user}/primary', [DepartmentController::class, 'setPrimary'])->name('departments.users.primary'); // 주부서 설정/해제 // 부서-권한 Route::get ('/{id}/permissions', [DepartmentController::class, 'listPermissions'])->name('departments.permissions.index'); // 권한 목록 Route::post ('/{id}/permissions', [DepartmentController::class, 'upsertPermission'])->name('departments.permissions.upsert'); // 권한 부여/차단(메뉴별 가능) Route::delete('/{id}/permissions/{permission}', [DepartmentController::class, 'revokePermission'])->name('departments.permissions.revoke'); // 권한 제거(해당 메뉴 범위까지) }); }); });