wasChanged('status') && ! $server->wasChanged('ingress_type') && ! $server->wasChanged('ingress_status') ) { return; } if ($server->wasChanged('status') && $server->cluster_id !== null) { V5ClusterUpdated::dispatch($server->team_id, $server->cluster_id); } if ($server->isIngress()) { V5CanvasResourceUpdated::dispatch($server->team_id, null, $server->id); } }); } protected function casts(): array { return [ 'capabilities' => 'array', 'builder_enabled' => 'boolean', 'container_subnets' => 'array', 'canvas_x' => 'integer', 'canvas_y' => 'integer', 'last_bootstrapped_at' => 'datetime', 'last_bootstrap_ran_at' => 'datetime', 'last_status_checked_at' => 'datetime', ]; } public function hasCapability(string $capability): bool { return in_array($capability, $this->capabilities ?? [], true); } /** * @return array */ public function withCapability(string $capability): array { return collect($this->capabilities ?? []) ->push($capability) ->unique() ->values() ->all(); } /** * @return array */ public function withoutCapability(string $capability): array { return collect($this->capabilities ?? []) ->reject(fn (string $existingCapability) => $existingCapability === $capability) ->values() ->all(); } public function isIngress(): bool { return $this->hasCapability('ingress'); } public function ingressStatus(): string { if ($this->ingress_status !== null) { return $this->ingress_status; } return $this->status === 'installed' ? 'running' : 'unknown'; } public function ingressType(): string { return $this->ingress_type ?? 'caddy'; } public function cluster(): BelongsTo { return $this->belongsTo(Cluster::class); } public function team(): BelongsTo { return $this->belongsTo(Team::class); } public function creator(): BelongsTo { return $this->belongsTo(User::class, 'created_by_user_id'); } public function privateKey(): BelongsTo { return $this->belongsTo(PrivateKey::class); } }