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