feat: add Plugins module with base files for plugins architecture
This commit is contained in:
parent
bb628f355f
commit
5293752bb5
|
@ -187,3 +187,7 @@ data
|
||||||
castopod/
|
castopod/
|
||||||
castopod-*.zip
|
castopod-*.zip
|
||||||
castopod-*.tar.gz
|
castopod-*.tar.gz
|
||||||
|
|
||||||
|
# Plugins
|
||||||
|
plugins/*
|
||||||
|
!plugins/.gitkeep
|
||||||
|
|
|
@ -50,10 +50,12 @@ class Autoload extends AutoloadConfig
|
||||||
'Modules\Media' => ROOTPATH . 'modules/Media/',
|
'Modules\Media' => ROOTPATH . 'modules/Media/',
|
||||||
'Modules\MediaClipper' => ROOTPATH . 'modules/MediaClipper/',
|
'Modules\MediaClipper' => ROOTPATH . 'modules/MediaClipper/',
|
||||||
'Modules\Platforms' => ROOTPATH . 'modules/Platforms/',
|
'Modules\Platforms' => ROOTPATH . 'modules/Platforms/',
|
||||||
|
'Modules\Plugins' => ROOTPATH . 'modules/Plugins/',
|
||||||
'Modules\PodcastImport' => ROOTPATH . 'modules/PodcastImport/',
|
'Modules\PodcastImport' => ROOTPATH . 'modules/PodcastImport/',
|
||||||
'Modules\PremiumPodcasts' => ROOTPATH . 'modules/PremiumPodcasts/',
|
'Modules\PremiumPodcasts' => ROOTPATH . 'modules/PremiumPodcasts/',
|
||||||
'Modules\Update' => ROOTPATH . 'modules/Update/',
|
'Modules\Update' => ROOTPATH . 'modules/Update/',
|
||||||
'Modules\WebSub' => ROOTPATH . 'modules/WebSub/',
|
'Modules\WebSub' => ROOTPATH . 'modules/WebSub/',
|
||||||
|
'Plugins' => ROOTPATH . 'plugins',
|
||||||
'Themes' => ROOTPATH . 'themes',
|
'Themes' => ROOTPATH . 'themes',
|
||||||
'ViewComponents' => APPPATH . 'Libraries/ViewComponents/',
|
'ViewComponents' => APPPATH . 'Libraries/ViewComponents/',
|
||||||
'ViewThemes' => APPPATH . 'Libraries/ViewThemes/',
|
'ViewThemes' => APPPATH . 'Libraries/ViewThemes/',
|
||||||
|
|
1
ecs.php
1
ecs.php
|
@ -15,6 +15,7 @@ return ECSConfig::configure()
|
||||||
->withPaths([
|
->withPaths([
|
||||||
__DIR__ . '/app',
|
__DIR__ . '/app',
|
||||||
__DIR__ . '/modules',
|
__DIR__ . '/modules',
|
||||||
|
__DIR__ . '/plugins',
|
||||||
__DIR__ . '/themes',
|
__DIR__ . '/themes',
|
||||||
__DIR__ . '/tests',
|
__DIR__ . '/tests',
|
||||||
__DIR__ . '/public',
|
__DIR__ . '/public',
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Modules\Plugins;
|
||||||
|
|
||||||
|
use App\Entities\Episode;
|
||||||
|
use App\Entities\Podcast;
|
||||||
|
use App\Libraries\SimpleRSSElement;
|
||||||
|
|
||||||
|
abstract class BasePlugin implements PluginInterface
|
||||||
|
{
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
// load metadata from json
|
||||||
|
// load name, description, etc.
|
||||||
|
}
|
||||||
|
|
||||||
|
public function init(): void
|
||||||
|
{
|
||||||
|
// add to admin navigation
|
||||||
|
|
||||||
|
// TODO: setup navigation and views?
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setChannelTag(Podcast $podcast, SimpleRSSElement $channel): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setItemTag(Episode $episode, SimpleRSSElement $item): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Modules\Fediverse\Commands;
|
||||||
|
|
||||||
|
use CodeIgniter\CLI\BaseCommand;
|
||||||
|
|
||||||
|
class InstallCommand extends BaseCommand
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param array<int|string, string|null> $params
|
||||||
|
*/
|
||||||
|
public function run(array $params): void
|
||||||
|
{
|
||||||
|
// TODO:
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Modules\Plugins\Config;
|
||||||
|
|
||||||
|
use CodeIgniter\Config\BaseConfig;
|
||||||
|
|
||||||
|
class Plugins extends BaseConfig
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var list<string>
|
||||||
|
*/
|
||||||
|
public array $repositories = ['https://castopod.org/plugins/repository.json'];
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use CodeIgniter\Router\RouteCollection;
|
||||||
|
|
||||||
|
/** @var RouteCollection $routes */
|
||||||
|
$routes->group(
|
||||||
|
config('Admin')
|
||||||
|
->gateway,
|
||||||
|
[
|
||||||
|
'namespace' => 'Modules\Plugins\Controllers',
|
||||||
|
],
|
||||||
|
static function ($routes): void {
|
||||||
|
$routes->get('plugins', 'PluginsController', [
|
||||||
|
'as' => 'plugins',
|
||||||
|
'filter' => 'permission:podcasts.import',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
);
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Modules\Plugins\Config;
|
||||||
|
|
||||||
|
use CodeIgniter\Config\BaseService;
|
||||||
|
use Modules\Plugins\Plugins;
|
||||||
|
|
||||||
|
class Services extends BaseService
|
||||||
|
{
|
||||||
|
public static function plugins(bool $getShared = true): Plugins
|
||||||
|
{
|
||||||
|
if ($getShared) {
|
||||||
|
return self::getSharedInstance('plugins');
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Plugins();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use Modules\Admin\Controllers\BaseController;
|
||||||
|
|
||||||
|
class Controller extends BaseController
|
||||||
|
{
|
||||||
|
public function index(): string
|
||||||
|
{
|
||||||
|
$plugins = service('plugins');
|
||||||
|
|
||||||
|
return view('plugins', [
|
||||||
|
'installedPlugins' => $plugins->getInstalled(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Modules\Plugins;
|
||||||
|
|
||||||
|
use App\Entities\Episode;
|
||||||
|
use App\Entities\Podcast;
|
||||||
|
use App\Libraries\SimpleRSSElement;
|
||||||
|
|
||||||
|
interface PluginInterface
|
||||||
|
{
|
||||||
|
public function setChannelTag(Podcast $podcast, SimpleRSSElement $channel): void;
|
||||||
|
|
||||||
|
public function setItemTag(Episode $episode, SimpleRSSElement $item): void;
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Modules\Plugins;
|
||||||
|
|
||||||
|
class Plugins
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var array<PluginInterface>
|
||||||
|
*/
|
||||||
|
protected array $installed = [];
|
||||||
|
|
||||||
|
public function registerPlugin(PluginInterface $plugin): void
|
||||||
|
{
|
||||||
|
$this->installed[] = $plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<PluginInterface>
|
||||||
|
*/
|
||||||
|
public function getInstalled(): array
|
||||||
|
{
|
||||||
|
return $this->installed;
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,6 +27,7 @@ parameters:
|
||||||
- Modules\Install\Config\
|
- Modules\Install\Config\
|
||||||
- Modules\Media\Config\
|
- Modules\Media\Config\
|
||||||
- Modules\MediaClipper\Config\
|
- Modules\MediaClipper\Config\
|
||||||
|
- Modules\Plugins\Config\
|
||||||
- Modules\PodcastImport\Config\
|
- Modules\PodcastImport\Config\
|
||||||
- Modules\PremiumPodcasts\Config\
|
- Modules\PremiumPodcasts\Config\
|
||||||
- Modules\WebSub\Config\
|
- Modules\WebSub\Config\
|
||||||
|
@ -45,6 +46,7 @@ parameters:
|
||||||
- Michalsn\Uuid\Config\Services
|
- Michalsn\Uuid\Config\Services
|
||||||
- Modules\Media\Config\Services
|
- Modules\Media\Config\Services
|
||||||
- Modules\Platforms\Config\Services
|
- Modules\Platforms\Config\Services
|
||||||
|
- Modules\Plugins\Config\Services
|
||||||
- Modules\PremiumPodcasts\Config\Services
|
- Modules\PremiumPodcasts\Config\Services
|
||||||
ignoreErrors:
|
ignoreErrors:
|
||||||
- '#^Call to an undefined method CodeIgniter\\Cache\\CacheInterface\:\:deleteMatching\(\)#'
|
- '#^Call to an undefined method CodeIgniter\\Cache\\CacheInterface\:\:deleteMatching\(\)#'
|
||||||
|
|
Loading…
Reference in New Issue