diff --git a/app/Http/Controllers/V4DB/GenreController.php b/app/Http/Controllers/V4DB/GenreController.php index 520ba43..84a290c 100644 --- a/app/Http/Controllers/V4DB/GenreController.php +++ b/app/Http/Controllers/V4DB/GenreController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\V4DB; use App\Anime; use App\GenreAnime; use App\GenreManga; +use App\Http\QueryBuilder\SearchQueryBuilderGenre; use App\Http\Resources\V4\AnimeCollection; use App\Http\Resources\V4\GenreCollection; use App\Http\Resources\V4\MangaCollection; @@ -32,7 +33,10 @@ class GenreController extends Controller */ public function anime(Request $request) { - $results = GenreAnime::query(); + $results = SearchQueryBuilderGenre::query( + $request, + GenreAnime::query() + ); return new GenreCollection( $results->get() diff --git a/app/Http/QueryBuilder/SearchQueryBuilderGenre.php b/app/Http/QueryBuilder/SearchQueryBuilderGenre.php new file mode 100644 index 0000000..9286163 --- /dev/null +++ b/app/Http/QueryBuilder/SearchQueryBuilderGenre.php @@ -0,0 +1,65 @@ +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 (!is_null($orderBy)) { + $results = $results + ->orderBy($orderBy, $sort ?? 'asc'); + } + + if (empty($query)) { + $results = $results + ->orderBy('mal_id'); + } + + 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/QueryBuilder/SearchQueryBuilderMagazine.php b/app/Http/QueryBuilder/SearchQueryBuilderMagazine.php index 9662c26..279ca0d 100644 --- a/app/Http/QueryBuilder/SearchQueryBuilderMagazine.php +++ b/app/Http/QueryBuilder/SearchQueryBuilderMagazine.php @@ -11,7 +11,7 @@ class SearchQueryBuilderMagazine implements SearchQueryBuilderInterface { const ORDER_BY = [ - 'mal_id', 'title', 'count' + 'mal_id', 'name', 'count' ]; public static function query(Request $request, Builder $results) : Builder diff --git a/app/Http/QueryBuilder/SearchQueryBuilderProducer.php b/app/Http/QueryBuilder/SearchQueryBuilderProducer.php index 2922f11..d3b6aa0 100644 --- a/app/Http/QueryBuilder/SearchQueryBuilderProducer.php +++ b/app/Http/QueryBuilder/SearchQueryBuilderProducer.php @@ -13,7 +13,7 @@ class SearchQueryBuilderProducer implements SearchQueryBuilderInterface const MAX_RESULTS_PER_PAGE = 25; const ORDER_BY = [ - 'mal_id', 'title', 'count' + 'mal_id', 'name', 'count' ]; public static function query(Request $request, Builder $results) : Builder diff --git a/routes/web.v4.php b/routes/web.v4.php index 8900f4d..fa012f9 100755 --- a/routes/web.v4.php +++ b/routes/web.v4.php @@ -341,6 +341,7 @@ $router->group( 'prefix' => 'genres' ], function () use ($router) { + $router->get('/anime', [ 'uses' => 'GenreController@anime' ]);