tenant($request); $setting = TenantNasSetting::firstOrCreate(['tenant_id' => $tenant->id], ['backend_mode' => 'routeros_api']); return $this->success($this->present($setting->load('radiusCluster:id,code,name,region,status')), 'Pengaturan backend NAS berhasil diambil'); } public function update(Request $request) { $tenant = $this->tenant($request); $setting = TenantNasSetting::firstOrCreate(['tenant_id' => $tenant->id], ['backend_mode' => 'routeros_api']); $data = $request->validate([ 'tenant_id' => ['nullable','integer','exists:tenants,id'], 'backend_mode' => ['required', Rule::in(['routeros_api','platform_radius','external_radius'])], 'radius_cluster_id' => ['nullable','integer','exists:radius_clusters,id'], 'external_radius_host' => ['nullable','string','max:255'], 'external_auth_port' => ['nullable','integer','between:1,65535'], 'external_accounting_port' => ['nullable','integer','between:1,65535'], 'external_coa_port' => ['nullable','integer','between:1,65535'], 'external_radius_secret' => ['nullable','string','max:1000'], 'external_provisioning_api_url' => ['nullable','url:http,https','max:2000'], 'external_provisioning_api_token' => ['nullable','string','max:2000'], 'accounting_enabled' => ['nullable','boolean'], 'coa_enabled' => ['nullable','boolean'], ]); $usesExternal = $data['backend_mode'] === 'external_radius'; if ($usesExternal && empty($data['external_radius_host'])) throw ValidationException::withMessages(['external_radius_host'=>'Host RADIUS eksternal wajib diisi.']); $data['hybrid_radius_source'] = null; foreach (['external_radius_secret','external_provisioning_api_token'] as $secret) if (blank($data[$secret] ?? null)) unset($data[$secret]); unset($data['tenant_id']); $setting->update($data); return $this->updated($this->present($setting->fresh()->load('radiusCluster:id,code,name,region,status')), 'Pengaturan backend NAS berhasil disimpan'); } private function tenant(Request $request): Tenant { $id = $request->user()->isMasterAdmin() ? ($request->integer('tenant_id') ?: $request->attributes->get('tenant_id')) : $request->attributes->get('tenant_id'); abort_unless($id, 422, 'Tenant wajib dipilih.'); return Tenant::findOrFail($id); } private function present(TenantNasSetting $setting): array { return [...$setting->attributesToArray(), 'has_external_radius_secret'=>filled($setting->getRawOriginal('external_radius_secret')), 'has_external_provisioning_api_token'=>filled($setting->getRawOriginal('external_provisioning_api_token')), 'radius_cluster'=>$setting->radiusCluster]; } }