-
-
Notifications
You must be signed in to change notification settings - Fork 27
/
GithubSponsors.php
77 lines (67 loc) · 2.31 KB
/
GithubSponsors.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
73
74
75
76
77
<?php
namespace App\View\Components\Web;
use App\Models\Organization;
use App\Models\User;
use App\View\Concerns\CachedView;
use Carbon\CarbonInterval;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
use Illuminate\View\Component;
class GithubSponsors extends Component
{
use CachedView;
public function __construct()
{
$this->ttl = CarbonInterval::minutes(15);
}
public function sponsors(): Collection
{
$query = <<<'GRAPHQL'
{
viewer {
sponsorshipsAsMaintainer(first: 100) {
nodes {
sponsorEntity {
__typename
... on User {
databaseId
login
}
... on Organization {
databaseId
login
}
}
}
}
}
}
GRAPHQL;
return Http::baseUrl('https://api.github.com')
->accept('application/vnd.github.v3+json')
->withToken(config('services.github.sponsors_access_token'))
->withUserAgent(config('app.name').' '.config('app.url'))
->withOptions(['http_errors' => true])
->post('/graphql', ['query' => $query])
->collect('data.viewer.sponsorshipsAsMaintainer.nodes.*.sponsorEntity')
->map(function (array $sponsor) {
$sponsor['id'] = $sponsor['databaseId'];
if ($sponsor['__typename'] === 'User') {
return User::fromGithub($sponsor);
}
if ($sponsor['__typename'] === 'Organization') {
return Organization::fromGithub($sponsor);
}
return null;
})
->filter()
->sortBy(fn (User | Organization $sponsor) => Str::lower($sponsor->name))
->values();
}
protected function view(): View
{
return view('components.web.github-sponsors');
}
}