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.', verificationStatus: $this->verificationStatusForReason($reasonCode), ); } if ($response->successful()) { return HealthResult::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.', verificationStatus: $this->verificationStatusForReason($reasonCode), meta: [ 'http_status' => $response->status, ], ); } private function reasonCodeForResponse(GraphResponse $response): string { $candidate = match ((int) ($response->status ?? 0)) { 401 => ProviderReasonCodes::ProviderAuthFailed, 403 => ProviderReasonCodes::ProviderPermissionDenied, 429 => ProviderReasonCodes::RateLimited, 500, 502, 503, 504 => ProviderReasonCodes::NetworkUnreachable, default => ProviderReasonCodes::UnknownError, }; return RunFailureSanitizer::normalizeReasonCode($candidate); } 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 verificationStatusForReason(string $reasonCode): string { return match ($reasonCode) { ProviderReasonCodes::RateLimited => ProviderVerificationStatus::Degraded->value, ProviderReasonCodes::ProviderConsentMissing, ProviderReasonCodes::ProviderConsentFailed, ProviderReasonCodes::ProviderConsentRevoked => ProviderVerificationStatus::Blocked->value, default => ProviderVerificationStatus::Error->value, }; } }