diff --git a/app/Http/Controllers/V4DB/SearchController.php b/app/Http/Controllers/V4DB/SearchController.php index 6393086..56cd772 100644 --- a/app/Http/Controllers/V4DB/SearchController.php +++ b/app/Http/Controllers/V4DB/SearchController.php @@ -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) diff --git a/app/Http/QueryBuilder/SearchQueryBuilderCharacter.php b/app/Http/QueryBuilder/SearchQueryBuilderCharacter.php new file mode 100644 index 0000000..ba02485 --- /dev/null +++ b/app/Http/QueryBuilder/SearchQueryBuilderCharacter.php @@ -0,0 +1,59 @@ +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'; + } +} \ No newline at end of file diff --git a/routes/web.v4.php b/routes/web.v4.php index c49166f..e1568b9 100755 --- a/routes/web.v4.php +++ b/routes/web.v4.php @@ -157,8 +157,9 @@ $router->group( ); $router->get('/characters', [ - 'uses' => 'SearchController@characters' + 'uses' => 'SearchController@character' ]); + $router->group( [ 'prefix' => 'characters/{id:[0-9]+}'