. */ namespace SP\Domain\Plugin\Services; use SP\Core\Application; use SP\Core\Events\Event; use SP\Core\Events\EventMessage; use SP\Domain\Common\Services\Service; use SP\Domain\Core\Exceptions\ConstraintException; use SP\Domain\Core\Exceptions\QueryException; use SP\Domain\Plugin\Models\Plugin as PluginModel; use SP\Domain\Plugin\Ports\Plugin; use SP\Domain\Plugin\Ports\PluginManagerService; use SP\Domain\Plugin\Ports\PluginRegisterService; use SP\Infrastructure\Common\Repositories\NoSuchItemException; use function SP\__u; /** * Class PluginRegister */ final class PluginRegister extends Service implements PluginRegisterService { public function __construct(Application $application, private readonly PluginManagerService $pluginManagerService) { parent::__construct($application); } /** * @throws ConstraintException * @throws QueryException */ public function registerFor(Plugin $plugin): void { try { $this->pluginManagerService->getByName($plugin->getName()); $this->eventDispatcher->notify( 'register.plugin', new Event( $this, EventMessage::factory() ->addDescription(__u('Plugin already registered')) ->addDetail(__u('Name'), $plugin->getName()) ) ); } catch (NoSuchItemException) { $this->eventDispatcher->notify( 'register.plugin', new Event( $this, EventMessage::factory() ->addDescription(__u('Plugin not registered yet')) ->addDetail(__u('Name'), $plugin->getName()) ) ); $this->register($plugin); } } /** * @throws ConstraintException * @throws QueryException */ private function register(Plugin $plugin): void { $this->pluginManagerService->create(new PluginModel(['name' => $plugin->getName(), 'enabled' => false])); $this->eventDispatcher->notify( 'create.plugin', new Event( $this, EventMessage::factory() ->addDescription(__u('New Plugin')) ->addDetail(__u('Name'), $plugin->getName()) ) ); } }