]> git.mxchange.org Git - friendica.git/commitdiff
add events for storage_config and storage_instance hooks
authorArt4 <art4@wlabs.de>
Fri, 14 Mar 2025 10:12:56 +0000 (10:12 +0000)
committerArt4 <art4@wlabs.de>
Fri, 14 Mar 2025 10:12:56 +0000 (10:12 +0000)
src/Core/Hooks/HookEventBridge.php
src/Core/Storage/Repository/StorageManager.php
src/Event/ArrayFilterEvent.php
tests/Unit/Core/Hooks/HookEventBridgeTest.php
tests/Unit/Event/ArrayFilterEventTest.php
tests/Util/FakeEventDispatcher.php [new file with mode: 0644]
tests/src/Core/Storage/Repository/StorageManagerTest.php

index 18a41a1730bc21b172c88ff90a2a601f9dfdf266..6dc9d01e20728ebf969e889466c44ceb27a6e9ab 100644 (file)
@@ -68,6 +68,8 @@ final class HookEventBridge
                ArrayFilterEvent::BLOCK_CONTACT                   => 'block',
                ArrayFilterEvent::UNBLOCK_CONTACT                 => 'unblock',
                ArrayFilterEvent::ADD_WORKER_TASK                 => 'proc_run',
+               ArrayFilterEvent::STORAGE_CONFIG                  => 'storage_config',
+               ArrayFilterEvent::STORAGE_INSTANCE                => 'storage_instance',
                HtmlFilterEvent::HEAD                             => 'head',
                HtmlFilterEvent::FOOTER                           => 'footer',
                HtmlFilterEvent::PAGE_HEADER                      => 'page_header',
@@ -116,6 +118,8 @@ final class HookEventBridge
                        ArrayFilterEvent::BLOCK_CONTACT                   => 'onArrayFilterEvent',
                        ArrayFilterEvent::UNBLOCK_CONTACT                 => 'onArrayFilterEvent',
                        ArrayFilterEvent::ADD_WORKER_TASK                 => 'onArrayFilterEvent',
+                       ArrayFilterEvent::STORAGE_CONFIG                  => 'onArrayFilterEvent',
+                       ArrayFilterEvent::STORAGE_INSTANCE                => 'onArrayFilterEvent',
                        HtmlFilterEvent::HEAD                             => 'onHtmlFilterEvent',
                        HtmlFilterEvent::FOOTER                           => 'onHtmlFilterEvent',
                        HtmlFilterEvent::PAGE_HEADER                      => 'onHtmlFilterEvent',
index bbd9e13f1406217645363c803425027559716d1f..1de89dbddc9e2d01b1a184f61f2728bea72a91d1 100644 (file)
@@ -20,7 +20,9 @@ use Friendica\Core\Storage\Capability\ICanWriteToStorage;
 use Friendica\Database\Database;
 use Friendica\Core\Storage\Type;
 use Friendica\DI;
+use Friendica\Event\ArrayFilterEvent;
 use Friendica\Network\HTTPException\InternalServerErrorException;
+use Psr\EventDispatcher\EventDispatcherInterface;
 use Psr\Log\LoggerInterface;
 
 /**
@@ -55,6 +57,7 @@ class StorageManager
        private $config;
        /** @var LoggerInterface */
        private $logger;
+       private EventDispatcherInterface $eventDispatcher;
        /** @var L10n */
        private $l10n;
 
@@ -71,11 +74,12 @@ class StorageManager
         * @throws InvalidClassStorageException in case the active backend class is invalid
         * @throws StorageException in case of unexpected errors during the active backend class loading
         */
-       public function __construct(Database $dba, IManageConfigValues $config, LoggerInterface $logger, L10n $l10n, bool $includeAddon = true)
+       public function __construct(Database $dba, IManageConfigValues $config, LoggerInterface $logger, EventDispatcherInterface $eventDispatcher, L10n $l10n, bool $includeAddon = true)
        {
                $this->dba           = $dba;
                $this->config        = $config;
                $this->logger        = $logger;
+               $this->eventDispatcher = $eventDispatcher;
                $this->l10n          = $l10n;
                $this->validBackends = $config->get('storage', 'backends', self::DEFAULT_BACKENDS);
 
@@ -146,8 +150,12 @@ class StorageManager
                                        'name'           => $name,
                                        'storage_config' => null,
                                ];
+
                                try {
-                                       Hook::callAll('storage_config', $data);
+                                       $data = $this->eventDispatcher->dispatch(
+                                               new ArrayFilterEvent(ArrayFilterEvent::STORAGE_CONFIG, $data),
+                                       )->getArray();
+
                                        if (!($data['storage_config'] ?? null) instanceof ICanConfigureStorage) {
                                                throw new InvalidClassStorageException(sprintf('Configuration for backend %s was not found', $name));
                                        }
@@ -201,8 +209,12 @@ class StorageManager
                                                'name'    => $name,
                                                'storage' => null,
                                        ];
+
                                        try {
-                                               Hook::callAll('storage_instance', $data);
+                                               $data = $this->eventDispatcher->dispatch(
+                                                       new ArrayFilterEvent(ArrayFilterEvent::STORAGE_INSTANCE, $data),
+                                               )->getArray();
+
                                                if (!($data['storage'] ?? null) instanceof ICanReadFromStorage) {
                                                        throw new InvalidClassStorageException(sprintf('Backend %s was not found', $name));
                                                }
index 6967524f860d1c855b09f6ad4bf4d5be29f35d59..4a08ba4fa3a757d8779ef21fe6ed03aaa14e7eea 100644 (file)
@@ -74,6 +74,10 @@ final class ArrayFilterEvent extends Event
 
        public const ADD_WORKER_TASK = 'friendica.data.add_worker_task';
 
+       public const STORAGE_CONFIG = 'friendica.data.storage_config';
+
+       public const STORAGE_INSTANCE = 'friendica.data.storage_instance';
+
        private array $array;
 
        public function __construct(string $name, array $array)
index d7df82e4d10ef3065ad9ae8c3390b8ef9466b292..8ae803bdab67baffe1fd4a85878fb197a408104b 100644 (file)
@@ -57,6 +57,8 @@ class HookEventBridgeTest extends TestCase
                        ArrayFilterEvent::BLOCK_CONTACT                   => 'onArrayFilterEvent',
                        ArrayFilterEvent::UNBLOCK_CONTACT                 => 'onArrayFilterEvent',
                        ArrayFilterEvent::ADD_WORKER_TASK                 => 'onArrayFilterEvent',
+                       ArrayFilterEvent::STORAGE_CONFIG                  => 'onArrayFilterEvent',
+                       ArrayFilterEvent::STORAGE_INSTANCE                => 'onArrayFilterEvent',
                        HtmlFilterEvent::HEAD                             => 'onHtmlFilterEvent',
                        HtmlFilterEvent::FOOTER                           => 'onHtmlFilterEvent',
                        HtmlFilterEvent::PAGE_HEADER                      => 'onHtmlFilterEvent',
@@ -290,6 +292,8 @@ class HookEventBridgeTest extends TestCase
                        [ArrayFilterEvent::BLOCK_CONTACT, 'block'],
                        [ArrayFilterEvent::UNBLOCK_CONTACT, 'unblock'],
                        [ArrayFilterEvent::ADD_WORKER_TASK, 'proc_run'],
+                       [ArrayFilterEvent::STORAGE_CONFIG, 'storage_config'],
+                       [ArrayFilterEvent::STORAGE_INSTANCE, 'storage_instance'],
                ];
        }
 
index 2afebba49614bdda9cc7146474fbc53896078e53..c57b45ceb1330dc9c04e01ebc3b87b9a25d2d0d1 100644 (file)
@@ -53,6 +53,8 @@ class ArrayFilterEventTest extends TestCase
                        [ArrayFilterEvent::BLOCK_CONTACT, 'friendica.data.block_contact'],
                        [ArrayFilterEvent::UNBLOCK_CONTACT, 'friendica.data.unblock_contact'],
                        [ArrayFilterEvent::ADD_WORKER_TASK, 'friendica.data.add_worker_task'],
+                       [ArrayFilterEvent::STORAGE_CONFIG, 'friendica.data.storage_config'],
+                       [ArrayFilterEvent::STORAGE_INSTANCE, 'friendica.data.storage_instance'],
                ];
        }
 
diff --git a/tests/Util/FakeEventDispatcher.php b/tests/Util/FakeEventDispatcher.php
new file mode 100644 (file)
index 0000000..070e8e7
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+// Copyright (C) 2010-2024, the Friendica project
+// SPDX-FileCopyrightText: 2010-2024 the Friendica project
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+declare(strict_types=1);
+
+namespace Friendica\Test\Util;
+
+use Psr\EventDispatcher\EventDispatcherInterface;
+
+/**
+ * Defines a dispatcher for events.
+ */
+final class FakeEventDispatcher implements EventDispatcherInterface
+{
+    /**
+     * Provide all relevant listeners with an event to process.
+     *
+     * @template T of object
+        * @param T $event
+        *
+        * @return T The passed $event MUST be returned
+     */
+    public function dispatch(object $event): object
+       {
+               return $event;
+       }
+}
index 7697f593814077b34f9aa07c22376a75a7ef40f8..14aa41f5a4294fdc20c39b167dd4d2b48ff3b6eb 100644 (file)
@@ -23,12 +23,13 @@ use Friendica\Core\Storage\Type\SystemResource;
 use Friendica\Database\Database;
 use Friendica\DI;
 use Friendica\Core\Config\Factory\Config;
+use Friendica\Core\Hooks\HookEventBridge;
 use Friendica\Core\Storage\Type;
 use Friendica\Test\DatabaseTestCase;
 use Friendica\Test\Util\CreateDatabaseTrait;
 use Friendica\Test\Util\Database\StaticDatabase;
+use Friendica\Test\Util\FakeEventDispatcher;
 use org\bovigo\vfs\vfsStream;
-use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use Friendica\Test\Util\SampleStorageBackend;
 
@@ -38,8 +39,6 @@ class StorageManagerTest extends DatabaseTestCase
 
        /** @var IManageConfigValues */
        private $config;
-       /** @var LoggerInterface */
-       private $logger;
        /** @var L10n */
        private $l10n;
 
@@ -56,7 +55,6 @@ class StorageManagerTest extends DatabaseTestCase
 
                vfsStream::newDirectory(Type\FilesystemConfig::DEFAULT_BASE_FOLDER, 0777)->at($this->root);
 
-               $this->logger   = new NullLogger();
                $this->database = $this->getDbInstance();
 
                $configFactory     = new Config();
@@ -87,7 +85,14 @@ class StorageManagerTest extends DatabaseTestCase
         */
        public function testInstance()
        {
-               $storageManager = new StorageManager($this->database, $this->config, $this->logger, $this->l10n, false);
+               $storageManager = new StorageManager(
+                       $this->database,
+                       $this->config,
+                       new NullLogger(),
+                       new FakeEventDispatcher(),
+                       $this->l10n,
+                       false
+               );
 
                self::assertInstanceOf(StorageManager::class, $storageManager);
        }
@@ -149,7 +154,14 @@ class StorageManagerTest extends DatabaseTestCase
                        $this->config->set('storage', 'name', $name);
                }
 
-               $storageManager = new StorageManager($this->database, $this->config, $this->logger, $this->l10n, false);
+               $storageManager = new StorageManager(
+                       $this->database,
+                       $this->config,
+                       new NullLogger(),
+                       new FakeEventDispatcher(),
+                       $this->l10n,
+                       false
+               );
 
                if ($interface === ICanWriteToStorage::class) {
                        $storage = $storageManager->getWritableStorageByName($name);
@@ -169,7 +181,14 @@ class StorageManagerTest extends DatabaseTestCase
         */
        public function testIsValidBackend($name, $valid, $interface, $assert, $assertName)
        {
-               $storageManager = new StorageManager($this->database, $this->config, $this->logger, $this->l10n, false);
+               $storageManager = new StorageManager(
+                       $this->database,
+                       $this->config,
+                       new NullLogger(),
+                       new FakeEventDispatcher(),
+                       $this->l10n,
+                       false
+               );
 
                // true in every of the backends
                self::assertEquals(!empty($assertName), $storageManager->isValidBackend($name));
@@ -183,7 +202,14 @@ class StorageManagerTest extends DatabaseTestCase
         */
        public function testListBackends()
        {
-               $storageManager = new StorageManager($this->database, $this->config, $this->logger, $this->l10n, false);
+               $storageManager = new StorageManager(
+                       $this->database,
+                       $this->config,
+                       new NullLogger(),
+                       new FakeEventDispatcher(),
+                       $this->l10n,
+                       false
+               );
 
                self::assertEquals(StorageManager::DEFAULT_BACKENDS, $storageManager->listBackends());
        }
@@ -199,7 +225,14 @@ class StorageManagerTest extends DatabaseTestCase
                        static::markTestSkipped('only works for ICanWriteToStorage');
                }
 
-               $storageManager = new StorageManager($this->database, $this->config, $this->logger, $this->l10n, false);
+               $storageManager = new StorageManager(
+                       $this->database,
+                       $this->config,
+                       new NullLogger(),
+                       new FakeEventDispatcher(),
+                       $this->l10n,
+                       false
+               );
 
                $selBackend = $storageManager->getWritableStorageByName($name);
                $storageManager->setBackend($selBackend);
@@ -219,7 +252,14 @@ class StorageManagerTest extends DatabaseTestCase
                        $this->expectException(InvalidClassStorageException::class);
                }
 
-               $storageManager = new StorageManager($this->database, $this->config, $this->logger, $this->l10n, false);
+               $storageManager = new StorageManager(
+                       $this->database,
+                       $this->config,
+                       new NullLogger(),
+                       new FakeEventDispatcher(),
+                       $this->l10n,
+                       false
+               );
 
                self::assertInstanceOf($assert, $storageManager->getBackend());
        }
@@ -240,7 +280,14 @@ class StorageManagerTest extends DatabaseTestCase
                        ->addRule(IHandleSessions::class, ['instanceOf' => Memory::class, 'shared' => true, 'call' => null]);
                DI::init($dice);
 
-               $storageManager = new StorageManager($this->database, $this->config, $this->logger, $this->l10n, false);
+               $storageManager = new StorageManager(
+                       $this->database,
+                       $this->config,
+                       new NullLogger(),
+                       new FakeEventDispatcher(),
+                       $this->l10n,
+                       false
+               );
 
                self::assertTrue($storageManager->register(SampleStorageBackend::class));
 
@@ -268,7 +315,21 @@ class StorageManagerTest extends DatabaseTestCase
                        ->addRule(IHandleSessions::class, ['instanceOf' => Memory::class, 'shared' => true, 'call' => null]);
                DI::init($dice);
 
-               $storageManager = new StorageManager($this->database, $this->config, $this->logger, $this->l10n, false);
+               /** @var \Friendica\Event\EventDispatcher */
+               $eventDispatcher = DI::eventDispatcher();
+
+               foreach (HookEventBridge::getStaticSubscribedEvents() as $eventName => $methodName) {
+                       $eventDispatcher->addListener($eventName, [HookEventBridge::class, $methodName]);
+               }
+
+               $storageManager = new StorageManager(
+                       $this->database,
+                       $this->config,
+                       new NullLogger(),
+                       $eventDispatcher,
+                       $this->l10n,
+                       false
+               );
 
                self::assertTrue($storageManager->register(SampleStorageBackend::class));
 
@@ -307,7 +368,14 @@ class StorageManagerTest extends DatabaseTestCase
 
                $this->loadFixture(__DIR__ . '/../../../../datasets/storage/database.fixture.php', $this->database);
 
-               $storageManager = new StorageManager($this->database, $this->config, $this->logger, $this->l10n, false);
+               $storageManager = new StorageManager(
+                       $this->database,
+                       $this->config,
+                       new NullLogger(),
+                       new FakeEventDispatcher(),
+                       $this->l10n,
+                       false
+               );
                $storage        = $storageManager->getWritableStorageByName($name);
                $storageManager->move($storage);
 
@@ -331,7 +399,14 @@ class StorageManagerTest extends DatabaseTestCase
                $this->expectException(InvalidClassStorageException::class);
                $this->expectExceptionMessage('Backend SystemResource is not valid');
 
-               $storageManager = new StorageManager($this->database, $this->config, $this->logger, $this->l10n, false);
+               $storageManager = new StorageManager(
+                       $this->database,
+                       $this->config,
+                       new NullLogger(),
+                       new FakeEventDispatcher(),
+                       $this->l10n,
+                       false
+               );
                $storage        = $storageManager->getWritableStorageByName(SystemResource::getName());
                $storageManager->move($storage);
        }