diff --git a/app/Filament/Widgets/DokployPlatformHealth.php b/app/Filament/Widgets/DokployPlatformHealth.php index f582339..93a6acb 100644 --- a/app/Filament/Widgets/DokployPlatformHealth.php +++ b/app/Filament/Widgets/DokployPlatformHealth.php @@ -52,6 +52,7 @@ class DokployPlatformHealth extends Widget $applicationsPayload = Arr::get($project, 'applications', []); $applications = $this->formatApplications(is_array($applicationsPayload) ? $applicationsPayload : [], $client); + $composes = $this->formatProjectComposes($project, $client); $services = $this->formatProjectServices($project); $results[] = [ @@ -59,11 +60,13 @@ class DokployPlatformHealth extends Widget 'project_id' => Arr::get($project, 'projectId', $projectId), 'name' => Arr::get($project, 'name') ?? Arr::get($project, 'projectName') ?? (string) $projectId, 'description' => Arr::get($project, 'description'), - 'status' => $this->deriveProjectStatus($applications, $services), + 'status' => $this->deriveProjectStatus($applications, $services, $composes), 'applications' => $applications, + 'composes' => $composes, 'services' => $services, 'updated_at' => Arr::get($project, 'updatedAt') ?? Arr::get($project, 'createdAt'), 'applications_count' => count($applications), + 'composes_count' => count($composes), 'services_count' => count($services), ]; } @@ -204,6 +207,52 @@ class DokployPlatformHealth extends Widget ->all(); } + protected function formatProjectComposes(array $project, DokployClient $client): array + { + $composes = (array) Arr::get($project, 'compose', []); + + return collect($composes) + ->map(function (array $compose) use ($client) { + $composeId = Arr::get($compose, 'composeId') ?? Arr::get($compose, 'id'); + $statusPayload = []; + $deployments = []; + + if ($composeId) { + try { + $statusPayload = $client->composeStatus($composeId); + $deployments = $client->composeDeployments($composeId, 1); + } catch (\Throwable $exception) { + $statusPayload = []; + $deployments = []; + } + } + + $composeDetails = Arr::get($statusPayload, 'compose', []); + + return [ + 'id' => $composeId, + 'name' => Arr::get($compose, 'name') + ?? Arr::get($compose, 'appName') + ?? Arr::get($composeDetails, 'name') + ?? Arr::get($composeDetails, 'appName') + ?? $composeId, + 'status' => Arr::get($compose, 'composeStatus') + ?? Arr::get($compose, 'status') + ?? Arr::get($composeDetails, 'composeStatus') + ?? Arr::get($composeDetails, 'status') + ?? 'unknown', + 'last_deploy' => Arr::get($deployments, '0.createdAt') + ?? Arr::get($deployments, '0.created_at') + ?? Arr::get($compose, 'updatedAt') + ?? Arr::get($composeDetails, 'updatedAt'), + 'services' => $this->formatServices(Arr::get($statusPayload, 'services', [])), + ]; + }) + ->filter(fn (array $compose) => filled($compose['name'])) + ->values() + ->all(); + } + protected function normalizeServiceList(array $services, string $type, string $idKey, string $statusKey): array { return collect($services) @@ -246,11 +295,12 @@ class DokployPlatformHealth extends Widget return $metrics; } - protected function deriveProjectStatus(array $applications, array $services): string + protected function deriveProjectStatus(array $applications, array $services, array $composes): string { $statuses = collect($applications) ->pluck('status') ->merge(collect($services)->pluck('status')) + ->merge(collect($composes)->pluck('status')) ->filter() ->map(fn ($status) => strtolower((string) $status)) ->values(); diff --git a/resources/views/filament/widgets/dokploy-platform-health.blade.php b/resources/views/filament/widgets/dokploy-platform-health.blade.php index a8fd7eb..1538525 100644 --- a/resources/views/filament/widgets/dokploy-platform-health.blade.php +++ b/resources/views/filament/widgets/dokploy-platform-health.blade.php @@ -83,6 +83,9 @@ Apps: {{ $project['applications_count'] ?? 0 }} + + Composes: {{ $project['composes_count'] ?? 0 }} + Services: {{ $project['services_count'] ?? 0 }} @@ -158,6 +161,55 @@ @endforelse +
+ + Composes + + + @forelse($project['composes'] as $compose) +
+ + {{ $compose['name'] ?? 'Compose' }} + @if(!empty($compose['status'])) + ({{ strtoupper($compose['status']) }}) + @endif + + +
+ @if(!empty($compose['id'])) + + {{ $compose['id'] }} + + @endif + + Last deploy: + {{ $compose['last_deploy'] ? \Illuminate\Support\Carbon::parse($compose['last_deploy'])->diffForHumans() : '—' }} + +
+ + @if(!empty($compose['services'])) +
+ @foreach($compose['services'] as $service) + + {{ $service['name'] }}: {{ strtoupper($service['status'] ?? 'N/A') }} + + @endforeach +
+ @endif +
+ @empty + + No composes reported. + + @endforelse +
+
Services diff --git a/tests/Feature/DokployPlatformHealthWidgetTest.php b/tests/Feature/DokployPlatformHealthWidgetTest.php index eb25448..8108a6c 100644 --- a/tests/Feature/DokployPlatformHealthWidgetTest.php +++ b/tests/Feature/DokployPlatformHealthWidgetTest.php @@ -40,6 +40,13 @@ class DokployPlatformHealthWidgetTest extends TestCase 'branch' => 'main', ], ], + 'compose' => [ + [ + 'composeId' => 'cmp_1', + 'name' => 'Main Compose', + 'composeStatus' => 'done', + ], + ], 'redis' => [ [ 'redisId' => 'redis_1', @@ -63,12 +70,37 @@ class DokployPlatformHealthWidgetTest extends TestCase ], ]); + $fakeClient->shouldReceive('composeStatus') + ->with('cmp_1') + ->andReturn([ + 'compose' => [ + 'name' => 'Main Compose', + 'composeStatus' => 'done', + 'updatedAt' => now()->toIso8601String(), + ], + 'services' => [ + [ + 'serviceName' => 'web', + 'status' => 'running', + ], + ], + ]); + + $fakeClient->shouldReceive('composeDeployments') + ->with('cmp_1', 1) + ->andReturn([ + [ + 'createdAt' => now()->toIso8601String(), + ], + ]); + $this->app->instance(DokployClient::class, $fakeClient); Livewire::test(DokployPlatformHealth::class) ->assertStatus(200) ->assertSee('Core') ->assertSee('API') + ->assertSee('Main Compose') ->assertSee('Redis'); }