Add query parameters to genres listing

This commit is contained in:
Irfan 2021-01-13 11:24:26 +05:00
parent d4254ad277
commit ead5ec9c8e
5 changed files with 73 additions and 3 deletions

View File

@ -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()

View File

@ -0,0 +1,65 @@
<?php
namespace App\Http\QueryBuilder;
use App\Http\HttpHelper;
use Illuminate\Http\Request;
use Jenssegers\Mongodb\Eloquent\Builder;
class SearchQueryBuilderGenre implements SearchQueryBuilderInterface
{
const MAX_RESULTS_PER_PAGE = 25;
const ORDER_BY = [
'mal_id', 'name', 'count'
];
public static function query(Request $request, Builder $results) : Builder
{
$query = $request->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';
}
}

View File

@ -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

View File

@ -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

View File

@ -341,6 +341,7 @@ $router->group(
'prefix' => 'genres'
],
function () use ($router) {
$router->get('/anime', [
'uses' => 'GenreController@anime'
]);