forked from admin/services_core
155 lines
5.3 KiB
PHP
155 lines
5.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Topology;
|
|
|
|
use App\Http\Controllers\ApiController;
|
|
use App\Http\Requests\Topology\IndexTopologyRequest;
|
|
use App\Http\Requests\Topology\StoreCustomerConnectionRequest;
|
|
use App\Http\Requests\Topology\StoreTopologyRequest;
|
|
use App\Http\Requests\Topology\UpdateTopologyRequest;
|
|
use App\Http\Resources\Topology\TopologyResource;
|
|
use App\Models\Customer;
|
|
use App\Models\TopologyNode;
|
|
use App\Models\TopologyPort;
|
|
use App\Services\Topology\TopologyService;
|
|
use Illuminate\Http\Request;
|
|
|
|
class TopologyController extends ApiController
|
|
{
|
|
public function __construct(protected TopologyService $service) {}
|
|
|
|
public function index(IndexTopologyRequest $request)
|
|
{
|
|
return $this->successPaginated(
|
|
$this->service->list($this->resource($request), $request->validated(), $request->user(), $this->tenantId($request)),
|
|
TopologyResource::class,
|
|
'Daftar topologi berhasil diambil',
|
|
);
|
|
}
|
|
|
|
public function store(StoreTopologyRequest $request)
|
|
{
|
|
return $this->created(
|
|
new TopologyResource($this->service->create($this->resource($request), $request->validated(), $request->user(), $this->tenantId($request))),
|
|
'Data topologi berhasil dibuat',
|
|
);
|
|
}
|
|
|
|
public function show(Request $request, int $id)
|
|
{
|
|
$model = $this->service->find($this->resource($request), $id);
|
|
$this->authorizeModel($request, $model);
|
|
|
|
return $this->success(new TopologyResource($model), 'Detail topologi berhasil diambil');
|
|
}
|
|
|
|
public function update(UpdateTopologyRequest $request, int $id)
|
|
{
|
|
$resource = $this->resource($request);
|
|
$model = $this->service->find($resource, $id);
|
|
$this->authorizeModel($request, $model, true);
|
|
|
|
return $this->updated(
|
|
new TopologyResource($this->service->update($resource, $model, $request->validated(), $request->user())),
|
|
'Data topologi berhasil diperbarui',
|
|
);
|
|
}
|
|
|
|
public function destroy(Request $request, int $id)
|
|
{
|
|
$resource = $this->resource($request);
|
|
$model = $this->service->find($resource, $id);
|
|
$this->authorizeModel($request, $model, true);
|
|
$this->service->delete($resource, $model);
|
|
|
|
return $this->deleted('Data topologi berhasil dihapus');
|
|
}
|
|
|
|
public function options(Request $request)
|
|
{
|
|
return $this->success($this->service->options($request->user(), $this->tenantId($request)), 'Pilihan topologi berhasil diambil');
|
|
}
|
|
|
|
public function map(IndexTopologyRequest $request)
|
|
{
|
|
return $this->success($this->service->map($request->validated(), $request->user(), $this->tenantId($request)), 'Data peta topologi berhasil diambil');
|
|
}
|
|
|
|
public function ports(Request $request, TopologyNode $node)
|
|
{
|
|
$this->authorizeTenant($request, $node->tenant_id);
|
|
|
|
return $this->success($this->service->ports($node), 'Daftar port berhasil diambil');
|
|
}
|
|
|
|
public function storePort(StoreTopologyRequest $request, TopologyNode $node)
|
|
{
|
|
$this->authorizeTenant($request, $node->tenant_id);
|
|
|
|
return $this->created($this->service->createPort($node, $request->validated()), 'Port berhasil dibuat');
|
|
}
|
|
|
|
public function updatePort(UpdateTopologyRequest $request, TopologyPort $port)
|
|
{
|
|
$this->authorizeTenant($request, $port->tenant_id);
|
|
|
|
return $this->updated($this->service->updatePort($port, $request->validated()), 'Port berhasil diperbarui');
|
|
}
|
|
|
|
public function destroyPort(Request $request, TopologyPort $port)
|
|
{
|
|
$this->authorizeTenant($request, $port->tenant_id);
|
|
$this->service->deletePort($port);
|
|
|
|
return $this->deleted('Port berhasil dihapus');
|
|
}
|
|
|
|
public function trace(Request $request, TopologyNode $node, string $direction)
|
|
{
|
|
abort_unless(in_array($direction, ['upstream', 'downstream'], true), 404);
|
|
$this->authorizeTenant($request, $node->tenant_id);
|
|
|
|
return $this->success($this->service->trace($node, $direction), 'Jalur topologi berhasil ditelusuri');
|
|
}
|
|
|
|
public function connectCustomer(StoreCustomerConnectionRequest $request)
|
|
{
|
|
return $this->created(
|
|
$this->service->connectCustomer($request->validated(), $request->user(), $this->tenantId($request)),
|
|
'Customer berhasil dihubungkan ke ODP',
|
|
);
|
|
}
|
|
|
|
public function customerPath(Request $request, Customer $customer)
|
|
{
|
|
$this->authorizeTenant($request, $customer->tenant_id);
|
|
|
|
return $this->success($this->service->customerPath($customer), 'Jalur customer berhasil ditelusuri');
|
|
}
|
|
|
|
private function resource(Request $request): string
|
|
{
|
|
return $request->route()->defaults['topology_resource'];
|
|
}
|
|
|
|
private function tenantId(Request $request): ?int
|
|
{
|
|
return $request->attributes->get('tenant_id');
|
|
}
|
|
|
|
private function authorizeModel(Request $request, $model, bool $write = false): void
|
|
{
|
|
if ($model->tenant_id === null) {
|
|
abort_if($write && ! $request->user()->isMasterAdmin(), 403);
|
|
|
|
return;
|
|
}
|
|
$this->authorizeTenant($request, $model->tenant_id);
|
|
}
|
|
|
|
private function authorizeTenant(Request $request, int $tenantId): void
|
|
{
|
|
abort_unless($request->user()->isMasterAdmin() || $tenantId === $this->tenantId($request), 403);
|
|
}
|
|
}
|