{$method}(); } if ( ($this->podcast = (new PodcastModel())->getPodcastById((int) $params[0],)) !== null ) { return $this->{$method}(); } throw PageNotFoundException::forPageNotFound(); } public function list(): string { if (! has_permission('podcasts-list')) { $data = [ 'podcasts' => (new PodcastModel())->getUserPodcasts((int) user_id(),), ]; } else { $data = [ 'podcasts' => (new PodcastModel())->findAll(), ]; } return view('admin/podcast/list', $data); } public function view(): string { $data = [ 'podcast' => $this->podcast, ]; replace_breadcrumb_params([ 0 => $this->podcast->title, ]); return view('admin/podcast/view', $data); } public function viewAnalytics(): string { $data = [ 'podcast' => $this->podcast, ]; replace_breadcrumb_params([ 0 => $this->podcast->title, ]); return view('admin/podcast/analytics/index', $data); } public function viewAnalyticsWebpages(): string { $data = [ 'podcast' => $this->podcast, ]; replace_breadcrumb_params([ 0 => $this->podcast->title, ]); return view('admin/podcast/analytics/webpages', $data); } public function viewAnalyticsLocations(): string { $data = [ 'podcast' => $this->podcast, ]; replace_breadcrumb_params([ 0 => $this->podcast->title, ]); return view('admin/podcast/analytics/locations', $data); } public function viewAnalyticsUniqueListeners(): string { $data = [ 'podcast' => $this->podcast, ]; replace_breadcrumb_params([ 0 => $this->podcast->title, ]); return view('admin/podcast/analytics/unique_listeners', $data); } public function viewAnalyticsListeningTime(): string { $data = [ 'podcast' => $this->podcast, ]; replace_breadcrumb_params([ 0 => $this->podcast->title, ]); return view('admin/podcast/analytics/listening_time', $data); } public function viewAnalyticsTimePeriods(): string { $data = [ 'podcast' => $this->podcast, ]; replace_breadcrumb_params([ 0 => $this->podcast->title, ]); return view('admin/podcast/analytics/time_periods', $data); } public function viewAnalyticsPlayers(): string { $data = [ 'podcast' => $this->podcast, ]; replace_breadcrumb_params([ 0 => $this->podcast->title, ]); return view('admin/podcast/analytics/players', $data); } public function create(): string { helper(['form', 'misc']); $languageOptions = (new LanguageModel())->getLanguageOptions(); $categoryOptions = (new CategoryModel())->getCategoryOptions(); $data = [ 'languageOptions' => $languageOptions, 'categoryOptions' => $categoryOptions, 'browserLang' => get_browser_language($this->request->getServer('HTTP_ACCEPT_LANGUAGE'),), ]; return view('admin/podcast/create', $data); } public function attemptCreate(): RedirectResponse { $rules = [ 'image' => 'uploaded[image]|is_image[image]|ext_in[image,jpg,png]|min_dims[image,1400,1400]|is_image_squared[image]', ]; if (! $this->validate($rules)) { return redirect() ->back() ->withInput() ->with('errors', $this->validator->getErrors()); } $podcast = new Podcast([ 'title' => $this->request->getPost('title'), 'name' => $this->request->getPost('name'), 'description_markdown' => $this->request->getPost('description'), 'image' => new Image($this->request->getFile('image')), 'language_code' => $this->request->getPost('language'), 'category_id' => $this->request->getPost('category'), 'parental_advisory' => $this->request->getPost('parental_advisory') !== 'undefined' ? $this->request->getPost('parental_advisory') : null, 'owner_name' => $this->request->getPost('owner_name'), 'owner_email' => $this->request->getPost('owner_email'), 'publisher' => $this->request->getPost('publisher'), 'type' => $this->request->getPost('type'), 'copyright' => $this->request->getPost('copyright'), 'location' => new Location($this->request->getPost('location_name'),), 'payment_pointer' => $this->request->getPost('payment_pointer'), 'custom_rss_string' => $this->request->getPost('custom_rss'), 'partner_id' => $this->request->getPost('partner_id'), 'partner_link_url' => $this->request->getPost('partner_link_url'), 'partner_image_url' => $this->request->getPost('partner_image_url'), 'is_blocked' => $this->request->getPost('block') === 'yes', 'is_completed' => $this->request->getPost('complete') === 'yes', 'is_locked' => $this->request->getPost('lock') === 'yes', 'created_by' => user_id(), 'updated_by' => user_id(), ]); $podcastModel = new PodcastModel(); $db = Database::connect(); $db->transStart(); if (! ($newPodcastId = $podcastModel->insert($podcast, true))) { $db->transRollback(); return redirect() ->back() ->withInput() ->with('errors', $podcastModel->errors()); } $authorize = Services::authorization(); $podcastAdminGroup = $authorize->group('podcast_admin'); $podcastModel->addPodcastContributor(user_id(), $newPodcastId, $podcastAdminGroup->id,); // set Podcast categories (new CategoryModel())->setPodcastCategories( (int) $newPodcastId, $this->request->getPost('other_categories'), ); // set interact as the newly created podcast actor $createdPodcast = (new PodcastModel())->getPodcastById($newPodcastId); set_interact_as_actor($createdPodcast->actor_id); $db->transComplete(); return redirect()->route('podcast-view', [$newPodcastId]); } public function edit(): string { helper('form'); $languageOptions = (new LanguageModel())->getLanguageOptions(); $categoryOptions = (new CategoryModel())->getCategoryOptions(); $data = [ 'podcast' => $this->podcast, 'languageOptions' => $languageOptions, 'categoryOptions' => $categoryOptions, ]; replace_breadcrumb_params([ 0 => $this->podcast->title, ]); return view('admin/podcast/edit', $data); } public function attemptEdit(): RedirectResponse { $rules = [ 'image' => 'is_image[image]|ext_in[image,jpg,png]|min_dims[image,1400,1400]|is_image_squared[image]', ]; if (! $this->validate($rules)) { return redirect() ->back() ->withInput() ->with('errors', $this->validator->getErrors()); } $this->podcast->title = $this->request->getPost('title'); $this->podcast->description_markdown = $this->request->getPost('description',); $image = $this->request->getFile('image'); if ($image !== null && $image->isValid()) { $this->podcast->image = new Image($image); } $this->podcast->language_code = $this->request->getPost('language'); $this->podcast->category_id = $this->request->getPost('category'); $this->podcast->parental_advisory = $this->request->getPost('parental_advisory') !== 'undefined' ? $this->request->getPost('parental_advisory') : null; $this->podcast->publisher = $this->request->getPost('publisher'); $this->podcast->owner_name = $this->request->getPost('owner_name'); $this->podcast->owner_email = $this->request->getPost('owner_email'); $this->podcast->type = $this->request->getPost('type'); $this->podcast->copyright = $this->request->getPost('copyright'); $this->podcast->location = new Location($this->request->getPost('location_name'),); $this->podcast->payment_pointer = $this->request->getPost('payment_pointer',); $this->podcast->custom_rss_string = $this->request->getPost('custom_rss',); $this->podcast->partner_id = $this->request->getPost('partner_id'); $this->podcast->partner_link_url = $this->request->getPost('partner_link_url',); $this->podcast->partner_image_url = $this->request->getPost('partner_image_url',); $this->podcast->is_blocked = $this->request->getPost('block') === 'yes'; $this->podcast->is_completed = $this->request->getPost('complete') === 'yes'; $this->podcast->is_locked = $this->request->getPost('lock') === 'yes'; $this->podcast->updated_by = (int) user_id(); $db = Database::connect(); $db->transStart(); $podcastModel = new PodcastModel(); if (! $podcastModel->update($this->podcast->id, $this->podcast)) { $db->transRollback(); return redirect() ->back() ->withInput() ->with('errors', $podcastModel->errors()); } // set Podcast categories (new CategoryModel())->setPodcastCategories( $this->podcast->id, $this->request->getPost('other_categories'), ); $db->transComplete(); return redirect()->route('podcast-view', [$this->podcast->id]); } public function latestEpisodes(int $limit, int $podcast_id): string { $episodes = (new EpisodeModel()) ->where('podcast_id', $podcast_id) ->orderBy('created_at', 'desc') ->findAll($limit); return view('admin/podcast/latest_episodes', [ 'episodes' => $episodes, ]); } public function delete(): RedirectResponse { (new PodcastModel())->delete($this->podcast->id); return redirect()->route('podcast-list'); } }