request($baseUrl, $token) ->get('/user') ->throw() ->json(); return new GitAuthenticatedUser( providerUserId: (string) $payload['id'], login: $payload['login'], name: blank($payload['full_name'] ?? null) ? null : $payload['full_name'], ); } /** * @return array */ public function listRepositories(string $baseUrl, string $token): array { $page = 1; $repositories = []; do { /** @var array $payload */ $payload = $this->request($baseUrl, $token) ->get('/user/repos', [ 'limit' => 100, 'page' => $page, ]) ->throw() ->json(); foreach ($payload as $repository) { $repositories[] = new GitRepository( providerRepositoryId: (string) $repository['id'], owner: $repository['owner']['login'], name: $repository['name'], fullName: $repository['full_name'], htmlUrl: $repository['html_url'], isPrivate: $repository['private'], ); } $page++; } while (count($payload) === 100); return $repositories; } private function request(string $baseUrl, string $token): PendingRequest { return Http::acceptJson() ->baseUrl($this->apiBaseUrl($baseUrl)) ->connectTimeout(5) ->timeout(10) ->withHeader('Authorization', 'token '.$token); } private function apiBaseUrl(string $baseUrl): string { $normalizedBaseUrl = Str::of(trim($baseUrl)) ->rtrim('/') ->value(); if (Str::endsWith(Str::lower($normalizedBaseUrl), '/api/v1')) { return $normalizedBaseUrl; } return Str::of($normalizedBaseUrl) ->append('/api/v1') ->value(); } }