Files
services_core/app/Http/Controllers/Nas/TenantNasSettingController.php
T
2026-08-07 09:16:13 +07:00

60 lines
3.2 KiB
PHP

<?php
namespace App\Http\Controllers\Nas;
use App\Http\Controllers\ApiController;
use App\Models\Tenant;
use App\Models\TenantNasSetting;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;
class TenantNasSettingController extends ApiController
{
public function show(Request $request)
{
$tenant = $this->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];
}
}