From d20d0ef5da94af0278259f10cb882a4171535982 Mon Sep 17 00:00:00 2001 From: Irfan Date: Fri, 10 Jul 2020 20:58:07 +0500 Subject: [PATCH] add Anime/Manga Advanced Search Pagination, Limit Order By + Sort Query Letter --- app/GenreAnime.php | 54 +++++++++++++ app/GenreManga.php | 54 +++++++++++++ app/Http/Controllers/V4DB/GenreController.php | 77 +++++++++++++++++-- .../QueryBuilder/SearchQueryBuilderGenre.php | 64 +++++++++++++++ app/Http/Resources/V4/GenreCollection.php | 33 ++++++++ app/Http/Resources/V4/GenreResource.php | 24 ++++++ app/Providers/SearchQueryBuilder.php | 2 +- config/controller.php | 10 ++- routes/web.v4.php | 4 +- 9 files changed, 311 insertions(+), 11 deletions(-) create mode 100644 app/GenreAnime.php create mode 100644 app/GenreManga.php create mode 100644 app/Http/QueryBuilder/SearchQueryBuilderGenre.php create mode 100644 app/Http/Resources/V4/GenreCollection.php create mode 100644 app/Http/Resources/V4/GenreResource.php diff --git a/app/GenreAnime.php b/app/GenreAnime.php new file mode 100644 index 0000000..380066b --- /dev/null +++ b/app/GenreAnime.php @@ -0,0 +1,54 @@ +getAnimeGenres(new AnimeGenresRequest()); + + return json_decode( + app('SerializerV4') + ->serialize($data, 'json'), + true + ); + } +} \ No newline at end of file diff --git a/app/GenreManga.php b/app/GenreManga.php new file mode 100644 index 0000000..58e4a86 --- /dev/null +++ b/app/GenreManga.php @@ -0,0 +1,54 @@ +getAnimeGenres(new AnimeGenresRequest()); + + return json_decode( + app('SerializerV4') + ->serialize($data, 'json'), + true + ); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/V4DB/GenreController.php b/app/Http/Controllers/V4DB/GenreController.php index 025db25..dac06ce 100644 --- a/app/Http/Controllers/V4DB/GenreController.php +++ b/app/Http/Controllers/V4DB/GenreController.php @@ -3,7 +3,14 @@ namespace App\Http\Controllers\V4DB; use App\Anime; +use App\GenreAnime; +use App\GenreManga; +use App\Http\QueryBuilder\SearchQueryBuilderGenre; +use App\Http\QueryBuilder\SearchQueryBuilderProducer; use App\Http\Resources\V4\AnimeCollection; +use App\Http\Resources\V4\GenreCollection; +use App\Http\Resources\V4\ProducerCollection; +use App\Producer; use Illuminate\Http\Request; use Jikan\Request\Genre\AnimeGenreRequest; use Jikan\Request\Genre\AnimeGenresRequest; @@ -43,15 +50,73 @@ class GenreController extends Controller return response($this->serializer->serialize($person, 'json')); } - public function animeListing() + public function mainAnime(Request $request) { - $results = $this->jikan->getAnimeGenres(new AnimeGenresRequest()); - return response($this->serializer->serialize($results, 'json')); + $page = $request->get('page') ?? 1; + $limit = $request->get('limit') ?? self::MAX_RESULTS_PER_PAGE; + + if (!empty($limit)) { + $limit = (int) $limit; + + if ($limit <= 0) { + $limit = 1; + } + + if ($limit > self::MAX_RESULTS_PER_PAGE) { + $limit = self::MAX_RESULTS_PER_PAGE; + } + } + + $results = SearchQueryBuilderGenre::query( + $request, + GenreAnime::query() + ); + + $results = $results + ->paginate( + $limit, + ['*'], + null, + $page + ); + + return new GenreCollection( + $results + ); } - public function mangaListing() + public function mainManga(Request $request) { - $results = $this->jikan->getAnimeGenres(new AnimeGenresRequest()); - return response($this->serializer->serialize($results, 'json')); + $page = $request->get('page') ?? 1; + $limit = $request->get('limit') ?? self::MAX_RESULTS_PER_PAGE; + + if (!empty($limit)) { + $limit = (int) $limit; + + if ($limit <= 0) { + $limit = 1; + } + + if ($limit > self::MAX_RESULTS_PER_PAGE) { + $limit = self::MAX_RESULTS_PER_PAGE; + } + } + + $results = SearchQueryBuilderGenre::query( + $request, + GenreManga::query() + ); + + $results = $results + ->paginate( + $limit, + ['*'], + null, + $page + ); + + return new GenreCollection( + $results + ); } } diff --git a/app/Http/QueryBuilder/SearchQueryBuilderGenre.php b/app/Http/QueryBuilder/SearchQueryBuilderGenre.php new file mode 100644 index 0000000..46302ba --- /dev/null +++ b/app/Http/QueryBuilder/SearchQueryBuilderGenre.php @@ -0,0 +1,64 @@ +get('q'); + $orderBy = $request->get('order_by'); + $sort = self::mapSort($request->get('sort')); + $letter = $request->get('letter'); + + + if (!empty($query) && is_null($letter)) { + + $results = $results + ->where('name', 'like', "%{$query}%"); + } + + if (!is_null($letter)) { + $results = $results + ->where('name', 'like', "{$letter}%"); + } + + if (empty($query)) { + $results = $results + ->orderBy('mal_id'); + } + + if (!is_null($orderBy)) { + $results = $results + ->orderBy($orderBy, $sort ?? 'asc'); + } + + return $results; + } + + /** + * @param string|null $sort + * @return string|null + */ + public static function mapSort(?string $sort = null) : ?string + { + if (!is_null($sort)) { + return null; + } + + $sort = strtolower($sort); + + return $sort === 'desc' ? 'desc' : 'asc'; + } +} \ No newline at end of file diff --git a/app/Http/Resources/V4/GenreCollection.php b/app/Http/Resources/V4/GenreCollection.php new file mode 100644 index 0000000..a834ec5 --- /dev/null +++ b/app/Http/Resources/V4/GenreCollection.php @@ -0,0 +1,33 @@ + $this->collection, + 'links' => [ + 'self' => 'link-value', + ], + ]; + } +} \ No newline at end of file diff --git a/app/Http/Resources/V4/GenreResource.php b/app/Http/Resources/V4/GenreResource.php new file mode 100644 index 0000000..7f26b4e --- /dev/null +++ b/app/Http/Resources/V4/GenreResource.php @@ -0,0 +1,24 @@ + $this->mal_id, + 'name' => $this->name, + 'url' => $this->url, + 'count' => $this->count + ]; + } +} \ No newline at end of file diff --git a/app/Providers/SearchQueryBuilder.php b/app/Providers/SearchQueryBuilder.php index 892928c..622486d 100755 --- a/app/Providers/SearchQueryBuilder.php +++ b/app/Providers/SearchQueryBuilder.php @@ -193,7 +193,7 @@ class SearchQueryBuilder } } - // Genre + // GenreAnime if (isset($_GET['genre']) && \is_string($_GET['genre']) && strpos($_GET['genre'], ',')) { $_GET['genre'] = explode(',', $_GET['genre']); } diff --git a/config/controller.php b/config/controller.php index b89ddcd..dbe7846 100644 --- a/config/controller.php +++ b/config/controller.php @@ -147,8 +147,14 @@ return [ 'UserController@reviews' => 'users_reviews', 'UserController@clubs' => 'users_clubs', - 'GenreController@animeListing' => 'genres', - 'GenreController@mangaListing' => 'genres', + 'GenreController@mainAnime' => [ + 'table_name' => 'common', + 'ttl' => env('CACHE_GENRE_EXPIRE') + ], + 'GenreController@mainManga' => [ + 'table_name' => 'common', + 'ttl' => env('CACHE_GENRE_EXPIRE') + ], 'GenreController@anime' => 'genres_anime', 'GenreController@manga' => 'genres_manga', diff --git a/routes/web.v4.php b/routes/web.v4.php index 7d7bd7a..bc87545 100755 --- a/routes/web.v4.php +++ b/routes/web.v4.php @@ -315,11 +315,11 @@ $router->group( ], function () use ($router) { $router->get('/anime', [ - 'uses' => 'GenreController@animeListing' + 'uses' => 'GenreController@mainAnime' ]); $router->get('/manga', [ - 'uses' => 'GenreController@mangaListing' + 'uses' => 'GenreController@mainManga' ]); $router->get('/anime/{id:[0-9]+}[/{page:[0-9]+}]', [