-
-
Notifications
You must be signed in to change notification settings - Fork 30
/
Copy pathSyncUserContributions.php
72 lines (60 loc) · 1.85 KB
/
SyncUserContributions.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
namespace App\Jobs;
use App\Models\Repository;
use App\Models\User;
use Carbon\CarbonImmutable;
use Carbon\CarbonInterval;
class SyncUserContributions extends GithubJob
{
public function __construct(protected User $user)
{
parent::__construct();
$this->timeout = CarbonInterval::minutes(5)->totalSeconds;
}
public function run(): void
{
if (! $this->user->hasGithubToken()) {
return;
}
$end = CarbonImmutable::now();
do {
$start = $end->subMonths(3);
$response = $this->user->github()->post('/graphql', [
'query' => $this->query(),
'variables' => [
'from' => $start->startOfDay()->toIso8601ZuluString(),
'to' => $end->endOfDay()->toIso8601ZuluString(),
],
])->json('data.viewer.contributionsCollection');
foreach (data_get($response, 'commitContributionsByRepository.*.repository.nameWithOwner') as $name) {
$repository = Repository::fromName($name);
if ($repository === null) {
continue;
}
$repository->contributors()->syncWithoutDetaching($this->user);
}
$end = $start;
} while ($response['hasActivityInThePast']);
$this->user->touch();
}
protected function query(): string
{
return <<<'QUERY'
query(
$from: DateTime,
$to: DateTime
) {
viewer {
contributionsCollection(from: $from, to: $to) {
hasActivityInThePast
commitContributionsByRepository(maxRepositories: 100) {
repository {
nameWithOwner
}
}
}
}
}
QUERY;
}
}