diff --git a/app/Filament/Widgets/DokployPlatformHealth.php b/app/Filament/Widgets/DokployPlatformHealth.php index 93a6acb..6a6923a 100644 --- a/app/Filament/Widgets/DokployPlatformHealth.php +++ b/app/Filament/Widgets/DokployPlatformHealth.php @@ -33,17 +33,39 @@ class DokployPlatformHealth extends Widget } foreach ($projectMap as $label => $projectId) { - $project = $client->findProject((string) $projectId); + $project = []; + $projectIdString = (string) $projectId; + + try { + $project = $client->project($projectIdString); + } catch (\Throwable $exception) { + $project = []; + } + + if (empty($project)) { + $project = $client->findProject($projectIdString) ?? []; + + $resolvedProjectId = Arr::get($project, 'projectId'); + + if ($resolvedProjectId) { + try { + $project = $client->project((string) $resolvedProjectId); + } catch (\Throwable $exception) { + $project = $project; + } + } + } if (! $project) { $results[] = [ 'label' => ucfirst((string) $label), - 'project_id' => (string) $projectId, - 'name' => (string) $projectId, + 'project_id' => $projectIdString, + 'name' => $projectIdString, 'status' => 'unreachable', - 'error' => "Project {$projectId} not found.", + 'error' => "Project {$projectIdString} not found.", 'applications' => [], 'services' => [], + 'composes' => [], 'updated_at' => null, ]; @@ -57,8 +79,8 @@ class DokployPlatformHealth extends Widget $results[] = [ 'label' => ucfirst((string) $label), - 'project_id' => Arr::get($project, 'projectId', $projectId), - 'name' => Arr::get($project, 'name') ?? Arr::get($project, 'projectName') ?? (string) $projectId, + 'project_id' => Arr::get($project, 'projectId', $projectIdString), + 'name' => Arr::get($project, 'name') ?? Arr::get($project, 'projectName') ?? $projectIdString, 'description' => Arr::get($project, 'description'), 'status' => $this->deriveProjectStatus($applications, $services, $composes), 'applications' => $applications, diff --git a/app/Services/Dokploy/DokployClient.php b/app/Services/Dokploy/DokployClient.php index fd332cb..3b696b1 100644 --- a/app/Services/Dokploy/DokployClient.php +++ b/app/Services/Dokploy/DokployClient.php @@ -49,6 +49,17 @@ class DokployClient }, 60); } + public function project(string $projectId): array + { + return $this->cached($this->projectCacheKey($projectId), function () use ($projectId) { + $project = $this->get('/project.one', [ + 'projectId' => $projectId, + ]); + + return is_array($project) ? $project : []; + }, 60); + } + public function findProject(string $projectIdOrName): ?array { $projects = $this->projects(); @@ -357,6 +368,11 @@ class DokployClient return 'dokploy.projects'; } + protected function projectCacheKey(string $projectId): string + { + return "dokploy.project.{$projectId}"; + } + protected function forgetApplicationCaches(string $applicationId): void { Cache::forget($this->applicationCacheKey($applicationId)); diff --git a/tests/Feature/DokployPlatformHealthWidgetTest.php b/tests/Feature/DokployPlatformHealthWidgetTest.php index 8108a6c..b880338 100644 --- a/tests/Feature/DokployPlatformHealthWidgetTest.php +++ b/tests/Feature/DokployPlatformHealthWidgetTest.php @@ -24,7 +24,7 @@ class DokployPlatformHealthWidgetTest extends TestCase ]); $fakeClient = Mockery::mock(DokployClient::class); - $fakeClient->shouldReceive('findProject') + $fakeClient->shouldReceive('project') ->with('proj_1') ->andReturn([ 'projectId' => 'proj_1',