Files
2026-07-31 13:57:11 +07:00

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);
}
}