add v4 Characters Search

This commit is contained in:
Irfan 2020-07-12 22:08:33 +05:00
parent e5064d47b5
commit adbf451649
3 changed files with 94 additions and 7 deletions

View File

@ -3,14 +3,17 @@
namespace App\Http\Controllers\V4DB;
use App\Anime;
use App\Character;
use App\Club;
use App\Http\Middleware\Throttle;
use App\Http\QueryBuilder\SearchQueryBuilderAnime;
use App\Http\QueryBuilder\SearchQueryBuilderCharacter;
use App\Http\QueryBuilder\SearchQueryBuilderClub;
use App\Http\QueryBuilder\SearchQueryBuilderManga;
use App\Http\QueryBuilder\SearchQueryBuilderPeople;
use App\Http\QueryBuilder\SearchQueryBuilderUsers;
use App\Http\Resources\V4\AnimeCollection;
use App\Http\Resources\V4\CharacterCollection;
use App\Http\Resources\V4\ClubCollection;
use App\Http\Resources\V4\MangaCollection;
use App\Http\Resources\V4\PersonCollection;
@ -143,15 +146,39 @@ class SearchController extends Controller
);
}
public function character(int $page = 1)
public function character(Request $request)
{
$search = $this->jikan->getCharacterSearch(
SearchQueryBuilder::create(
(new CharacterSearchRequest())->setPage($page)
)
$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 = SearchQueryBuilderCharacter::query(
$request,
Character::query()
);
return response($this->filter($search));
$results = $results
->paginate(
$limit,
['*'],
null,
$page
);
return new CharacterCollection(
$results
);
}
public function users(Request $request)

View File

@ -0,0 +1,59 @@
<?php
namespace App\Http\QueryBuilder;
use App\Http\HttpHelper;
use Illuminate\Http\Request;
use Jenssegers\Mongodb\Eloquent\Builder;
class SearchQueryBuilderCharacter implements SearchQueryBuilderInterface
{
const MAX_RESULTS_PER_PAGE = 50;
const ORDER_BY = [
'mal_id', 'name', 'member_favorites'
];
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}%")
->where('name_kanji', 'like', "%{$query}%")
->where('nicknames', '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;
}
public static function mapSort(?string $sort = null) : ?string
{
$sort = strtolower($sort);
return $sort === 'desc' ? 'desc' : 'asc';
}
}

View File

@ -157,8 +157,9 @@ $router->group(
);
$router->get('/characters', [
'uses' => 'SearchController@characters'
'uses' => 'SearchController@character'
]);
$router->group(
[
'prefix' => 'characters/{id:[0-9]+}'