group(function () { foreach ([ 'mikrotiks' => ['resource' => 'mikrotik', 'menu' => 'nas-mikrotik'], 'package-profiles' => ['resource' => 'package-profile', 'menu' => 'nas-package-profiles'], 'olts' => ['resource' => 'olt', 'menu' => 'nas-olt'], 'webfig-devices' => ['resource' => 'webfig', 'menu' => 'nas-webfig'], ] as $path => $nas) { Route::prefix("nas/{$path}") ->middleware("menu.resource:{$nas['menu']}") ->controller(NasResourceController::class) ->group(function () use ($nas, $path) { Route::get('/', 'index') ->name("nas.{$path}.index") ->defaults('nas_resource', $nas['resource']); Route::post('/', 'store') ->name("nas.{$path}.store") ->defaults('nas_resource', $nas['resource']); Route::get('/{id}', 'show') ->name("nas.{$path}.show") ->whereNumber('id') ->defaults('nas_resource', $nas['resource']); Route::put('/{id}', 'update') ->name("nas.{$path}.update") ->whereNumber('id') ->defaults('nas_resource', $nas['resource']); Route::patch('/{id}', 'update') ->name("nas.{$path}.patch") ->whereNumber('id') ->defaults('nas_resource', $nas['resource']); Route::delete('/{id}', 'destroy') ->name("nas.{$path}.destroy") ->whereNumber('id') ->defaults('nas_resource', $nas['resource']); }); } Route::apiResource('tickets', TicketController::class) ->middleware('menu.resource:ticketing-ticket'); Route::apiResource('ticket-types', TicketTypeController::class) ->middleware('menu.resource:ticketing-ticket-types'); Route::apiResource('ticket-incident-types', TicketIncidentTypeController::class) ->middleware('menu.resource:ticketing-ticket-incidents'); Route::prefix('tickets/{ticket}') ->controller(TicketWorkflowController::class) ->group(function () { Route::get('/workflow', 'history') ->middleware('menu.permission:ticketing-ticket,view'); Route::post('/assign', 'assign') ->middleware('menu.permission:ticketing-ticket,update'); Route::post('/reassign', 'reassign') ->middleware('menu.permission:ticketing-ticket,update'); Route::post('/approve', 'approve') ->middleware('menu.permission:ticketing-approval,approve'); Route::post('/reject', 'reject') ->middleware('menu.permission:ticketing-approval,approve'); Route::post('/start', 'start') ->middleware('menu.permission:ticketing-ticket,update'); Route::post('/pending', 'pending') ->middleware('menu.permission:ticketing-ticket,update'); Route::post('/resume', 'resume') ->middleware('menu.permission:ticketing-ticket,update'); Route::post('/resolve', 'resolve') ->middleware('menu.permission:ticketing-ticket,update'); Route::post('/close', 'close') ->middleware('menu.permission:ticketing-ticket,update'); Route::post('/cancel', 'cancel') ->middleware('menu.permission:ticketing-ticket,delete'); Route::post('/escalate', 'escalate') ->middleware('menu.permission:ticketing-ticket,update'); }); Route::prefix('materials') ->middleware('menu.resource:ticketing-material') ->controller(MaterialController::class) ->group(function () { Route::get('/', 'index'); Route::post('/assign', 'assign'); Route::post('/transfer', 'transfer'); Route::post('/return', 'return'); Route::get('/user/{user_id}', 'listByUser'); Route::get('/history/{barcode_id}', 'history'); }); Route::prefix('audit-logs') ->middleware('access.level:tenant_owner') ->controller(AuditLogController::class) ->group(function () { Route::get('/', 'index'); Route::get('/{id}', 'show'); }); Route::prefix('me') ->group(function () { Route::get('/menus', [MenuController::class, 'myMenus']); Route::get('/profile', [ProfileController::class, 'show']); Route::put('/profile', [ProfileController::class, 'update']); }); Route::prefix('files')->controller(StoredFileController::class)->group(function () { Route::get('/', 'index'); Route::post('/', 'store'); Route::get('/{storedFile}', 'show'); Route::get('/{storedFile}/temporary-url', 'temporaryUrl'); Route::delete('/{storedFile}', 'destroy'); }); Route::get('wilayah/alamat-lengkap', [WilayahController::class, 'alamatLengkap']) ->name('wilayah.alamat-lengkap'); Route::prefix('wilayah/options')->controller(WilayahController::class)->group(function () { Route::get('/provinsi', 'provinsiOptions')->name('wilayah.options.provinsi'); Route::get('/kabupaten/{provinsi}', 'kabupatenOptions')->name('wilayah.options.kabupaten'); Route::get('/kecamatan/{kabupaten}', 'kecamatanOptions')->name('wilayah.options.kecamatan'); Route::get('/desa/{kecamatan}', 'desaOptions')->name('wilayah.options.desa'); }); foreach ([ 'desa' => 'wilayah-desa', 'kecamatan' => 'wilayah-kecamatan', 'kabupaten' => 'wilayah-kabupaten', 'provinsi' => 'wilayah-provinsi', ] as $tingkat => $menuSlug) { $readRoutes = [ Route::get("wilayah/{$tingkat}", [WilayahController::class, 'index']) ->name("wilayah.{$tingkat}.index"), Route::get("wilayah/{$tingkat}/{wilayah}", [WilayahController::class, 'show']) ->name("wilayah.{$tingkat}.show") ->whereNumber('wilayah'), ]; $writeRoutes = [ Route::post("wilayah/{$tingkat}", [WilayahController::class, 'store']) ->name("wilayah.{$tingkat}.store"), Route::put("wilayah/{$tingkat}/{wilayah}", [WilayahController::class, 'update']) ->name("wilayah.{$tingkat}.update") ->whereNumber('wilayah'), Route::patch("wilayah/{$tingkat}/{wilayah}", [WilayahController::class, 'update']) ->name("wilayah.{$tingkat}.patch") ->whereNumber('wilayah'), Route::delete("wilayah/{$tingkat}/{wilayah}", [WilayahController::class, 'destroy']) ->name("wilayah.{$tingkat}.destroy") ->whereNumber('wilayah'), ]; foreach ($readRoutes as $wilayahRoute) { $wilayahRoute->defaults('tingkat', $tingkat); } foreach ($writeRoutes as $wilayahRoute) { $wilayahRoute->defaults('tingkat', $tingkat) ->middleware("menu.resource:{$menuSlug}"); } } Route::apiResource('menus', MenuListController::class) ->parameters(['menus' => 'menu_list']) ->middleware('access.level:master_admin'); Route::apiResource('menu-groups', MenuGroupController::class) ->middleware([ 'access.level:tenant_owner', 'menu.resource:users-group-menus', ]); Route::apiResource('tenants', TenantController::class) ->only(['index', 'show']) ->middleware('access.level:tenant_owner'); Route::apiResource('tenants', TenantController::class) ->except(['index', 'show']) ->middleware('access.level:master_admin'); Route::apiResource('users', UserController::class) ->middleware([ 'access.level:tenant_owner', 'menu.resource:users-user', ]); Route::prefix('menu-groups/{menu_group}') ->middleware([ 'access.level:tenant_owner', 'menu.permission:users-group-menus,update', ]) ->controller(MenuGroupController::class) ->group(function () { Route::get('/menus', 'menus'); Route::get('/available-menus', 'availableMenus'); Route::put('/menus', 'syncMenus'); }); Route::prefix('users/{user}') ->middleware([ 'access.level:tenant_owner', 'menu.permission:users-group-menus,update', ]) ->controller(MenuGroupController::class) ->group(function () { Route::get('/menu-groups', 'userAssignments'); Route::put('/menu-groups', 'syncUserAssignments'); }); });