forked from admin/services_core
big update all menus
This commit is contained in:
@@ -8,11 +8,15 @@ use App\Http\Requests\Nas\StoreNasResourceRequest;
|
||||
use App\Http\Requests\Nas\UpdateNasResourceRequest;
|
||||
use App\Http\Resources\Nas\NasResource;
|
||||
use App\Services\Nas\NasResourceService;
|
||||
use App\Services\Nas\MikrotikHealthService;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class NasResourceController extends ApiController
|
||||
{
|
||||
public function __construct(protected NasResourceService $service) {}
|
||||
public function __construct(
|
||||
protected NasResourceService $service,
|
||||
protected MikrotikHealthService $mikrotikHealth,
|
||||
) {}
|
||||
|
||||
public function index(IndexNasResourceRequest $request)
|
||||
{
|
||||
@@ -55,6 +59,18 @@ class NasResourceController extends ApiController
|
||||
return $this->deleted('Data NAS berhasil dihapus');
|
||||
}
|
||||
|
||||
public function testConnection(Request $request, int $id)
|
||||
{
|
||||
abort_unless($this->resource($request) === 'mikrotik', 404);
|
||||
$mikrotik = $this->service->find('mikrotik', $id);
|
||||
$this->authorizeTenant($request, $mikrotik->tenant_id);
|
||||
|
||||
return $this->success(
|
||||
$this->mikrotikHealth->check($mikrotik),
|
||||
'Koneksi RouterOS API berhasil'
|
||||
);
|
||||
}
|
||||
|
||||
private function resource(Request $request): string
|
||||
{
|
||||
return $request->route()->defaults['nas_resource'];
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Nas;
|
||||
use App\Http\Controllers\ApiController;
|
||||
use App\Models\NasPackageProfile;
|
||||
use App\Models\NasPackageProfileTarget;
|
||||
use App\Services\Nas\PackageProfileDeploymentService;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\Rule;
|
||||
use App\Models\NasScriptPolicy;
|
||||
|
||||
class PackageProfileDeploymentController extends ApiController
|
||||
{
|
||||
public function __construct(protected PackageProfileDeploymentService $service) {}
|
||||
public function index(Request $request, NasPackageProfile $profile) { $this->authorizeProfile($request,$profile); return $this->success($this->service->targets($profile),'Target deployment berhasil diambil'); }
|
||||
public function store(Request $request, NasPackageProfile $profile) { $this->authorizeProfile($request,$profile); $data=$request->validate(['nas_mikrotik_id'=>['required','integer','exists:nas_mikrotiks,id'],'external_profile_name'=>['required','string','max:255']]); return $this->created($this->service->saveTarget($profile,$data),'Target deployment berhasil disimpan'); }
|
||||
public function sync(Request $request, NasPackageProfileTarget $target) { $this->authorizeProfile($request,$target->packageProfile); $data=$request->validate(['mode'=>['required',Rule::in(['create','update','adopt'])]]); return $this->updated($this->service->sync($target,$data['mode']),'Profile berhasil disinkronkan'); }
|
||||
public function scriptOptions() { return $this->success(NasScriptPolicy::where('enabled',true)->with('latestVersion:id,nas_script_policy_id,version')->orderBy('service_type')->orderBy('event')->get(['id','code','name','service_type','event','current_version']),'Pilihan Script Policy berhasil diambil'); }
|
||||
private function authorizeProfile(Request $request, NasPackageProfile $profile): void { abort_unless($request->user()->isMasterAdmin() || (int)$profile->tenant_id === (int)$request->attributes->get('tenant_id'),403); }
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Nas;
|
||||
|
||||
use App\Http\Controllers\ApiController;
|
||||
use App\Models\RadiusCluster;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class RadiusClusterController extends ApiController
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$this->authorizeMaster($request);
|
||||
$data = $request->validate(['search'=>['nullable','string','max:255'],'status'=>['nullable',Rule::in(['planned','active','maintenance','inactive'])],'per_page'=>['nullable','integer','between:1,100']]);
|
||||
$rows = RadiusCluster::query()->when($data['search'] ?? null, fn ($q,$search) => $q->where(fn ($x) => $x->where('name','ILIKE',"%{$search}%")->orWhere('code','ILIKE',"%{$search}%")->orWhere('region','ILIKE',"%{$search}%")))->when($data['status'] ?? null, fn ($q,$status) => $q->where('status',$status))->orderBy('name')->paginate($data['per_page'] ?? 10);
|
||||
$rows->through(fn ($cluster) => $this->present($cluster));
|
||||
return $this->success($rows, 'Cluster RADIUS berhasil diambil');
|
||||
}
|
||||
|
||||
public function store(Request $request) { $this->authorizeMaster($request); return $this->created($this->present(RadiusCluster::create($this->validated($request))), 'Cluster RADIUS berhasil dibuat'); }
|
||||
public function show(Request $request, RadiusCluster $radiusCluster) { $this->authorizeMaster($request); return $this->success($this->present($radiusCluster), 'Detail cluster RADIUS berhasil diambil'); }
|
||||
public function update(Request $request, RadiusCluster $radiusCluster)
|
||||
{
|
||||
$this->authorizeMaster($request); $data=$this->validated($request,$radiusCluster);
|
||||
if (blank($data['provisioning_api_token'] ?? null)) unset($data['provisioning_api_token']);
|
||||
$radiusCluster->update($data); return $this->updated($this->present($radiusCluster->fresh()), 'Cluster RADIUS berhasil diperbarui');
|
||||
}
|
||||
public function destroy(Request $request, RadiusCluster $radiusCluster) { $this->authorizeMaster($request); $radiusCluster->delete(); return $this->deleted('Cluster RADIUS berhasil dihapus'); }
|
||||
|
||||
private function validated(Request $request, ?RadiusCluster $cluster=null): array
|
||||
{
|
||||
return $request->validate([
|
||||
'code'=>['required','alpha_dash','max:80',Rule::unique('radius_clusters','code')->ignore($cluster)], 'name'=>['required','string','max:255'], 'region'=>['nullable','string','max:80'],
|
||||
'auth_endpoints'=>['required','array','min:1','max:4'], 'auth_endpoints.*.host'=>['required','string','max:255'], 'auth_endpoints.*.port'=>['required','integer','between:1,65535'], 'auth_endpoints.*.priority'=>['required','integer','between:1,100'],
|
||||
'accounting_endpoints'=>['required','array','min:1','max:4'], 'accounting_endpoints.*.host'=>['required','string','max:255'], 'accounting_endpoints.*.port'=>['required','integer','between:1,65535'], 'accounting_endpoints.*.priority'=>['required','integer','between:1,100'],
|
||||
'coa_endpoints'=>['nullable','array','max:4'], 'coa_endpoints.*.host'=>['required','string','max:255'], 'coa_endpoints.*.port'=>['required','integer','between:1,65535'], 'coa_endpoints.*.priority'=>['required','integer','between:1,100'],
|
||||
'provisioning_api_url'=>['nullable','url:http,https','max:2000'], 'provisioning_api_token'=>['nullable','string','max:4000'], 'healthcheck_url'=>['nullable','url:http,https','max:2000'],
|
||||
'request_timeout'=>['required','integer','between:1,60'], 'retry_attempts'=>['required','integer','between:0,10'], 'status'=>['required',Rule::in(['planned','active','maintenance','inactive'])], 'notes'=>['nullable','string','max:5000'],
|
||||
]);
|
||||
}
|
||||
private function present(RadiusCluster $cluster): array { $data=$cluster->attributesToArray(); unset($data['provisioning_api_token']); return [...$data,'has_provisioning_api_token'=>filled($cluster->getRawOriginal('provisioning_api_token'))]; }
|
||||
private function authorizeMaster(Request $request): void { abort_unless($request->user()->isMasterAdmin(),403,'Infrastruktur RADIUS hanya dapat dikelola Master Admin.'); }
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Nas;
|
||||
use App\Http\Controllers\ApiController;
|
||||
use App\Models\NasScriptPolicy;
|
||||
use App\Services\Nas\ScriptPolicyService;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class ScriptPolicyController extends ApiController
|
||||
{
|
||||
public function __construct(protected ScriptPolicyService $service) {}
|
||||
public function index(Request $request) { $this->authorizePlatform($request); $data=$request->validate(['search'=>['nullable','string','max:255'],'per_page'=>['nullable','integer','between:1,100']]); return $this->success($this->service->list($data),'Script Policy berhasil diambil'); }
|
||||
public function store(Request $request) { $this->authorizePlatform($request); return $this->created($this->service->save($this->validated($request),$request->user()->id),'Script Policy berhasil dibuat'); }
|
||||
public function update(Request $request, NasScriptPolicy $policy) { $this->authorizePlatform($request); return $this->updated($this->service->save($this->validated($request,$policy),$request->user()->id,$policy),'Versi Script Policy berhasil dibuat'); }
|
||||
public function show(Request $request, NasScriptPolicy $policy) { $this->authorizePlatform($request); return $this->success($policy->load(['latestVersion','versions'=>fn($q)=>$q->latest('version')]),'Detail Script Policy berhasil diambil'); }
|
||||
private function validated(Request $request, ?NasScriptPolicy $policy=null): array { return $request->validate(['code'=>['required','alpha_dash','max:100',Rule::unique('nas_script_policies','code')->ignore($policy)],'name'=>['required','string','max:255'],'service_type'=>['required',Rule::in(['ppp','hotspot'])],'event'=>['required',Rule::in(['on_up','on_down','on_login','on_logout'])],'script_template'=>['required','string','max:65535'],'change_notes'=>['nullable','string','max:1000'],'enabled'=>['nullable','boolean']]); }
|
||||
private function authorizePlatform(Request $request): void { abort_unless($request->user()->isMasterAdmin() || $request->user()->is_platform_staff,403,'Script Policy hanya dapat dikelola staff platform.'); }
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
<?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];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user