initialize(); } public function list(): Response { $query = $this->request->getGet('query'); $order = $this->request->getGet('order') ?? 'newest'; $podcastIds = $this->request->getGet('podcastIds'); $builder = (new EpisodeModel()); if ($podcastIds !== null) { $builder->whereIn('podcast_id', explode(',', (string) $podcastIds)); } if ($query !== null) { $builder->fullTextSearch($query); if ($order === 'search') { $builder->orderBy('(episodes_score + podcasts_score)', 'desc'); } } if ($order === 'newest') { $builder->orderBy('episodes.created_at', 'desc'); } $data = $builder->findAll( (int) ($this->request->getGet('limit') ?? config(RestApi::class)->limit), (int) $this->request->getGet('offset') ); array_map(static function ($episode): void { self::mapEpisode($episode); }, $data); return $this->respond($data); } public function view(int $id): Response { $episode = (new EpisodeModel())->getEpisodeById($id); if (! $episode instanceof Episode) { return $this->failNotFound('Episode not found'); } return $this->respond(static::mapEpisode($episode)); } protected static function mapEpisode(Episode $episode): Episode { $episode->cover_url = $episode->getCover() ->file_url; $episode->audio_url = $episode->getAudioUrl(); $episode->duration = round($episode->audio->duration); return $episode; } }