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-*.zip
|
||||
castopod-*.tar.gz
|
||||
|
||||
# Plugins
|
||||
plugins/*
|
||||
!plugins/.gitkeep
|
||||
|
|
|
@ -50,10 +50,12 @@ class Autoload extends AutoloadConfig
|
|||
'Modules\Media' => ROOTPATH . 'modules/Media/',
|
||||
'Modules\MediaClipper' => ROOTPATH . 'modules/MediaClipper/',
|
||||
'Modules\Platforms' => ROOTPATH . 'modules/Platforms/',
|
||||
'Modules\Plugins' => ROOTPATH . 'modules/Plugins/',
|
||||
'Modules\PodcastImport' => ROOTPATH . 'modules/PodcastImport/',
|
||||
'Modules\PremiumPodcasts' => ROOTPATH . 'modules/PremiumPodcasts/',
|
||||
'Modules\Update' => ROOTPATH . 'modules/Update/',
|
||||
'Modules\WebSub' => ROOTPATH . 'modules/WebSub/',
|
||||
'Plugins' => ROOTPATH . 'plugins',
|
||||
'Themes' => ROOTPATH . 'themes',
|
||||
'ViewComponents' => APPPATH . 'Libraries/ViewComponents/',
|
||||
'ViewThemes' => APPPATH . 'Libraries/ViewThemes/',
|
||||
|
|
1
ecs.php
1
ecs.php
|
@ -15,6 +15,7 @@ return ECSConfig::configure()
|
|||
->withPaths([
|
||||
__DIR__ . '/app',
|
||||
__DIR__ . '/modules',
|
||||
__DIR__ . '/plugins',
|
||||
__DIR__ . '/themes',
|
||||
__DIR__ . '/tests',
|
||||
__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\Media\Config\
|
||||
- Modules\MediaClipper\Config\
|
||||
- Modules\Plugins\Config\
|
||||
- Modules\PodcastImport\Config\
|
||||
- Modules\PremiumPodcasts\Config\
|
||||
- Modules\WebSub\Config\
|
||||
|
@ -45,6 +46,7 @@ parameters:
|
|||
- Michalsn\Uuid\Config\Services
|
||||
- Modules\Media\Config\Services
|
||||
- Modules\Platforms\Config\Services
|
||||
- Modules\Plugins\Config\Services
|
||||
- Modules\PremiumPodcasts\Config\Services
|
||||
ignoreErrors:
|
||||
- '#^Call to an undefined method CodeIgniter\\Cache\\CacheInterface\:\:deleteMatching\(\)#'
|
||||
|
|
Loading…
Reference in New Issue