From 65f2536e255d074e64d86abc9688ce806d0fc9e4 Mon Sep 17 00:00:00 2001 From: Irfan Date: Mon, 21 Jun 2021 09:41:32 +0500 Subject: [PATCH] WIP: Fetch backer list from patreon API --- .../Controllers/V4DB/PatreonController.php | 119 ++++++++++++++++++ app/Http/Resources/V4/AnimeCollection.php | 2 +- bootstrap/app.php | 1 + routes/web.v4.php | 25 ++++ 4 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/V4DB/PatreonController.php diff --git a/app/Http/Controllers/V4DB/PatreonController.php b/app/Http/Controllers/V4DB/PatreonController.php new file mode 100644 index 0000000..dbe221e --- /dev/null +++ b/app/Http/Controllers/V4DB/PatreonController.php @@ -0,0 +1,119 @@ +get('code'); + + if (!empty($code)) { + $oauthClient = new OAuth(env('PATREON_CLIENT_ID'), env('PATREON_CLIENT_SECRET')); + $tokens = $oauthClient->get_tokens($code, env('APP_URL').'/v4/patreon/oauth'); + + $accessToken = $tokens['access_token'] ?? ''; + $refreshToken = $tokens['refresh_token'] ?? ''; + } + + if (empty($accessToken)) { + return response()->json([ + 'error' => 'Invalid access token' + ], 400); + } + + if (env('PATREON') && env('CACHING') && env('CACHE_DRIVER') == 'redis') { + app('redis')->set('patreon:access_token', $accessToken); + app('redis')->set('patreon:refresh_token', $refreshToken); + } + } + + public function url(Request $request) { + $href = (new \Patreon\AuthUrl(env('PATREON_CLIENT_ID'))) + ->withRedirectUri(env('APP_URL').'/v4/patreon/oauth') + ->withScopes([ + 'campaigns', 'campaigns.members', 'identity.memberships' + ]); + + return response()->json([ + 'url' => $href->buildUrl() + ]); + } + + /** + * @throws \Patreon\Exceptions\CurlException + * @throws \Patreon\Exceptions\APIException + * @throws \SodiumException + */ + public function campaigns(Request $request) { + if (env('PATREON') && env('CACHING') && env('CACHE_DRIVER') == 'redis') { + $patreon = new \Patreon\API(app('redis')->get('patreon:access_token')); + $campaigns = $patreon->fetch_campaigns(); + + return response()->json($campaigns); + } + } + + public function pledges(Request $request) { + $campaignId = $request->get('campaign_id'); + + if (env('PATREON') && env('CACHING') && env('CACHE_DRIVER') == 'redis') { + $patreon = new \Patreon\API(app('redis')->get('patreon:access_token')); + $pledges = $patreon->fetch_page_of_members_from_campaign($campaignId, 100, 0); + + // @todo Patreon doesnt return list of all active backers for some reason! + // Need to look into this, might have to scrape or try out webhooks + $pledges = $patreon->get_data( + 'campaigns/'.$campaignId.'/members', + [ + 'page' => [ + 'count' => 50 + ], + 'include' => 'currently_entitled_tiers', + 'fields' => [ + 'member' => implode(',', [ + 'full_name', + 'patron_status', + 'lifetime_support_cents' + ]), + 'tier' => implode(',', [ + 'patron_count', + 'title' + ]) + ] + ] + ); + + + $backers = []; + foreach ($pledges['data'] as $pledge) { + if ($pledge['attributes']['patron_status'] !== 'active_patron') { + continue; + } + + $backers[] = [ + 'full_name' => $pledge['attributes']['full_name'], + 'lifetime_support_cents' => $pledge['attributes']['lifetime_support_cents'], + ]; + + } + + usort($backers, function ($item1, $item2) { + return $item2['lifetime_support_cents'] <=> $item1['lifetime_support_cents']; + }); + + foreach ($backers as &$backer) { + $backer = trim($backer['full_name']); + } + + return response()->json([ + 'backers' => implode(", ", $backers) + ]); + } + } +} \ No newline at end of file diff --git a/app/Http/Resources/V4/AnimeCollection.php b/app/Http/Resources/V4/AnimeCollection.php index 51a02a8..7245a97 100644 --- a/app/Http/Resources/V4/AnimeCollection.php +++ b/app/Http/Resources/V4/AnimeCollection.php @@ -37,7 +37,7 @@ class AnimeCollection extends ResourceCollection private $pagination; - public function __construct(LengthAwarePaginator $resource) + public function __construct($resource) { $this->pagination = [ 'last_visible_page' => $resource->lastPage(), diff --git a/bootstrap/app.php b/bootstrap/app.php index 5b50786..c7d60d6 100755 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -116,6 +116,7 @@ $app->instance('JikanParser', $jikan); $app->instance('SerializerV4', SerializerFactory::createV4()); + /* |-------------------------------------------------------------------------- | Load The Application Routes diff --git a/routes/web.v4.php b/routes/web.v4.php index 21e0d4c..0f3a47b 100755 --- a/routes/web.v4.php +++ b/routes/web.v4.php @@ -22,6 +22,31 @@ $router->get('/', function () use ($router) { ]); }); +/*$router->group( @todo secure sensitive endpoints + [ + 'prefix' => 'patreon' + ], + function () use ($router) { + $router->get('/oauth', [ + 'uses' => 'PatreonController@login' + ]); + + $router->get('/url', [ + 'uses' => 'PatreonController@url' + ]); + + $router->get('/campaigns', [ + 'uses' => 'PatreonController@campaigns' + ]); + + $router->get('/pledges', [ + 'uses' => 'PatreonController@pledges' + ]); + } +);*/ + + + $router->get('/anime', [ 'uses' => 'SearchController@anime' ]);