mirror of
https://code.castopod.org/adaures/castopod.git
synced 2024-09-28 04:31:47 +02:00
fix(cache): add locale for podcast and episode pages + clear some persisting cache in models
fixes #42, #61
This commit is contained in:
parent
a354940e5e
commit
9cec8a81cc
@ -44,11 +44,10 @@ class Episode extends BaseController
|
|||||||
{
|
{
|
||||||
self::triggerWebpageHit($this->episode->podcast_id);
|
self::triggerWebpageHit($this->episode->podcast_id);
|
||||||
|
|
||||||
if (
|
$locale = service('request')->getLocale();
|
||||||
!($cachedView = cache(
|
$cacheName = "page_podcast{$this->episode->podcast_id}_episode{$this->episode->id}_{$locale}";
|
||||||
"page_podcast{$this->episode->podcast_id}_episode{$this->episode->id}"
|
|
||||||
))
|
if (!($cachedView = cache($cacheName))) {
|
||||||
) {
|
|
||||||
$previousNextEpisodes = (new EpisodeModel())->getPreviousNextEpisodes(
|
$previousNextEpisodes = (new EpisodeModel())->getPreviousNextEpisodes(
|
||||||
$this->episode,
|
$this->episode,
|
||||||
$this->podcast->type
|
$this->podcast->type
|
||||||
@ -64,7 +63,7 @@ class Episode extends BaseController
|
|||||||
// The page cache is set to a decade so it is deleted manually upon podcast update
|
// The page cache is set to a decade so it is deleted manually upon podcast update
|
||||||
return view('episode', $data, [
|
return view('episode', $data, [
|
||||||
'cache' => DECADE,
|
'cache' => DECADE,
|
||||||
'cache_name' => "page_podcast{$this->episode->podcast_id}_episode{$this->episode->id}",
|
'cache_name' => $cacheName,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,15 +58,13 @@ class Podcast extends BaseController
|
|||||||
"podcast{$this->podcast->id}",
|
"podcast{$this->podcast->id}",
|
||||||
$yearQuery,
|
$yearQuery,
|
||||||
$seasonQuery ? 'season' . $seasonQuery : null,
|
$seasonQuery ? 'season' . $seasonQuery : null,
|
||||||
|
service('request')->getLocale(),
|
||||||
])
|
])
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!($found = cache($cacheName))) {
|
if (!($found = cache($cacheName))) {
|
||||||
// The page cache is set to a decade so it is deleted manually upon podcast update
|
|
||||||
// $this->cachePage(DECADE);
|
|
||||||
$episodeModel = new EpisodeModel();
|
|
||||||
|
|
||||||
// Build navigation array
|
// Build navigation array
|
||||||
|
$episodeModel = new EpisodeModel();
|
||||||
$years = $episodeModel->getYears($this->podcast->id);
|
$years = $episodeModel->getYears($this->podcast->id);
|
||||||
$seasons = $episodeModel->getSeasons($this->podcast->id);
|
$seasons = $episodeModel->getSeasons($this->podcast->id);
|
||||||
|
|
||||||
|
@ -76,54 +76,6 @@ class EpisodeModel extends Model
|
|||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function clearCache(array $data)
|
|
||||||
{
|
|
||||||
$episodeModel = new EpisodeModel();
|
|
||||||
|
|
||||||
$episode = $episodeModel->find(
|
|
||||||
is_array($data['id']) ? $data['id'][0] : $data['id']
|
|
||||||
);
|
|
||||||
|
|
||||||
// delete cache for rss feed, podcast and episode pages
|
|
||||||
cache()->delete(md5($episode->podcast->feed_url));
|
|
||||||
cache()->delete(md5($episode->podcast->link));
|
|
||||||
cache()->delete(md5($episode->link));
|
|
||||||
|
|
||||||
// delete model requests cache
|
|
||||||
cache()->delete("podcast{$episode->podcast_id}_episodes");
|
|
||||||
|
|
||||||
// delete episode lists cache per year / season
|
|
||||||
$years = $episodeModel->getYears($episode->podcast_id);
|
|
||||||
$seasons = $episodeModel->getSeasons($episode->podcast_id);
|
|
||||||
|
|
||||||
foreach ($years as $year) {
|
|
||||||
cache()->delete(
|
|
||||||
"podcast{$episode->podcast_id}_{$year['year']}_episodes"
|
|
||||||
);
|
|
||||||
cache()->delete(
|
|
||||||
"page_podcast{$episode->podcast_id}_{$year['year']}"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
foreach ($seasons as $season) {
|
|
||||||
cache()->delete(
|
|
||||||
"podcast{$episode->podcast_id}_season{$season['season_number']}_episodes"
|
|
||||||
);
|
|
||||||
cache()->delete(
|
|
||||||
"page_podcast{$episode->podcast_id}_season{$season['season_number']}"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
cache()->delete("podcast{$episode->podcast_id}_defaultQuery");
|
|
||||||
cache()->delete("podcast{$episode->podcast_id}_years");
|
|
||||||
cache()->delete("podcast{$episode->podcast_id}_seasons");
|
|
||||||
|
|
||||||
cache()->delete(
|
|
||||||
"podcast{$episode->podcast_id}_episode@{$episode->slug}"
|
|
||||||
);
|
|
||||||
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getEpisodeBySlug($podcastId, $episodeSlug)
|
public function getEpisodeBySlug($podcastId, $episodeSlug)
|
||||||
{
|
{
|
||||||
if (!($found = cache("podcast{$podcastId}_episode@{$episodeSlug}"))) {
|
if (!($found = cache("podcast{$podcastId}_episode@{$episodeSlug}"))) {
|
||||||
@ -142,6 +94,47 @@ class EpisodeModel extends Model
|
|||||||
return $found;
|
return $found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the previous episode based on episode ordering
|
||||||
|
*/
|
||||||
|
public function getPreviousNextEpisodes($episode, $podcastType)
|
||||||
|
{
|
||||||
|
$sortNumberField =
|
||||||
|
$podcastType == 'serial'
|
||||||
|
? 'if(isnull(season_number),0,season_number)*1000+number'
|
||||||
|
: 'if(isnull(season_number),0,season_number)*100000000000000+published_at';
|
||||||
|
$sortNumberValue =
|
||||||
|
$podcastType == 'serial'
|
||||||
|
? (empty($episode->season_number)
|
||||||
|
? 0
|
||||||
|
: $episode->season_number) *
|
||||||
|
1000 +
|
||||||
|
$episode->number
|
||||||
|
: (empty($episode->season_number)
|
||||||
|
? ''
|
||||||
|
: $episode->season_number) .
|
||||||
|
date('YmdHis', strtotime($episode->published_at));
|
||||||
|
|
||||||
|
$previousData = $this->orderBy('(' . $sortNumberField . ') DESC')
|
||||||
|
->where([
|
||||||
|
'podcast_id' => $episode->podcast_id,
|
||||||
|
$sortNumberField . ' <' => $sortNumberValue,
|
||||||
|
])
|
||||||
|
->first();
|
||||||
|
|
||||||
|
$nextData = $this->orderBy('(' . $sortNumberField . ') ASC')
|
||||||
|
->where([
|
||||||
|
'podcast_id' => $episode->podcast_id,
|
||||||
|
$sortNumberField . ' >' => $sortNumberValue,
|
||||||
|
])
|
||||||
|
->first();
|
||||||
|
|
||||||
|
return [
|
||||||
|
'previous' => $previousData,
|
||||||
|
'next' => $nextData,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets all episodes for a podcast ordered according to podcast type
|
* Gets all episodes for a podcast ordered according to podcast type
|
||||||
* Filtered depending on year or season
|
* Filtered depending on year or season
|
||||||
@ -239,6 +232,10 @@ class EpisodeModel extends Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the default query for displaying the episode list on the podcast page
|
* Returns the default query for displaying the episode list on the podcast page
|
||||||
|
*
|
||||||
|
* @param int $podcastId
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function getDefaultQuery(int $podcastId)
|
public function getDefaultQuery(int $podcastId)
|
||||||
{
|
{
|
||||||
@ -267,44 +264,62 @@ class EpisodeModel extends Model
|
|||||||
return $defaultQuery;
|
return $defaultQuery;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
protected function clearCache(array $data)
|
||||||
* Returns the previous episode based on episode ordering
|
|
||||||
*/
|
|
||||||
public function getPreviousNextEpisodes($episode, $podcastType)
|
|
||||||
{
|
{
|
||||||
$sortNumberField =
|
$episodeModel = new EpisodeModel();
|
||||||
$podcastType == 'serial'
|
$episode = (new EpisodeModel())->find(
|
||||||
? 'if(isnull(season_number),0,season_number)*1000+number'
|
is_array($data['id']) ? $data['id'][0] : $data['id']
|
||||||
: 'if(isnull(season_number),0,season_number)*100000000000000+published_at';
|
);
|
||||||
$sortNumberValue =
|
|
||||||
$podcastType == 'serial'
|
|
||||||
? (empty($episode->season_number)
|
|
||||||
? 0
|
|
||||||
: $episode->season_number) *
|
|
||||||
1000 +
|
|
||||||
$episode->number
|
|
||||||
: (empty($episode->season_number)
|
|
||||||
? ''
|
|
||||||
: $episode->season_number) .
|
|
||||||
date('YmdHis', strtotime($episode->published_at));
|
|
||||||
|
|
||||||
$previousData = $this->orderBy('(' . $sortNumberField . ') DESC')
|
// delete cache for rss feed
|
||||||
->where([
|
cache()->delete(md5($episode->podcast->feed_url));
|
||||||
'podcast_id' => $episode->podcast_id,
|
|
||||||
$sortNumberField . ' <' => $sortNumberValue,
|
|
||||||
])
|
|
||||||
->first();
|
|
||||||
|
|
||||||
$nextData = $this->orderBy('(' . $sortNumberField . ') ASC')
|
// delete model requests cache
|
||||||
->where([
|
cache()->delete("podcast{$episode->podcast_id}_episodes");
|
||||||
'podcast_id' => $episode->podcast_id,
|
|
||||||
$sortNumberField . ' >' => $sortNumberValue,
|
|
||||||
])
|
|
||||||
->first();
|
|
||||||
|
|
||||||
return [
|
cache()->delete(
|
||||||
'previous' => $previousData,
|
"podcast{$episode->podcast_id}_episode@{$episode->slug}"
|
||||||
'next' => $nextData,
|
);
|
||||||
];
|
|
||||||
|
// delete episode lists cache per year / season for a podcast
|
||||||
|
// and localized pages
|
||||||
|
$years = $episodeModel->getYears($episode->podcast_id);
|
||||||
|
$seasons = $episodeModel->getSeasons($episode->podcast_id);
|
||||||
|
$supportedLocales = config('App')->supportedLocales;
|
||||||
|
|
||||||
|
foreach ($supportedLocales as $locale) {
|
||||||
|
cache()->delete(
|
||||||
|
"page_podcast{$episode->podcast->id}_episode{$episode->id}_{$locale}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($years as $year) {
|
||||||
|
cache()->delete(
|
||||||
|
"podcast{$episode->podcast_id}_{$year['year']}_episodes"
|
||||||
|
);
|
||||||
|
foreach ($supportedLocales as $locale) {
|
||||||
|
cache()->delete(
|
||||||
|
"page_podcast{$episode->podcast_id}_{$year['year']}_{$locale}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($seasons as $season) {
|
||||||
|
cache()->delete(
|
||||||
|
"podcast{$episode->podcast_id}_season{$season['season_number']}_episodes"
|
||||||
|
);
|
||||||
|
foreach ($supportedLocales as $locale) {
|
||||||
|
cache()->delete(
|
||||||
|
"page_podcast{$episode->podcast_id}_season{$season['season_number']}_{$locale}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete query cache
|
||||||
|
cache()->delete("podcast{$episode->podcast_id}_defaultQuery");
|
||||||
|
cache()->delete("podcast{$episode->podcast_id}_years");
|
||||||
|
cache()->delete("podcast{$episode->podcast_id}_seasons");
|
||||||
|
|
||||||
|
return $data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,8 @@ class PageModel extends Model
|
|||||||
];
|
];
|
||||||
protected $validationMessages = [];
|
protected $validationMessages = [];
|
||||||
|
|
||||||
// Before update because slug might change
|
// Before update because slug or title might change
|
||||||
|
protected $afterInsert = ['clearCache'];
|
||||||
protected $beforeUpdate = ['clearCache'];
|
protected $beforeUpdate = ['clearCache'];
|
||||||
protected $beforeDelete = ['clearCache'];
|
protected $beforeDelete = ['clearCache'];
|
||||||
|
|
||||||
@ -44,8 +45,38 @@ class PageModel extends Model
|
|||||||
cache()->delete(md5($page->link));
|
cache()->delete(md5($page->link));
|
||||||
|
|
||||||
// Clear the cache of all podcast and episode pages
|
// Clear the cache of all podcast and episode pages
|
||||||
// TODO: change the logic of page caching to prevent clearing all cache every time
|
$allPodcasts = (new PodcastModel())->findAll();
|
||||||
// cache()->clean();
|
|
||||||
|
foreach ($allPodcasts as $podcast) {
|
||||||
|
// delete localized podcast and episode page cache
|
||||||
|
$episodeModel = new EpisodeModel();
|
||||||
|
$years = $episodeModel->getYears($podcast->id);
|
||||||
|
$seasons = $episodeModel->getSeasons($podcast->id);
|
||||||
|
$supportedLocales = config('App')->supportedLocales;
|
||||||
|
|
||||||
|
foreach ($years as $year) {
|
||||||
|
foreach ($supportedLocales as $locale) {
|
||||||
|
cache()->delete(
|
||||||
|
"page_podcast{$podcast->id}_{$year['year']}_{$locale}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($seasons as $season) {
|
||||||
|
foreach ($supportedLocales as $locale) {
|
||||||
|
cache()->delete(
|
||||||
|
"page_podcast{$podcast->id}_season{$season['season_number']}_{$locale}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($podcast->episodes as $episode) {
|
||||||
|
foreach ($supportedLocales as $locale) {
|
||||||
|
cache()->delete(
|
||||||
|
"page_podcast{$podcast->id}_episode{$episode->id}_{$locale}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
@ -76,8 +76,7 @@ class PlatformModel extends Model
|
|||||||
|
|
||||||
public function savePlatformLinks($podcastId, $platformLinksData)
|
public function savePlatformLinks($podcastId, $platformLinksData)
|
||||||
{
|
{
|
||||||
cache()->delete("podcast{$podcastId}_platforms");
|
$this->clearCache($podcastId);
|
||||||
cache()->delete("podcast{$podcastId}_platformLinks");
|
|
||||||
|
|
||||||
// Remove already previously set platforms to overwrite them
|
// Remove already previously set platforms to overwrite them
|
||||||
$this->db
|
$this->db
|
||||||
@ -109,12 +108,39 @@ class PlatformModel extends Model
|
|||||||
|
|
||||||
public function removePlatformLink($podcastId, $platformId)
|
public function removePlatformLink($podcastId, $platformId)
|
||||||
{
|
{
|
||||||
cache()->delete("podcast{$podcastId}_platforms");
|
$this->clearCache($podcastId);
|
||||||
cache()->delete("podcast{$podcastId}_platformLinks");
|
|
||||||
|
|
||||||
return $this->db->table('platform_links')->delete([
|
return $this->db->table('platform_links')->delete([
|
||||||
'podcast_id' => $podcastId,
|
'podcast_id' => $podcastId,
|
||||||
'platform_id' => $platformId,
|
'platform_id' => $platformId,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function clearCache($podcastId)
|
||||||
|
{
|
||||||
|
cache()->delete("podcast{$podcastId}_platforms");
|
||||||
|
cache()->delete("podcast{$podcastId}_platformLinks");
|
||||||
|
|
||||||
|
// 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}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -170,20 +170,54 @@ class PodcastModel extends Model
|
|||||||
$podcast = (new PodcastModel())->getPodcastById(
|
$podcast = (new PodcastModel())->getPodcastById(
|
||||||
is_array($data['id']) ? $data['id'][0] : $data['id']
|
is_array($data['id']) ? $data['id'][0] : $data['id']
|
||||||
);
|
);
|
||||||
|
$supportedLocales = config('App')->supportedLocales;
|
||||||
|
|
||||||
// delete cache for rss feed and podcast pages
|
// delete cache for rss feed and podcast pages
|
||||||
cache()->delete(md5($podcast->feed_url));
|
cache()->delete(md5($podcast->feed_url));
|
||||||
cache()->delete(md5($podcast->link));
|
|
||||||
|
|
||||||
// clear cache for every podcast's episode page?
|
|
||||||
foreach ($podcast->episodes as $episode) {
|
|
||||||
cache()->delete(md5($episode->link));
|
|
||||||
}
|
|
||||||
|
|
||||||
// delete model requests cache
|
// delete model requests cache
|
||||||
cache()->delete("podcast{$podcast->id}");
|
cache()->delete("podcast{$podcast->id}");
|
||||||
cache()->delete("podcast@{$podcast->name}");
|
cache()->delete("podcast@{$podcast->name}");
|
||||||
|
|
||||||
|
// 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}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete episode lists cache per year / season
|
||||||
|
// and localized pages
|
||||||
|
$episodeModel = new EpisodeModel();
|
||||||
|
$years = $episodeModel->getYears($podcast->id);
|
||||||
|
$seasons = $episodeModel->getSeasons($podcast->id);
|
||||||
|
|
||||||
|
foreach ($years as $year) {
|
||||||
|
cache()->delete("podcast{$podcast->id}_{$year['year']}_episodes");
|
||||||
|
foreach ($supportedLocales as $locale) {
|
||||||
|
cache()->delete(
|
||||||
|
"page_podcast{$podcast->id}_{$year['year']}_{$locale}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($seasons as $season) {
|
||||||
|
cache()->delete(
|
||||||
|
"podcast{$podcast->id}_season{$season['season_number']}_episodes"
|
||||||
|
);
|
||||||
|
foreach ($supportedLocales as $locale) {
|
||||||
|
cache()->delete(
|
||||||
|
"page_podcast{$podcast->id}_season{$season['season_number']}_{$locale}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete query cache
|
||||||
|
cache()->delete("podcast{$podcast->id}_defaultQuery");
|
||||||
|
cache()->delete("podcast{$podcast->id}_years");
|
||||||
|
cache()->delete("podcast{$podcast->id}_seasons");
|
||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user