60 lines
3.2 KiB
PHP
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];
|
|
}
|
|
}
|