username !== '' && $this->token !== ''; } /** * @return array date (Y-m-d) => contribution count */ public function fetch(): array { $from = (new \DateTimeImmutable('-365 days'))->format('Y-m-d\T00:00:00\Z'); $to = (new \DateTimeImmutable())->format('Y-m-d\T23:59:59\Z'); /** @var GraphQLApiClient $graphqlClient */ $graphqlClient = $this->registry->get('github'); $query = $graphqlClient->buildQuery( ['user' => ['login' => $this->username]], [ 'contributionsCollection' => [ '_parameters' => ['from' => $from, 'to' => $to], 'contributionCalendar' => [ 'weeks' => [ 'contributionDays' => ['date', 'contributionCount'], ], ], ], ] )->getGraphQLQuery(); // GitHub's GraphQL API requires application/json — the bundle's built-in // transport sends form_params, so we use Symfony HttpClient here instead. $response = $this->client->request('POST', self::GRAPHQL_URL, [ 'headers' => [ 'Authorization' => "Bearer {$this->token}", 'Content-Type' => 'application/json', ], 'json' => ['query' => $query], ]); $data = $response->toArray(); if (isset($data['errors'])) { throw new \RuntimeException('GitHub GraphQL error: ' . json_encode($data['errors'])); } $result = []; $weeks = $data['data']['user']['contributionsCollection']['contributionCalendar']['weeks'] ?? []; foreach ($weeks as $week) { foreach ($week['contributionDays'] as $day) { if ($day['contributionCount'] > 0) { $result[$day['date']] = $day['contributionCount']; } } } return $result; } }