mirror of
https://github.com/jikan-me/jikan-rest.git
synced 2025-02-20 11:23:35 +08:00
add v4 Characters Search
This commit is contained in:
parent
e5064d47b5
commit
adbf451649
@ -3,14 +3,17 @@
|
|||||||
namespace App\Http\Controllers\V4DB;
|
namespace App\Http\Controllers\V4DB;
|
||||||
|
|
||||||
use App\Anime;
|
use App\Anime;
|
||||||
|
use App\Character;
|
||||||
use App\Club;
|
use App\Club;
|
||||||
use App\Http\Middleware\Throttle;
|
use App\Http\Middleware\Throttle;
|
||||||
use App\Http\QueryBuilder\SearchQueryBuilderAnime;
|
use App\Http\QueryBuilder\SearchQueryBuilderAnime;
|
||||||
|
use App\Http\QueryBuilder\SearchQueryBuilderCharacter;
|
||||||
use App\Http\QueryBuilder\SearchQueryBuilderClub;
|
use App\Http\QueryBuilder\SearchQueryBuilderClub;
|
||||||
use App\Http\QueryBuilder\SearchQueryBuilderManga;
|
use App\Http\QueryBuilder\SearchQueryBuilderManga;
|
||||||
use App\Http\QueryBuilder\SearchQueryBuilderPeople;
|
use App\Http\QueryBuilder\SearchQueryBuilderPeople;
|
||||||
use App\Http\QueryBuilder\SearchQueryBuilderUsers;
|
use App\Http\QueryBuilder\SearchQueryBuilderUsers;
|
||||||
use App\Http\Resources\V4\AnimeCollection;
|
use App\Http\Resources\V4\AnimeCollection;
|
||||||
|
use App\Http\Resources\V4\CharacterCollection;
|
||||||
use App\Http\Resources\V4\ClubCollection;
|
use App\Http\Resources\V4\ClubCollection;
|
||||||
use App\Http\Resources\V4\MangaCollection;
|
use App\Http\Resources\V4\MangaCollection;
|
||||||
use App\Http\Resources\V4\PersonCollection;
|
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(
|
$page = $request->get('page') ?? 1;
|
||||||
SearchQueryBuilder::create(
|
$limit = $request->get('limit') ?? self::MAX_RESULTS_PER_PAGE;
|
||||||
(new CharacterSearchRequest())->setPage($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)
|
public function users(Request $request)
|
||||||
|
59
app/Http/QueryBuilder/SearchQueryBuilderCharacter.php
Normal file
59
app/Http/QueryBuilder/SearchQueryBuilderCharacter.php
Normal 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';
|
||||||
|
}
|
||||||
|
}
|
@ -157,8 +157,9 @@ $router->group(
|
|||||||
);
|
);
|
||||||
|
|
||||||
$router->get('/characters', [
|
$router->get('/characters', [
|
||||||
'uses' => 'SearchController@characters'
|
'uses' => 'SearchController@character'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$router->group(
|
$router->group(
|
||||||
[
|
[
|
||||||
'prefix' => 'characters/{id:[0-9]+}'
|
'prefix' => 'characters/{id:[0-9]+}'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user