route('destination.index'); } $this->destination = $destination; $this->syncData(); $this->loadResources(); } catch (\Throwable $e) { return handleError($e, $this); } } public function loadResources(): void { if ($this->destination->getMorphClass() !== \App\Models\StandaloneDocker::class) { return; } $this->resources = $this->collectResources([ $this->destination->applications, $this->destination->services, $this->destination->postgresqls, $this->destination->redis, $this->destination->mongodbs, $this->destination->mysqls, $this->destination->mariadbs, $this->destination->keydbs, $this->destination->dragonflies, $this->destination->clickhouses, ]); } protected function collectResources(array $groups): array { $rows = []; foreach ($groups as $group) { foreach ($group as $resource) { $rows[] = $this->resourceRow($resource); } } return $rows; } protected function resourceRow($resource): array { $type = match (true) { $resource instanceof \App\Models\Application => 'application', $resource instanceof \App\Models\Service => 'service', default => 'database', }; $environment = $resource->environment; $project = $environment?->project; $routeName = "project.{$type}.configuration"; $url = ($project && $environment) ? route($routeName, [ 'project_uuid' => $project->uuid, 'environment_uuid' => $environment->uuid, "{$type}_uuid" => $resource->uuid, ]) : null; return [ 'type' => $type, 'name' => $resource->name, 'project' => $project?->name, 'environment' => $environment?->name, 'url' => $url, ]; } public function syncData(bool $toModel = false) { if ($toModel) { $this->validate(); $this->destination->name = $this->name; $this->destination->network = $this->network; $this->destination->server->ip = $this->serverIp; $this->destination->save(); } else { $this->name = $this->destination->name; $this->network = $this->destination->network; $this->serverIp = $this->destination->server->ip; } } public function submit() { try { $this->authorize('update', $this->destination); $this->syncData(true); $this->dispatch('success', 'Destination saved.'); } catch (\Throwable $e) { return handleError($e, $this); } } public function delete() { try { $this->authorize('delete', $this->destination); if ($this->destination->getMorphClass() === StandaloneDocker::class) { if ($this->destination->attachedTo()) { return $this->dispatch('error', 'You must delete all resources before deleting this destination.'); } $safeNetwork = escapeshellarg($this->destination->network); instant_remote_process(["docker network disconnect {$safeNetwork} coolify-proxy"], $this->destination->server, throwError: false); instant_remote_process(["docker network rm -f {$safeNetwork}"], $this->destination->server); } $this->destination->delete(); return redirect()->route('destination.index'); } catch (\Throwable $e) { return handleError($e, $this); } } public function render() { return view('livewire.destination.show'); } }