fix(plugins): delete relevant cache when submitting settings

This commit is contained in:
Yassine Doghri 2024-12-18 17:50:33 +00:00
parent 85704bfbe0
commit 00bd4c02ee
4 changed files with 24 additions and 5 deletions

View File

@ -27,7 +27,7 @@ $routes->group(
'as' => 'plugins-view', 'as' => 'plugins-view',
'filter' => 'permission:plugins.manage', 'filter' => 'permission:plugins.manage',
]); ]);
$routes->get('settings', 'PluginController::settings/$1/$2', [ $routes->get('settings', 'PluginController::settingsView/$1/$2', [
'as' => 'plugins-settings-general', 'as' => 'plugins-settings-general',
'filter' => 'permission:plugins.manage', 'filter' => 'permission:plugins.manage',
]); ]);
@ -35,7 +35,7 @@ $routes->group(
'as' => 'plugins-settings-general-action', 'as' => 'plugins-settings-general-action',
'filter' => 'permission:plugins.manage', 'filter' => 'permission:plugins.manage',
]); ]);
$routes->get('(:num)', 'PluginController::settings/$1/$2/$3', [ $routes->get('(:num)', 'PluginController::settingsView/$1/$2/$3', [
'as' => 'plugins-settings-podcast', 'as' => 'plugins-settings-podcast',
'filter' => 'permission:podcast$3.edit', 'filter' => 'permission:podcast$3.edit',
]); ]);
@ -43,7 +43,7 @@ $routes->group(
'as' => 'plugins-settings-podcast-action', 'as' => 'plugins-settings-podcast-action',
'filter' => 'permission:podcast$3.edit', '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', 'as' => 'plugins-settings-episode',
'filter' => 'permission:podcast$3.episodes.edit', 'filter' => 'permission:podcast$3.episodes.edit',
]); ]);
@ -59,7 +59,6 @@ $routes->group(
'as' => 'plugins-deactivate', 'as' => 'plugins-deactivate',
'filter' => 'permission:plugins.manage', 'filter' => 'permission:plugins.manage',
]); ]);
// TODO: change to delete
$routes->get('uninstall', 'PluginController::uninstall/$1/$2', [ $routes->get('uninstall', 'PluginController::uninstall/$1/$2', [
'as' => 'plugins-uninstall', 'as' => 'plugins-uninstall',
'filter' => 'permission:plugins.manage', 'filter' => 'permission:plugins.manage',

View File

@ -80,7 +80,7 @@ class PluginController extends BaseController
]); ]);
} }
public function settings( public function settingsView(
string $vendor, string $vendor,
string $package, string $package,
string $podcastId = null, string $podcastId = null,
@ -223,6 +223,9 @@ class PluginController extends BaseController
$this->plugins->setOption($plugin, $field->key, $this->castFieldValue($field, $fieldValue), $context); $this->plugins->setOption($plugin, $field->key, $this->castFieldValue($field, $fieldValue), $context);
} }
// clear cache after setting options
$plugin->clearCache();
return redirect()->back() return redirect()->back()
->with('message', lang('Plugins.messages.saveSettingsSuccess', [ ->with('message', lang('Plugins.messages.saveSettingsSuccess', [
'pluginTitle' => $plugin->getTitle(), 'pluginTitle' => $plugin->getTitle(),

View File

@ -121,6 +121,15 @@ abstract class BasePlugin implements PluginInterface
return get_plugin_setting($this->key, $key, ['episode', $episodeId]); 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 * @return bool true on success, false on failure
*/ */

View File

@ -25,6 +25,14 @@ class Plugins
*/ */
public const HOOKS = ['rssBeforeChannel', 'rssAfterChannel', 'rssBeforeItem', 'rssAfterItem', 'siteHead']; 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 = [ public const FIELDS_VALIDATIONS = [
'checkbox' => ['permit_empty'], 'checkbox' => ['permit_empty'],
'datetime' => ['valid_date[Y-m-d H:i]'], 'datetime' => ['valid_date[Y-m-d H:i]'],