feat: add Plugins module with base files for plugins architecture

This commit is contained in:
Yassine Doghri 2024-04-28 17:14:45 +00:00
parent bb628f355f
commit 5293752bb5
13 changed files with 174 additions and 0 deletions

4
.gitignore vendored
View File

@ -187,3 +187,7 @@ data
castopod/
castopod-*.zip
castopod-*.tar.gz
# Plugins
plugins/*
!plugins/.gitkeep

View File

@ -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/',

View File

@ -15,6 +15,7 @@ return ECSConfig::configure()
->withPaths([
__DIR__ . '/app',
__DIR__ . '/modules',
__DIR__ . '/plugins',
__DIR__ . '/themes',
__DIR__ . '/tests',
__DIR__ . '/public',

View File

@ -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
{
}
}

View File

@ -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:
}
}

View File

@ -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'];
}

View File

@ -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',
]);
}
);

View File

@ -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();
}
}

View File

@ -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(),
]);
}
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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\(\)#'

0
plugins/.gitkeep Normal file
View File