diff --git a/mod/item.php b/mod/item.php index e6b2cb93f4..e416126a4a 100644 --- a/mod/item.php +++ b/mod/item.php @@ -281,10 +281,16 @@ function item_process(array $post, array $request, bool $preview, string $return $eventDispatcher = DI::eventDispatcher(); - $post = $eventDispatcher->dispatch( - new ArrayFilterEvent(ArrayFilterEvent::INSERT_POST_LOCAL, $post) + $hook_data = [ + 'item' => $post, + ]; + + $hook_data = $eventDispatcher->dispatch( + new ArrayFilterEvent(ArrayFilterEvent::INSERT_POST_LOCAL, $hook_data) )->getArray(); + $post = $hook_data['item'] ?? $post; + unset($post['edit']); unset($post['self']); unset($post['api_source']); diff --git a/src/Core/Hooks/HookEventBridge.php b/src/Core/Hooks/HookEventBridge.php index e287cdd767..e5a7dd01ab 100644 --- a/src/Core/Hooks/HookEventBridge.php +++ b/src/Core/Hooks/HookEventBridge.php @@ -112,7 +112,7 @@ final class HookEventBridge ArrayFilterEvent::FEATURE_ENABLED => 'onArrayFilterEvent', ArrayFilterEvent::FEATURE_GET => 'onArrayFilterEvent', ArrayFilterEvent::INSERT_POST_LOCAL_START => 'onArrayFilterEvent', - ArrayFilterEvent::INSERT_POST_LOCAL => 'onArrayFilterEvent', + ArrayFilterEvent::INSERT_POST_LOCAL => 'onInsertPostLocalEvent', ArrayFilterEvent::INSERT_POST_LOCAL_END => 'onArrayFilterEvent', ArrayFilterEvent::INSERT_POST_REMOTE => 'onArrayFilterEvent', ArrayFilterEvent::INSERT_POST_REMOTE_END => 'onArrayFilterEvent', @@ -183,6 +183,20 @@ final class HookEventBridge ); } + /** + * Map the INSERT_POST_LOCAL event to `post_local` hook + */ + public static function onInsertPostLocalEvent(ArrayFilterEvent $event): void + { + $data = $event->getArray(); + + $item = (array) $data['item'] ?? []; + + $data['item'] = static::callHook($event->getName(), $item); + + $event->setArray($data); + } + /** * Map the PREPARE_POST_START event to `prepare_body_init` hook */ diff --git a/src/Model/Item.php b/src/Model/Item.php index 3edd6950e7..651b812f3d 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -845,10 +845,16 @@ class Item $dummy_session = false; } - $item = $eventDispatcher->dispatch( - new ArrayFilterEvent(ArrayFilterEvent::INSERT_POST_LOCAL, $item) + $hook_data = [ + 'item' => $item, + ]; + + $hook_data = $eventDispatcher->dispatch( + new ArrayFilterEvent(ArrayFilterEvent::INSERT_POST_LOCAL, $hook_data) )->getArray(); + $item = $hook_data['item'] ?? $item; + if ($dummy_session) { unset($_SESSION['authenticated']); unset($_SESSION['uid']); diff --git a/src/Model/Profile.php b/src/Model/Profile.php index 7a900b9bc4..a647a58c78 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -12,7 +12,6 @@ use Friendica\AppHelper; use Friendica\Content\Text\BBCode; use Friendica\Content\Widget\ContactBlock; use Friendica\Core\Cache\Enum\Duration; -use Friendica\Core\Hook; use Friendica\Core\Protocol; use Friendica\Core\Renderer; use Friendica\Core\Search; diff --git a/tests/Unit/Core/Hooks/HookEventBridgeTest.php b/tests/Unit/Core/Hooks/HookEventBridgeTest.php index 1a28e09161..17f9e1084d 100644 --- a/tests/Unit/Core/Hooks/HookEventBridgeTest.php +++ b/tests/Unit/Core/Hooks/HookEventBridgeTest.php @@ -33,7 +33,7 @@ class HookEventBridgeTest extends TestCase ArrayFilterEvent::FEATURE_ENABLED => 'onArrayFilterEvent', ArrayFilterEvent::FEATURE_GET => 'onArrayFilterEvent', ArrayFilterEvent::INSERT_POST_LOCAL_START => 'onArrayFilterEvent', - ArrayFilterEvent::INSERT_POST_LOCAL => 'onArrayFilterEvent', + ArrayFilterEvent::INSERT_POST_LOCAL => 'onInsertPostLocalEvent', ArrayFilterEvent::INSERT_POST_LOCAL_END => 'onArrayFilterEvent', ArrayFilterEvent::INSERT_POST_REMOTE => 'onArrayFilterEvent', ArrayFilterEvent::INSERT_POST_REMOTE_END => 'onArrayFilterEvent', @@ -193,6 +193,28 @@ class HookEventBridgeTest extends TestCase HookEventBridge::onCollectRoutesEvent($event); } + public function testOnInsertPostLocalEventCallsHookWithCorrectValue(): void + { + $event = new ArrayFilterEvent(ArrayFilterEvent::INSERT_POST_LOCAL, ['item' => ['id' => -1]]); + + $reflectionProperty = new \ReflectionProperty(HookEventBridge::class, 'mockedCallHook'); + $reflectionProperty->setAccessible(true); + + $reflectionProperty->setValue(null, function (string $name, array $data): array { + $this->assertSame('post_local', $name); + $this->assertSame(['id' => -1], $data); + + return ['id' => 123]; + }); + + HookEventBridge::onInsertPostLocalEvent($event); + + $this->assertSame( + ['item' => ['id' => 123]], + $event->getArray(), + ); + } + public function testOnPreparePostStartEventCallsHookWithCorrectValue(): void { $event = new ArrayFilterEvent(ArrayFilterEvent::PREPARE_POST_START, ['item' => ['id' => -1]]);