From 78d0759611b2b61585051ba29ab342f6b90bddd7 Mon Sep 17 00:00:00 2001 From: Irfan Date: Wed, 27 Jul 2022 21:50:21 +0500 Subject: [PATCH] add anime videos episodes + pagination --- app/Http/Controllers/V4DB/AnimeController.php | 101 ++++++++++++++++++ .../Resources/V4/AnimeEpisodesResource.php | 10 +- config/controller.php | 6 +- routes/web.v4.php | 4 + 4 files changed, 116 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/V4DB/AnimeController.php b/app/Http/Controllers/V4DB/AnimeController.php index 2d17937..c4e8518 100644 --- a/app/Http/Controllers/V4DB/AnimeController.php +++ b/app/Http/Controllers/V4DB/AnimeController.php @@ -44,6 +44,7 @@ use Jikan\Request\Anime\AnimeRecommendationsRequest; use Jikan\Request\Anime\AnimeRequest; use Jikan\Request\Anime\AnimeReviewsRequest; use Jikan\Request\Anime\AnimeStatsRequest; +use Jikan\Request\Anime\AnimeVideosEpisodesRequest; use Jikan\Request\Anime\AnimeVideosRequest; use Laravel\Lumen\Http\ResponseFactory; use MongoDB\BSON\UTCDateTime; @@ -713,6 +714,106 @@ class AnimeController extends Controller ); } + /** + * @OA\Get( + * path="/anime/{id}/videos/episodes", + * operationId="getAnimeVideosEpisodes", + * tags={"anime"}, + * + * @OA\Parameter( + * name="id", + * in="path", + * required=true, + * @OA\Schema(type="integer") + * ), + * + * @OA\Parameter(ref="#/components/parameters/page"), + * + * @OA\Response( + * response="200", + * description="Returns videos related to the entry", + * @OA\JsonContent( + * ref="#/components/schemas/anime_videos_episodes" + * ) + * ), + * @OA\Response( + * response="400", + * description="Error: Bad request. When required parameters were not supplied.", + * ), + * + * + * @OA\Schema( + * schema="anime_videos_episodes", + * description="Anime Videos Episodes Resource", + * + * allOf={ + * @OA\Schema(ref="#/components/schemas/pagination"), + * @OA\Schema( + * @OA\Property( + * property="data", + * type="array", + * @OA\Items( + * type="object", + * @OA\Property( + * property="mal_id", + * type="integer", + * description="MyAnimeList ID or Episode Number" + * ), + * @OA\Property( + * property="title", + * type="string", + * description="Episode Title" + * ), + * @OA\Property( + * property="episode", + * type="string", + * description="Episode Subtitle" + * ), + * @OA\Property( + * property="url", + * type="string", + * description="Episode Page URL", + * ), + * @OA\Property( + * property="images", + * ref="#/components/schemas/common_images" + * ), + * ), + * ), + * ), + * } + * ) + * ) + */ + public function videosEpisodes(Request $request, int $id) + { + $results = DB::table($this->getRouteTable($request)) + ->where('request_hash', $this->fingerprint) + ->get(); + + + if ( + $results->isEmpty() + || $this->isExpired($request, $results) + ) { + $page = $request->get('page') ?? 1; + $anime = $this->jikan->getAnimeVideosEpisodes(new AnimeVideosEpisodesRequest($id, $page)); + $response = \json_decode($this->serializer->serialize($anime, 'json'), true); + + $results = $this->updateCache($request, $results, $response); + } + + $response = (new AnimeEpisodesResource( + $results->first() + ))->response(); + + return $this->prepareResponse( + $response, + $results, + $request + ); + } + /** * @OA\Get( * path="/anime/{id}/pictures", diff --git a/app/Http/Resources/V4/AnimeEpisodesResource.php b/app/Http/Resources/V4/AnimeEpisodesResource.php index 7ca4269..aba577e 100644 --- a/app/Http/Resources/V4/AnimeEpisodesResource.php +++ b/app/Http/Resources/V4/AnimeEpisodesResource.php @@ -15,9 +15,11 @@ class AnimeEpisodesResource extends JsonResource public function toArray($request) { return [ - 'last_visible_page' => $this['last_visible_page'] ?? 1, - 'has_next_page' => $this['has_next_page'] ?? false, - 'results' => $this['results'] + 'pagination' => [ + 'last_visible_page' => $this['last_visible_page'] ?? 1, + 'has_next_page' => $this['has_next_page'] ?? false, + ], + 'data' => $this['results'], ]; } -} \ No newline at end of file +} diff --git a/config/controller.php b/config/controller.php index bd394d1..0239d3a 100644 --- a/config/controller.php +++ b/config/controller.php @@ -41,6 +41,10 @@ return [ 'table_name' => 'anime_videos', 'ttl' => env('CACHE_DEFAULT_EXPIRE') ], + 'AnimeController@videosEpisodes' => [ + 'table_name' => 'anime_videos_episodes', + 'ttl' => env('CACHE_DEFAULT_EXPIRE') + ], 'AnimeController@pictures' => [ 'table_name' => 'anime_pictures', 'ttl' => env('CACHE_DEFAULT_EXPIRE') @@ -378,4 +382,4 @@ return [ 'ttl' => env('CACHE_DEFAULT_EXPIRE') ], -]; \ No newline at end of file +]; diff --git a/routes/web.v4.php b/routes/web.v4.php index 12d38cd..a68e0bb 100755 --- a/routes/web.v4.php +++ b/routes/web.v4.php @@ -67,6 +67,10 @@ $router->group( 'uses' => 'AnimeController@videos' ]); + $router->get('/videos/episodes', [ + 'uses' => 'AnimeController@videosEpisodes' + ]); + $router->get('/pictures', [ 'uses' => 'AnimeController@pictures' ]);