gateway->getOrganization($connection); } catch (Throwable $throwable) { $message = RunFailureSanitizer::sanitizeMessage($throwable->getMessage()); $reasonCode = RunFailureSanitizer::normalizeReasonCode($throwable->getMessage()); return HealthResult::failed( reasonCode: $reasonCode, message: $message !== '' ? $message : 'Health check failed.', status: $this->statusForReason($reasonCode), healthStatus: $this->healthForReason($reasonCode), ); } if ($response->successful()) { return HealthResult::ok( status: 'connected', healthStatus: 'ok', meta: [ 'organization_id' => $response->data['id'] ?? null, 'organization_display_name' => $response->data['displayName'] ?? null, ], ); } $reasonCode = $this->reasonCodeForResponse($response); $message = RunFailureSanitizer::sanitizeMessage($this->messageForResponse($response)); return HealthResult::failed( reasonCode: $reasonCode, message: $message !== '' ? $message : 'Health check failed.', status: $this->statusForReason($reasonCode), healthStatus: $this->healthForReason($reasonCode), meta: [ 'http_status' => $response->status, ], ); } private function reasonCodeForResponse(GraphResponse $response): string { return match ((int) ($response->status ?? 0)) { 401 => RunFailureSanitizer::REASON_PROVIDER_AUTH_FAILED, 403 => RunFailureSanitizer::REASON_PERMISSION_DENIED, 429 => RunFailureSanitizer::REASON_GRAPH_THROTTLED, 500, 502 => RunFailureSanitizer::REASON_PROVIDER_OUTAGE, 503, 504 => RunFailureSanitizer::REASON_GRAPH_TIMEOUT, default => RunFailureSanitizer::REASON_UNKNOWN_ERROR, }; } private function messageForResponse(GraphResponse $response): string { $error = $response->errors[0] ?? null; if (is_string($error)) { return $error; } if (is_array($error)) { $message = $error['message'] ?? null; if (is_string($message) && $message !== '') { return $message; } return json_encode($error, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) ?: 'Health check failed.'; } return 'Health check failed.'; } private function statusForReason(string $reasonCode): string { return match ($reasonCode) { RunFailureSanitizer::REASON_PROVIDER_AUTH_FAILED, RunFailureSanitizer::REASON_PERMISSION_DENIED => 'needs_consent', default => 'error', }; } private function healthForReason(string $reasonCode): string { return match ($reasonCode) { RunFailureSanitizer::REASON_GRAPH_THROTTLED => 'degraded', RunFailureSanitizer::REASON_GRAPH_TIMEOUT, RunFailureSanitizer::REASON_PROVIDER_OUTAGE => 'down', RunFailureSanitizer::REASON_PROVIDER_AUTH_FAILED, RunFailureSanitizer::REASON_PERMISSION_DENIED => 'down', default => 'down', }; } }