63 lines
2.1 KiB
PHP
63 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Modules\Movies\Services\Browse\Entities;
|
|
|
|
use App\Modules\Movies\Models\{Studio, Movie};
|
|
use App\Modules\Movies\Services\Contracts\GetStudioWithMoviesServiceInterface;
|
|
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
|
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
|
|
|
class GetStudioWithMoviesService implements GetStudioWithMoviesServiceInterface
|
|
{
|
|
/**
|
|
* @param int $id
|
|
* @param array{q?: string|null, per_page?: int|null} $params
|
|
* @return array{entity: Studio, movies: LengthAwarePaginator}
|
|
*/
|
|
public function handle(int $id, array $params = []): array
|
|
{
|
|
$studio = Studio::query()->find($id);
|
|
if (!$studio) {
|
|
throw (new ModelNotFoundException())->setModel(Studio::class, [$id]);
|
|
}
|
|
|
|
$perPage = max(1, min((int)($params['per_page'] ?? 20), 50));
|
|
$q = isset($params['q']) ? trim((string)$params['q']) : '';
|
|
$sort = isset($params['sort']) ? trim((string)$params['sort']) : 'title_asc';
|
|
|
|
$moviesQuery = Movie::query()
|
|
->whereHas('studios', fn($q2) => $q2->whereKey($studio->id))
|
|
->with(['genres'])
|
|
->when($q !== '', fn($query) => $query->where('title', 'like', "%{$q}%"));
|
|
|
|
switch ($sort) {
|
|
case 'title_desc':
|
|
$moviesQuery->orderBy('title', 'desc');
|
|
break;
|
|
case 'newest':
|
|
$moviesQuery->orderBy('created_at', 'desc');
|
|
break;
|
|
case 'oldest':
|
|
$moviesQuery->orderBy('created_at', 'asc');
|
|
break;
|
|
case 'year_asc':
|
|
$moviesQuery->orderBy('year', 'asc');
|
|
break;
|
|
case 'year_desc':
|
|
$moviesQuery->orderBy('year', 'desc');
|
|
break;
|
|
case 'title_asc':
|
|
default:
|
|
$moviesQuery->orderBy('title', 'asc');
|
|
break;
|
|
}
|
|
|
|
$movies = $moviesQuery->paginate($perPage);
|
|
|
|
return [
|
|
'entity' => $studio,
|
|
'movies' => $movies,
|
|
];
|
|
}
|
|
}
|