From 00bd4c02ee23b181d74e7731626bfec3b1ff4916 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 18 Dec 2024 17:50:33 +0000 Subject: [PATCH] fix(plugins): delete relevant cache when submitting settings --- modules/Plugins/Config/Routes.php | 7 +++---- modules/Plugins/Controllers/PluginController.php | 5 ++++- modules/Plugins/Core/BasePlugin.php | 9 +++++++++ modules/Plugins/Core/Plugins.php | 8 ++++++++ 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/modules/Plugins/Config/Routes.php b/modules/Plugins/Config/Routes.php index 81e2dc27..3f7880ce 100644 --- a/modules/Plugins/Config/Routes.php +++ b/modules/Plugins/Config/Routes.php @@ -27,7 +27,7 @@ $routes->group( 'as' => 'plugins-view', 'filter' => 'permission:plugins.manage', ]); - $routes->get('settings', 'PluginController::settings/$1/$2', [ + $routes->get('settings', 'PluginController::settingsView/$1/$2', [ 'as' => 'plugins-settings-general', 'filter' => 'permission:plugins.manage', ]); @@ -35,7 +35,7 @@ $routes->group( 'as' => 'plugins-settings-general-action', 'filter' => 'permission:plugins.manage', ]); - $routes->get('(:num)', 'PluginController::settings/$1/$2/$3', [ + $routes->get('(:num)', 'PluginController::settingsView/$1/$2/$3', [ 'as' => 'plugins-settings-podcast', 'filter' => 'permission:podcast$3.edit', ]); @@ -43,7 +43,7 @@ $routes->group( 'as' => 'plugins-settings-podcast-action', 'filter' => 'permission:podcast$3.edit', ]); - $routes->get('(:num)/(:num)', 'PluginController::settings/$1/$2/$3/$4', [ + $routes->get('(:num)/(:num)', 'PluginController::settingsView/$1/$2/$3/$4', [ 'as' => 'plugins-settings-episode', 'filter' => 'permission:podcast$3.episodes.edit', ]); @@ -59,7 +59,6 @@ $routes->group( 'as' => 'plugins-deactivate', 'filter' => 'permission:plugins.manage', ]); - // TODO: change to delete $routes->get('uninstall', 'PluginController::uninstall/$1/$2', [ 'as' => 'plugins-uninstall', 'filter' => 'permission:plugins.manage', diff --git a/modules/Plugins/Controllers/PluginController.php b/modules/Plugins/Controllers/PluginController.php index 8f2b145c..65ae758b 100644 --- a/modules/Plugins/Controllers/PluginController.php +++ b/modules/Plugins/Controllers/PluginController.php @@ -80,7 +80,7 @@ class PluginController extends BaseController ]); } - public function settings( + public function settingsView( string $vendor, string $package, string $podcastId = null, @@ -223,6 +223,9 @@ class PluginController extends BaseController $this->plugins->setOption($plugin, $field->key, $this->castFieldValue($field, $fieldValue), $context); } + // clear cache after setting options + $plugin->clearCache(); + return redirect()->back() ->with('message', lang('Plugins.messages.saveSettingsSuccess', [ 'pluginTitle' => $plugin->getTitle(), diff --git a/modules/Plugins/Core/BasePlugin.php b/modules/Plugins/Core/BasePlugin.php index 6257b382..27734dbb 100644 --- a/modules/Plugins/Core/BasePlugin.php +++ b/modules/Plugins/Core/BasePlugin.php @@ -121,6 +121,15 @@ abstract class BasePlugin implements PluginInterface return get_plugin_setting($this->key, $key, ['episode', $episodeId]); } + final public function clearCache(): void + { + foreach ($this->getHooks() as $hook) { + foreach (Plugins::CACHE_MAP[$hook] ?? [] as $cacheGlob) { + cache()->deleteMatching($cacheGlob); + } + } + } + /** * @return bool true on success, false on failure */ diff --git a/modules/Plugins/Core/Plugins.php b/modules/Plugins/Core/Plugins.php index 95f7b3d7..29b9eb0f 100644 --- a/modules/Plugins/Core/Plugins.php +++ b/modules/Plugins/Core/Plugins.php @@ -25,6 +25,14 @@ class Plugins */ public const HOOKS = ['rssBeforeChannel', 'rssAfterChannel', 'rssBeforeItem', 'rssAfterItem', 'siteHead']; + public const CACHE_MAP = [ + 'rssBeforeChannel' => ['podcast*feed*'], + 'rssAfterChannel' => ['podcast*feed*'], + 'rssBeforeItem' => ['podcast*feed*'], + 'rssAfterItem' => ['podcast*feed*'], + 'siteHead' => ['page*'], + ]; + public const FIELDS_VALIDATIONS = [ 'checkbox' => ['permit_empty'], 'datetime' => ['valid_date[Y-m-d H:i]'],