<?php /** * Class PlatformModel * Model for platforms table in database * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ */ namespace App\Models; use CodeIgniter\Model; class PlatformModel extends Model { protected $table = 'platforms'; protected $primaryKey = 'slug'; protected $allowedFields = [ 'slug', 'type', 'label', 'home_url', 'submit_url', ]; protected $returnType = \App\Entities\Platform::class; protected $useSoftDeletes = false; protected $useTimestamps = false; public function getPlatforms() { if (!($found = cache('platforms'))) { $baseUrl = rtrim(config('app')->baseURL, '/'); $found = $this->select( "*, CONCAT('{$baseUrl}/assets/images/platforms/',`type`,'/',`slug`,'.svg') as icon" )->findAll(); cache()->save('platforms', $found, DECADE); } return $found; } public function getPlatform($slug) { if (!($found = cache("platform_$slug"))) { $found = $this->where('slug', $slug)->first(); cache()->save("platform_$slug", $found, DECADE); } return $found; } public function createPlatform( $slug, $type, $label, $homeUrl, $submitUrl = null ) { $data = [ 'slug' => $slug, 'type' => $type, 'label' => $label, 'home_url' => $homeUrl, 'submit_url' => $submitUrl, ]; return $this->insert($data, false); } public function getPlatformsWithLinks($podcastId, $platformType) { if ( !($found = cache("podcast{$podcastId}_platforms_{$platformType}")) ) { $found = $this->select( 'platforms.*, podcasts_platforms.link_url, podcasts_platforms.link_content, podcasts_platforms.is_visible, podcasts_platforms.is_on_embeddable_player' ) ->join( 'podcasts_platforms', "podcasts_platforms.platform_slug = platforms.slug AND podcasts_platforms.podcast_id = $podcastId", 'left' ) ->where('platforms.type', $platformType) ->findAll(); cache()->save( "podcast{$podcastId}_platforms_{$platformType}", $found, DECADE ); } return $found; } public function getPodcastPlatforms($podcastId, $platformType) { if ( !($found = cache( "podcast{$podcastId}_podcastPlatforms_{$platformType}" )) ) { $found = $this->select( 'platforms.*, podcasts_platforms.link_url, podcasts_platforms.link_content, podcasts_platforms.is_visible, podcasts_platforms.is_on_embeddable_player' ) ->join( 'podcasts_platforms', 'podcasts_platforms.platform_slug = platforms.slug' ) ->where('podcasts_platforms.podcast_id', $podcastId) ->where('platforms.type', $platformType) ->findAll(); cache()->save( "podcast{$podcastId}_podcastPlatforms_{$platformType}", $found, DECADE ); } return $found; } public function savePodcastPlatforms( $podcastId, $platformType, $podcastsPlatformsData ) { $this->clearCache($podcastId); $podcastsPlatformsTable = $this->db->prefixTable('podcasts_platforms'); $platformsTable = $this->db->prefixTable('platforms'); $deleteJoinQuery = <<<EOD DELETE $podcastsPlatformsTable FROM $podcastsPlatformsTable INNER JOIN $platformsTable ON $platformsTable.slug = $podcastsPlatformsTable.platform_slug WHERE `podcast_id` = ? AND `type` = ? EOD; $this->db->query($deleteJoinQuery, [$podcastId, $platformType]); // Set podcastPlatforms return $this->db ->table('podcasts_platforms') ->insertBatch($podcastsPlatformsData); } public function createPodcastPlatforms($podcastId, $podcastsPlatformsData) { $this->clearCache($podcastId); // Set podcastPlatforms return $this->db ->table('podcasts_platforms') ->insertBatch($podcastsPlatformsData); } public function removePodcastPlatform($podcastId, $platformSlug) { $this->clearCache($podcastId); return $this->db->table('podcasts_platforms')->delete([ 'podcast_id' => $podcastId, 'platform_slug' => $platformSlug, ]); } public function clearCache($podcastId) { $podcast = (new PodcastModel())->getPodcastById($podcastId); foreach (['podcasting', 'social', 'funding'] as $platformType) { cache()->delete("podcast{$podcastId}_platforms_{$platformType}"); cache()->delete( "podcast{$podcastId}_podcastPlatforms_{$platformType}" ); } // delete localized podcast page cache $episodeModel = new EpisodeModel(); $years = $episodeModel->getYears($podcastId); $seasons = $episodeModel->getSeasons($podcastId); $supportedLocales = config('App')->supportedLocales; foreach ($years as $year) { foreach ($supportedLocales as $locale) { cache()->delete( "page_podcast{$podcastId}_{$year['year']}_{$locale}" ); } } foreach ($seasons as $season) { foreach ($supportedLocales as $locale) { cache()->delete( "page_podcast{$podcastId}_season{$season['season_number']}_{$locale}" ); } } // clear cache for every localized podcast episode page foreach ($podcast->episodes as $episode) { foreach ($supportedLocales as $locale) { cache()->delete( "page_podcast{$podcast->id}_episode{$episode->id}_{$locale}" ); foreach ( array_keys(\App\Models\EpisodeModel::$themes) as $themeKey ) { cache()->delete( "page_podcast{$podcast->id}_episode{$episode->id}_embeddable_player_{$themeKey}_{$locale}" ); } } } } }