Files
mtdb_movie/app/Http/Controllers/SearchController.php
maher 703f50a09d
Some checks failed
Build / run (push) Has been cancelled
first commit
2025-10-29 11:42:25 +01:00

74 lines
2.1 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers;
use App\Actions\LocalSearch;
use App\Services\Data\Tmdb\TmdbApi;
use Common\Core\BaseController;
use Illuminate\Support\Collection;
use Str;
class SearchController extends BaseController
{
public function index($query)
{
$dataProvider =
request('provider') ?: settings('content.search_provider');
$results = $this->searchUsing($dataProvider, $query)
->map(function ($result) {
if (isset($result['description'])) {
$result['description'] = Str::limit(
$result['description'],
140,
);
}
return $result;
})
->values();
$data = [
'results' => $results,
'query' => trim(strip_tags($query), '"\''),
'loader' => 'searchPage',
];
return $this->renderClientOrApi([
'pageName' => 'search-page',
'data' => $data,
]);
}
private function searchUsing($provider, $query)
{
$params = request()->all();
$params['limit'] =
request('loader', 'searchPage') === 'searchPage' ? 20 : 8;
if ($provider === 'tmdb') {
return app(TmdbApi::class)->search($query, $params);
}
$results = app(LocalSearch::class)->execute($query, $params);
if ($provider === 'all') {
$tmdb = app(TmdbApi::class)->search($query, $params);
$results = $results
->concat($tmdb)
->unique(
fn($item) => ($item['tmdb_id'] ?: $item['name']) .
$item['model_type'],
)
->groupBy('model_type')
// make sure specified limit is enforced per group
// (title, person) instead of the whole collection
->map(
fn(Collection $group) => $group->slice(0, $params['limit']),
)
->flatten(1)
->sortByDesc('popularity');
}
return $results;
}
}