mirror of
https://github.com/coollabsio/coolify.git
synced 2026-08-28 10:05:25 -05:00
Split V5 dashboard behavior into domain controllers and policies, add agent token rotation/revocation, status reconciliation jobs, ingress firewall syncing, and canvas connection APIs. Add migrations for V5 status tracking, server capabilities, resource connection aliases, and revoked agent tokens.
88 lines
3.4 KiB
PHP
88 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Support\V5;
|
|
|
|
use App\Models\V5\Application as V5Application;
|
|
use App\Models\V5\Server as V5Server;
|
|
|
|
/**
|
|
* Single source of truth for the canvas resource payloads served by the
|
|
* dashboard Inertia props and broadcast by V5CanvasResourceUpdated — the two
|
|
* must stay identical for websocket vs. initial-load parity.
|
|
*/
|
|
class CanvasResourceSerializer
|
|
{
|
|
public const CARD_WIDTH = 320;
|
|
|
|
public const CARD_HEIGHT = 144;
|
|
|
|
public const CARD_GAP = 32;
|
|
|
|
/**
|
|
* @return array<string, mixed>
|
|
*/
|
|
public function serializeApplication(V5Application $application): array
|
|
{
|
|
$application->loadMissing(['server', 'domains', 'project', 'environment']);
|
|
$server = $application->server;
|
|
$isServerReachable = ! $server instanceof V5Server || $this->isServerReachable($server);
|
|
|
|
return [
|
|
'id' => $application->uuid,
|
|
'name' => $application->name,
|
|
'image' => $application->image,
|
|
'containerName' => $application->container_name,
|
|
'status' => $application->status,
|
|
'statusMessage' => $application->status_message,
|
|
'effectiveStatus' => $isServerReachable ? $application->status : 'unknown',
|
|
'effectiveStatusMessage' => $isServerReachable
|
|
? $application->status_message
|
|
: $this->serverStatusMessage($server),
|
|
'runtimeContainerId' => $application->runtime_container_id,
|
|
'serverName' => $server?->name,
|
|
'serverStatus' => $server?->status,
|
|
'serverStatusMessage' => $server instanceof V5Server ? $this->serverStatusMessage($server) : null,
|
|
'isServerReachable' => $isServerReachable,
|
|
'serverIngressEnabled' => (bool) $server?->isIngress(),
|
|
'meshNamespace' => $application->mesh_namespace,
|
|
'ingressEnabled' => $application->ingress_enabled,
|
|
'internalPort' => $application->internal_port,
|
|
'domains' => $application->domains->pluck('domain')->values()->all(),
|
|
'meshFqdn' => $application->container_name.'.'.($application->mesh_namespace ?: 'default').'.coolify.internal',
|
|
'projectUuid' => $application->project?->uuid,
|
|
'environmentUuid' => $application->environment?->uuid,
|
|
'canvasX' => $application->canvas_x,
|
|
'canvasY' => $application->canvas_y,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @return array<string, mixed>
|
|
*/
|
|
public function serializeCaddyIngress(V5Server $server, int $index = 0): array
|
|
{
|
|
$isServerReachable = $this->isServerReachable($server);
|
|
|
|
return [
|
|
'id' => $server->uuid,
|
|
'name' => $server->name,
|
|
'host' => $server->host,
|
|
'type' => $server->ingressType(),
|
|
'status' => $isServerReachable ? $server->ingressStatus() : 'unreachable',
|
|
'statusMessage' => $isServerReachable ? null : $this->serverStatusMessage($server),
|
|
'canvasX' => $server->canvas_x ?? -(self::CARD_WIDTH + self::CARD_GAP),
|
|
'canvasY' => $server->canvas_y ?? $index * (self::CARD_HEIGHT + self::CARD_GAP),
|
|
];
|
|
}
|
|
|
|
private function isServerReachable(V5Server $server): bool
|
|
{
|
|
return $server->status !== 'unreachable';
|
|
}
|
|
|
|
private function serverStatusMessage(?V5Server $server): ?string
|
|
{
|
|
return $server?->last_status_output ?: null;
|
|
}
|
|
}
|