[CORE][Event] Make all events return \EventResult, enforced at container build time

This commit is contained in:
Hugo Sales 2022-04-03 21:40:32 +01:00
parent aef1fac536
commit d4b7e990ce
No known key found for this signature in database
GPG Key ID: 7D0C7EAFC9D835A0
60 changed files with 345 additions and 239 deletions

View File

@ -34,10 +34,11 @@ use Component\Attachment\Entity as E;
use Doctrine\Common\Collections\ExpressionBuilder;
use Doctrine\ORM\Query\Expr;
use Doctrine\ORM\QueryBuilder;
use EventResult;
class Attachment extends Component
{
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
$r->connect('note_attachment_show', '/object/note/{note_id<\d+>}/attachment/{attachment_id<\d+>}', [C\Attachment::class, 'attachmentShowWithNote']);
$r->connect('note_attachment_view', '/object/note/{note_id<\d+>}/attachment/{attachment_id<\d+>}/view', [C\Attachment::class, 'attachmentViewWithNote']);
@ -51,13 +52,13 @@ class Attachment extends Component
*
* This can be used in the future to deduplicate images by visual content
*/
public function onHashFile(string $filename, ?string &$out_hash): bool
public function onHashFile(string $filename, ?string &$out_hash): EventResult
{
$out_hash = hash_file(E\Attachment::FILEHASH_ALGO, $filename);
return Event::stop;
}
public function onNoteDeleteRelated(Note &$note, Actor $actor): bool
public function onNoteDeleteRelated(Note &$note, Actor $actor): EventResult
{
Cache::delete("note-attachments-{$note->getId()}");
foreach ($note->getAttachments() as $attachment) {
@ -68,7 +69,7 @@ class Attachment extends Component
return Event::next;
}
public function onCollectionQueryAddJoins(QueryBuilder &$note_qb, QueryBuilder &$actor_qb): bool
public function onCollectionQueryAddJoins(QueryBuilder &$note_qb, QueryBuilder &$actor_qb): EventResult
{
if (!\in_array('attachment_to_note', $note_qb->getAllAliases())) {
$note_qb->leftJoin(
@ -84,7 +85,7 @@ class Attachment extends Component
/**
* Populate $note_expr with the criteria for looking for notes with attachments
*/
public function onCollectionQueryCreateExpression(ExpressionBuilder $eb, string $term, ?string $locale, ?Actor $actor, &$note_expr, &$actor_expr): bool
public function onCollectionQueryCreateExpression(ExpressionBuilder $eb, string $term, ?string $locale, ?Actor $actor, &$note_expr, &$actor_expr): EventResult
{
$include_term = str_contains($term, ':') ? explode(':', $term)[1] : $term;
if (Formatting::startsWith($term, ['note-types:', 'notes-incude:', 'note-filter:'])) {

View File

@ -32,15 +32,17 @@ use Component\Attachment\Entity\Attachment;
use Component\Attachment\Entity\AttachmentThumbnail;
use Component\Avatar\Controller as C;
use Component\Avatar\Exception\NoAvatarException;
use EventResult;
use Symfony\Component\HttpFoundation\Request;
class Avatar extends Component
{
public function onInitializeComponent()
public function onInitializeComponent(): EventResult
{
return EventResult::next;
}
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
$r->connect('avatar_actor', '/actor/{actor_id<\d+>}/avatar/{size<full|big|medium|small>?medium}', [Controller\Avatar::class, 'avatar_view']);
$r->connect('avatar_default', '/avatar/default/{size<full|big|medium|small>?medium}', [Controller\Avatar::class, 'default_avatar_view']);
@ -51,7 +53,7 @@ class Avatar extends Component
/**
* @throws \App\Util\Exception\ClientException
*/
public function onPopulateSettingsTabs(Request $request, string $section, &$tabs): bool
public function onPopulateSettingsTabs(Request $request, string $section, &$tabs): EventResult
{
if ($section === 'profile') {
$tabs[] = [
@ -64,7 +66,7 @@ class Avatar extends Component
return Event::next;
}
public function onAvatarUpdate(int $actor_id): bool
public function onAvatarUpdate(int $actor_id): EventResult
{
Cache::delete("avatar-{$actor_id}");
foreach (['full', 'big', 'medium', 'small'] as $size) {

View File

@ -39,6 +39,7 @@ use Component\Circle\Entity\ActorCircleSubscription;
use Component\Circle\Entity\ActorTag;
use Component\Collection\Util\MetaCollectionTrait;
use Component\Tag\Tag;
use EventResult;
use Functional as F;
use Symfony\Component\HttpFoundation\Request;
@ -58,7 +59,7 @@ class Circle extends Component
protected const SLUG = 'circle';
protected const PLURAL_SLUG = 'circles';
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
$r->connect('actor_circle_view_by_circle_id', '/circle/{circle_id<\d+>}', [CircleController\Circle::class, 'circleById']);
// View circle members by (tagger id or nickname) and tag
@ -93,7 +94,7 @@ class Circle extends Component
];
}
public function onPopulateSettingsTabs(Request $request, string $section, array &$tabs): bool
public function onPopulateSettingsTabs(Request $request, string $section, array &$tabs): EventResult
{
if ($section === 'profile' && \in_array($request->get('_route'), ['person_actor_settings', 'group_actor_settings'])) {
$tabs[] = [
@ -106,7 +107,7 @@ class Circle extends Component
return Event::next;
}
public function onPostingFillTargetChoices(Request $request, Actor $actor, array &$targets): bool
public function onPostingFillTargetChoices(Request $request, Actor $actor, array &$targets): EventResult
{
$circles = $actor->getCircles();
foreach ($circles as $circle) {
@ -218,7 +219,7 @@ class Circle extends Component
return $ids_only ? array_map(fn ($x) => $x->getId(), $circles) : $circles;
}
public function onCreateDefaultFeeds(int $actor_id, LocalUser $user, int &$ordering)
public function onCreateDefaultFeeds(int $actor_id, LocalUser $user, int &$ordering): EventResult
{
DB::persist(Feed::create([
'actor_id' => $actor_id,

View File

@ -14,6 +14,7 @@ use Component\Subscription\Entity\ActorSubscription;
use Doctrine\Common\Collections\ExpressionBuilder;
use Doctrine\ORM\Query\Expr;
use Doctrine\ORM\QueryBuilder;
use EventResult;
class Collection extends Component
{
@ -64,7 +65,7 @@ class Collection extends Component
return ['notes' => $notes ?? null, 'actors' => $actors ?? null];
}
public function onCollectionQueryAddJoins(QueryBuilder &$note_qb, QueryBuilder &$actor_qb): bool
public function onCollectionQueryAddJoins(QueryBuilder &$note_qb, QueryBuilder &$actor_qb): EventResult
{
$note_aliases = $note_qb->getAllAliases();
if (!\in_array('subscription', $note_aliases)) {
@ -80,7 +81,7 @@ class Collection extends Component
* Convert $term to $note_expr and $actor_expr, search criteria. Handles searching for text
* notes, for different types of actors and for the content of text notes
*/
public function onCollectionQueryCreateExpression(ExpressionBuilder $eb, string $term, ?string $locale, ?Actor $actor, &$note_expr, &$actor_expr)
public function onCollectionQueryCreateExpression(ExpressionBuilder $eb, string $term, ?string $locale, ?Actor $actor, &$note_expr, &$actor_expr): EventResult
{
if (str_contains($term, ':')) {
$term = explode(':', $term);

View File

@ -39,6 +39,7 @@ use App\Entity\Actor;
use App\Util\Common;
use App\Util\Exception\RedirectException;
use App\Util\Formatting;
use EventResult;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
@ -94,7 +95,7 @@ trait MetaCollectionTrait
* It's compose of two forms: one to select collections to add
* the current item to, and another to create a new collection.
*/
public function onAppendRightPanelBlock(Request $request, $vars, &$res): bool
public function onAppendRightPanelBlock(Request $request, $vars, &$res): EventResult
{
$user = Common::actor();
if (\is_null($user)) {
@ -186,7 +187,7 @@ trait MetaCollectionTrait
return Event::next;
}
public function onEndShowStyles(array &$styles, string $route): bool
public function onEndShowStyles(array &$styles, string $route): EventResult
{
$styles[] = 'components/Collection/assets/css/widget.css';
$styles[] = 'components/Collection/assets/css/pages.css';

View File

@ -40,12 +40,13 @@ use App\Util\Common;
use App\Util\Formatting;
use Component\Conversation\Entity\Conversation as ConversationEntity;
use Component\Conversation\Entity\ConversationMute;
use EventResult;
use Functional as F;
use Symfony\Component\HttpFoundation\Request;
class Conversation extends Component
{
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
$r->connect('conversation', '/conversation/{conversation_id<\d+>}', [Controller\Conversation::class, 'showConversation']);
$r->connect('conversation_mute', '/conversation/{conversation_id<\d+>}/mute', [Controller\Conversation::class, 'muteConversation']);
@ -104,7 +105,7 @@ class Conversation extends Component
*
* @return bool EventHook
*/
public function onAddNoteActions(Request $request, Note $note, array &$actions): bool
public function onAddNoteActions(Request $request, Note $note, array &$actions): EventResult
{
if (\is_null(Common::user())) {
return Event::next;
@ -144,7 +145,7 @@ class Conversation extends Component
*
* @return bool EventHook
*/
public function onAppendCardNote(array $vars, array &$result): bool
public function onAppendCardNote(array $vars, array &$result): EventResult
{
if (str_contains($vars['request']->getPathInfo(), 'conversation')) {
return Event::next;
@ -197,7 +198,7 @@ class Conversation extends Component
*
* @return bool EventHook
*/
public function onPostingGetContextActor(Request $request, Actor $actor, ?Actor &$context_actor): bool
public function onPostingGetContextActor(Request $request, Actor $actor, ?Actor &$context_actor): EventResult
{
$to_note_id = $this->getReplyToIdFromRequest($request);
if (!\is_null($to_note_id)) {
@ -218,7 +219,7 @@ class Conversation extends Component
*
* @return bool EventHook
*/
public function onPostingModifyData(Request $request, Actor $actor, array &$data): bool
public function onPostingModifyData(Request $request, Actor $actor, array &$data): EventResult
{
$to_note_id = $this->getReplyToIdFromRequest($request);
if (!\is_null($to_note_id)) {
@ -232,7 +233,7 @@ class Conversation extends Component
/**
* Add minimal Note card to RightPanel template
*/
public function onPrependPostingForm(Request $request, array &$elements): bool
public function onPrependPostingForm(Request $request, array &$elements): EventResult
{
$elements[] = Formatting::twigRenderFile('cards/blocks/note_compact_wrapper.html.twig', ['note' => Note::getById((int) $request->query->get('reply_to_id'))]);
return Event::next;
@ -247,7 +248,7 @@ class Conversation extends Component
*
* @return bool EventHook
*/
public function onNoteDeleteRelated(Note &$note, Actor $actor): bool
public function onNoteDeleteRelated(Note &$note, Actor $actor): EventResult
{
// Ensure we have the most up to date replies
Cache::delete(Note::cacheKeys($note->getId())['replies']);
@ -266,7 +267,7 @@ class Conversation extends Component
*
* @return bool EventHook
*/
public function onAddExtraNoteActions(Request $request, Note $note, array &$actions): bool
public function onAddExtraNoteActions(Request $request, Note $note, array &$actions): EventResult
{
if (\is_null($user = Common::user())) {
return Event::next;
@ -302,7 +303,7 @@ class Conversation extends Component
*
* @return bool EventHook
*/
public function onNewNotificationShould(Activity $activity, Actor $actor): bool
public function onNewNotificationShould(Activity $activity, Actor $actor): EventResult
{
if ($activity->getObjectType() === 'note' && ConversationMute::isMuted($activity, $actor)) {
return Event::stop;

View File

@ -27,10 +27,11 @@ use App\Core\Event;
use App\Core\Modules\Component;
use App\Core\Router;
use Component\Feed\Controller as C;
use EventResult;
class Feed extends Component
{
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
$r->connect('feed_public', '/feed/public', [C\Feeds::class, 'public']);
$r->connect('feed_home', '/feed/home', [C\Feeds::class, 'home']);

View File

@ -54,6 +54,7 @@ use Component\FreeNetwork\Util\WebfingerResource;
use Component\FreeNetwork\Util\WebfingerResource\WebfingerResourceActor;
use Component\FreeNetwork\Util\WebfingerResource\WebfingerResourceNote;
use Doctrine\Common\Collections\ExpressionBuilder;
use EventResult;
use Exception;
use const PREG_SET_ORDER;
use Symfony\Component\HttpFoundation\JsonResponse;
@ -79,13 +80,13 @@ class FreeNetwork extends Component
public const OAUTH_AUTHORIZE_REL = 'http://apinamespace.org/oauth/authorize';
private static array $protocols = [];
public function onInitializeComponent(): bool
public function onInitializeComponent(): EventResult
{
Event::handle('AddFreeNetworkProtocol', [&self::$protocols]);
return Event::next;
}
public function onAddRoute(Router $m): bool
public function onAddRoute(Router $m): EventResult
{
// Feeds
$m->connect('feed_network', '/feed/network', [Feeds::class, 'network']);
@ -111,7 +112,7 @@ class FreeNetwork extends Component
return Event::next;
}
public function onCreateDefaultFeeds(int $actor_id, LocalUser $user, int &$ordering)
public function onCreateDefaultFeeds(int $actor_id, LocalUser $user, int &$ordering): EventResult
{
DB::persist(\App\Entity\Feed::create(['actor_id' => $actor_id, 'url' => Router::url($route = 'feed_network'), 'route' => $route, 'title' => _m('Meteorites'), 'ordering' => $ordering++]));
DB::persist(\App\Entity\Feed::create(['actor_id' => $actor_id, 'url' => Router::url($route = 'feed_clique'), 'route' => $route, 'title' => _m('Planetary System'), 'ordering' => $ordering++]));
@ -119,7 +120,7 @@ class FreeNetwork extends Component
return Event::next;
}
public function onStartGetProfileAcctUri(Actor $profile, &$acct): bool
public function onStartGetProfileAcctUri(Actor $profile, &$acct): EventResult
{
$wfr = new WebFingerResourceActor($profile);
try {
@ -147,7 +148,7 @@ class FreeNetwork extends Component
* @throws NoSuchActorException
* @throws ServerException
*/
public function onEndGetWebFingerResource(string $resource, ?WebfingerResource &$target = null, array $args = []): bool
public function onEndGetWebFingerResource(string $resource, ?WebfingerResource &$target = null, array $args = []): EventResult
{
// * Either we didn't find the profile, then we want to make
// the $profile variable null for clarity.
@ -223,7 +224,7 @@ class FreeNetwork extends Component
return Event::next;
}
public function onStartHostMetaLinks(array &$links): bool
public function onStartHostMetaLinks(array &$links): EventResult
{
foreach (Discovery::supportedMimeTypes() as $type) {
$links[] = new XML_XRD_Element_Link(
@ -244,7 +245,7 @@ class FreeNetwork extends Component
/**
* Add a link header for LRDD Discovery
*/
public function onStartShowHTML($action): bool
public function onStartShowHTML($action): EventResult
{
if ($action instanceof ShowstreamAction) {
$resource = $action->getTarget()->getUri();
@ -257,13 +258,13 @@ class FreeNetwork extends Component
return Event::next;
}
public function onStartDiscoveryMethodRegistration(Discovery $disco): bool
public function onStartDiscoveryMethodRegistration(Discovery $disco): EventResult
{
$disco->registerMethod('\Component\FreeNetwork\Util\LrddMethod\LrddMethodWebfinger');
return Event::next;
}
public function onEndDiscoveryMethodRegistration(Discovery $disco): bool
public function onEndDiscoveryMethodRegistration(Discovery $disco): EventResult
{
$disco->registerMethod('\Component\FreeNetwork\Util\LrddMethod\LrddMethodHostMeta');
$disco->registerMethod('\Component\FreeNetwork\Util\LrddMethod\LrddMethodLinkHeader');
@ -275,7 +276,7 @@ class FreeNetwork extends Component
* @throws ClientException
* @throws ServerException
*/
public function onControllerResponseInFormat(string $route, array $accept_header, array $vars, ?Response &$response = null): bool
public function onControllerResponseInFormat(string $route, array $accept_header, array $vars, ?Response &$response = null): EventResult
{
if (!\in_array($route, ['freenetwork_hostmeta', 'freenetwork_hostmeta_format', 'freenetwork_webfinger', 'freenetwork_webfinger_format', 'freenetwork_ownerxrd'])) {
return Event::next;
@ -376,7 +377,7 @@ class FreeNetwork extends Component
* @return bool hook return value
* @example.com/mublog/user
*/
public function onEndFindMentions(Actor $sender, string $text, array &$mentions): bool
public function onEndFindMentions(Actor $sender, string $text, array &$mentions): EventResult
{
$matches = [];
@ -517,7 +518,7 @@ class FreeNetwork extends Component
* Add fediverse: query expression
* // TODO: adding WebFinger would probably be nice
*/
public function onCollectionQueryCreateExpression(ExpressionBuilder $eb, string $term, ?string $locale, ?Actor $actor, &$note_expr, &$actor_expr): bool
public function onCollectionQueryCreateExpression(ExpressionBuilder $eb, string $term, ?string $locale, ?Actor $actor, &$note_expr, &$actor_expr): EventResult
{
if (Formatting::startsWith($term, ['fediverse:'])) {
foreach (self::$protocols as $protocol) {
@ -530,7 +531,7 @@ class FreeNetwork extends Component
return Event::next;
}
public function onPluginVersion(array &$versions): bool
public function onPluginVersion(array &$versions): EventResult
{
$versions[] = [
'name' => 'WebFinger',

View File

@ -33,11 +33,12 @@ use App\Util\Nickname;
use Component\Group\Controller as C;
use Component\Group\Entity\LocalGroup;
use Component\Notification\Notification;
use EventResult;
use Symfony\Component\HttpFoundation\Request;
class Group extends Component
{
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
$r->connect(id: 'group_actor_view_id', uri_path: '/group/{id<\d+>}', target: [C\GroupFeed::class, 'groupViewId']);
$r->connect(id: 'group_actor_view_nickname', uri_path: '/!{nickname<' . Nickname::DISPLAY_FMT . '>}', target: [C\GroupFeed::class, 'groupViewNickname']);
@ -50,7 +51,7 @@ class Group extends Component
* Enqueues a notification for an Actor (such as person or group) which means
* it shows up in their home feed and such.
*/
public function onNewNotificationStart(Actor $sender, Activity $activity, array $targets = [], ?string $reason = null): bool
public function onNewNotificationStart(Actor $sender, Activity $activity, array $targets = [], ?string $reason = null): EventResult
{
foreach ($targets as $target) {
if ($target->isGroup()) {
@ -70,7 +71,7 @@ class Group extends Component
/**
* Add an <a href=group_actor_settings> to the profile card for groups, if the current actor can access them
*/
public function onAppendCardProfile(array $vars, array &$res): bool
public function onAppendCardProfile(array $vars, array &$res): EventResult
{
$actor = Common::actor();
$group = $vars['actor'];
@ -108,7 +109,7 @@ class Group extends Component
return null;
}
public function onPostingFillTargetChoices(Request $request, Actor $actor, array &$targets): bool
public function onPostingFillTargetChoices(Request $request, Actor $actor, array &$targets): EventResult
{
$group = $this->getGroupFromContext($request);
if (!\is_null($group)) {
@ -127,7 +128,7 @@ class Group extends Component
*
* @param null|Actor $context_actor Actor group, if current route is part of an existing Group set of routes
*/
public function onPostingGetContextActor(Request $request, Actor $actor, ?Actor &$context_actor): bool
public function onPostingGetContextActor(Request $request, Actor $actor, ?Actor &$context_actor): EventResult
{
$ctx = $this->getGroupFromContext($request);
if (!\is_null($ctx)) {

View File

@ -33,18 +33,19 @@ use Component\Language\Entity\ActorLanguage;
use Doctrine\Common\Collections\ExpressionBuilder;
use Doctrine\ORM\Query\Expr;
use Doctrine\ORM\QueryBuilder;
use EventResult;
use Functional as F;
use Symfony\Component\HttpFoundation\Request;
class Language extends Component
{
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
$r->connect('settings_sort_languages', '/settings/sort_languages', [C\Language::class, 'sortLanguages']);
return Event::next;
}
public function onFilterNoteList(?Actor $actor, array &$notes, Request $request): bool
public function onFilterNoteList(?Actor $actor, array &$notes, Request $request): EventResult
{
if (\is_null($actor)) {
return Event::next;
@ -60,7 +61,7 @@ class Language extends Component
/**
* Populate $note_expr or $actor_expr with an expression to match a language
*/
public function onCollectionQueryCreateExpression(ExpressionBuilder $eb, string $term, ?string $locale, ?Actor $actor, &$note_expr, &$actor_expr): bool
public function onCollectionQueryCreateExpression(ExpressionBuilder $eb, string $term, ?string $locale, ?Actor $actor, &$note_expr, &$actor_expr): EventResult
{
$search_term = str_contains($term, ':') ? explode(':', $term)[1] : $term;
@ -103,7 +104,7 @@ class Language extends Component
return Event::next;
}
public function onCollectionQueryAddJoins(QueryBuilder &$note_qb, QueryBuilder &$actor_qb): bool
public function onCollectionQueryAddJoins(QueryBuilder &$note_qb, QueryBuilder &$actor_qb): EventResult
{
$note_aliases = $note_qb->getAllAliases();
if (!\in_array('note_language', $note_aliases)) {

View File

@ -32,10 +32,11 @@ use App\Entity\Feed;
use App\Util\Exception\ClientException;
use App\Util\Exception\NotFoundException;
use Component\LeftPanel\Controller as C;
use EventResult;
class LeftPanel extends Component
{
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
$r->connect('edit_feeds', '/edit-feeds', C\EditFeeds::class);
return Event::next;
@ -46,7 +47,7 @@ class LeftPanel extends Component
* @throws \App\Util\Exception\ServerException
* @throws ClientException
*/
public function onAppendFeed(Actor $actor, string $title, string $route, array $route_params): bool
public function onAppendFeed(Actor $actor, string $title, string $route, array $route_params): EventResult
{
$cache_key = Feed::cacheKey($actor);
$feeds = Feed::getFeeds($actor);

View File

@ -31,6 +31,7 @@ use App\Entity\Note;
use App\Util\Common;
use App\Util\HTML;
use Component\Link\Entity\NoteToLink;
use EventResult;
use InvalidArgumentException;
class Link extends Component
@ -54,7 +55,7 @@ class Link extends Component
/**
* Extract URLs from $content and create the appropriate Link and NoteToLink entities
*/
public function onProcessNoteContent(Note $note, string $content, string $content_type, array $process_note_content_extra_args = []): bool
public function onProcessNoteContent(Note $note, string $content, string $content_type, array $process_note_content_extra_args = []): EventResult
{
$ignore = $process_note_content_extra_args['ignoreLinks'] ?? [];
if (Common::config('attachments', 'process_links')) {
@ -71,7 +72,7 @@ class Link extends Component
return Event::next;
}
public function onRenderPlainTextNoteContent(string &$text): bool
public function onRenderPlainTextNoteContent(string &$text): EventResult
{
$text = $this->replaceURLs($text);
return Event::next;
@ -275,7 +276,7 @@ class Link extends Component
return HTML::html(['a' => ['attrs' => $attrs, $url]], options: ['indent' => false]);
}
public function onNoteDeleteRelated(Note &$note, Actor $actor): bool
public function onNoteDeleteRelated(Note &$note, Actor $actor): EventResult
{
DB::wrapInTransaction(fn () => NoteToLink::removeWhereNoteId($note->getId()));
return Event::next;

View File

@ -34,12 +34,13 @@ use App\Entity\LocalUser;
use App\Util\Exception\ServerException;
use Component\FreeNetwork\FreeNetwork;
use Component\Notification\Controller\Feed;
use EventResult;
use Exception;
use Throwable;
class Notification extends Component
{
public function onAddRoute(Router $m): bool
public function onAddRoute(Router $m): EventResult
{
$m->connect('feed_notifications', '/feed/notifications', [Feed::class, 'notifications']);
return Event::next;
@ -48,7 +49,7 @@ class Notification extends Component
/**
* @throws ServerException
*/
public function onCreateDefaultFeeds(int $actor_id, LocalUser $user, int &$ordering): bool
public function onCreateDefaultFeeds(int $actor_id, LocalUser $user, int &$ordering): EventResult
{
DB::persist(\App\Entity\Feed::create([
'actor_id' => $actor_id,
@ -75,7 +76,7 @@ class Notification extends Component
* @param array $targets Attentions, Mentions, any other source. Should never be empty, you usually want to register an attention to every $sender->getSubscribers()
* @param null|string $reason An optional reason explaining why this notification exists
*/
public function onNewNotification(Actor $sender, Activity $activity, array $targets, ?string $reason = null): bool
public function onNewNotification(Actor $sender, Activity $activity, array $targets, ?string $reason = null): EventResult
{
// Ensure targets are all actor objects and unique
$effective_targets = [];
@ -102,13 +103,13 @@ class Notification extends Component
return Event::next;
}
public function onQueueNotificationLocal(Actor $sender, Activity $activity, Actor $target, ?string $reason, array &$retry_args): bool
public function onQueueNotificationLocal(Actor $sender, Activity $activity, Actor $target, ?string $reason, array &$retry_args): EventResult
{
// TODO: use https://symfony.com/doc/current/notifier.html
return Event::stop;
}
public function onQueueNotificationRemote(Actor $sender, Activity $activity, array $targets, ?string $reason, array &$retry_args): bool
public function onQueueNotificationRemote(Actor $sender, Activity $activity, array $targets, ?string $reason, array &$retry_args): EventResult
{
if (FreeNetwork::notify($sender, $activity, $targets, $reason)) {
return Event::stop;

View File

@ -26,10 +26,11 @@ use App\Core\Modules\Component;
use App\Core\Router;
use App\Util\Nickname;
use Component\Person\Controller as C;
use EventResult;
class Person extends Component
{
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
$r->connect(id: 'person_actor_view_id', uri_path: '/person/{id<\d+>}', target: [C\PersonFeed::class, 'personViewId']);
$r->connect(id: 'person_actor_view_nickname', uri_path: '/@{nickname<' . Nickname::DISPLAY_FMT . '>}', target: [C\PersonFeed::class, 'personViewNickname'], options: ['is_system_path' => false]);

View File

@ -47,6 +47,7 @@ use Component\Attachment\Entity\AttachmentToNote;
use Component\Conversation\Conversation;
use Component\Language\Entity\Language;
use Component\Notification\Entity\Attention;
use EventResult;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
@ -54,7 +55,7 @@ class Posting extends Component
{
public const route = 'posting_form_action';
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
$r->connect(self::route, '/form/posting', Controller\Posting::class);
return Event::next;
@ -70,7 +71,7 @@ class Posting extends Component
* @throws RedirectException
* @throws ServerException
*/
public function onAddMainRightPanelBlock(Request $request, array &$res): bool
public function onAddMainRightPanelBlock(Request $request, array &$res): EventResult
{
if (\is_null($user = Common::user()) || preg_match('(feed|conversation|group|view)', $request->get('_route')) === 0) {
return Event::next;
@ -298,7 +299,7 @@ class Posting extends Component
return [$activity, $note, $effective_attentions];
}
public function onRenderNoteContent(string $content, string $content_type, ?string &$rendered, Actor $author, ?string $language = null, array &$mentions = [])
public function onRenderNoteContent(string $content, string $content_type, ?string &$rendered, Actor $author, ?string $language = null, array &$mentions = []): EventResult
{
switch ($content_type) {
case 'text/plain':

View File

@ -27,10 +27,12 @@ use App\Core\Event;
use App\Core\Form;
use function App\Core\I18n\_m;
use App\Core\Modules\Component;
use App\Core\Router;
use App\Util\Common;
use App\Util\Exception\ClientException;
use App\Util\Exception\RedirectException;
use App\Util\Formatting;
use EventResult;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormView;
@ -39,9 +41,10 @@ use Symfony\Component\HttpFoundation\Request;
class Search extends Component
{
public function onAddRoute($r)
public function onAddRoute(Router $r): EventResult
{
$r->connect('search', '/search', Controller\Search::class);
return EventResult::next;
}
/**
@ -133,7 +136,7 @@ class Search extends Component
*
* @throws RedirectException
*/
public function onPrependRightPanelBlock(Request $request, array &$elements): bool
public function onPrependRightPanelBlock(Request $request, array &$elements): EventResult
{
$elements[] = Formatting::twigRenderFile('cards/search/view.html.twig', ['search' => self::searchForm($request)]);
return Event::next;
@ -146,7 +149,7 @@ class Search extends Component
*
* @return bool hook value; true means continue processing, false means stop
*/
public function onEndShowStyles(array &$styles, string $route): bool
public function onEndShowStyles(array &$styles, string $route): EventResult
{
$styles[] = 'components/Search/assets/css/view.css';
return Event::next;

View File

@ -39,11 +39,12 @@ use App\Util\Exception\ServerException;
use Component\Notification\Entity\Attention;
use Component\Subscription\Controller\Subscribers as SubscribersController;
use Component\Subscription\Controller\Subscriptions as SubscriptionsController;
use EventResult;
use Symfony\Component\HttpFoundation\Request;
class Subscription extends Component
{
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
$r->connect(id: 'actor_subscribe_add', uri_path: '/actor/subscribe/{object_id<\d+>}', target: [SubscribersController::class, 'subscribersAdd']);
$r->connect(id: 'actor_subscribe_remove', uri_path: '/actor/unsubscribe/{object_id<\d+>}', target: [SubscribersController::class, 'subscribersRemove']);
@ -186,7 +187,7 @@ class Subscription extends Component
*
* @return bool EventHook
*/
public function onAddProfileActions(Request $request, Actor $object, array &$actions): bool
public function onAddProfileActions(Request $request, Actor $object, array &$actions): EventResult
{
// Action requires a user to be logged in
// We know it's a LocalUser, which has the same id as Actor

View File

@ -42,6 +42,7 @@ use Component\Tag\Entity\NoteTag;
use Doctrine\Common\Collections\ExpressionBuilder;
use Doctrine\ORM\Query\Expr;
use Doctrine\ORM\QueryBuilder;
use EventResult;
use Functional as F;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\HttpFoundation\Request;
@ -60,7 +61,7 @@ class Tag extends Component
public const TAG_REGEX = '/(^|\\s)(#[\\pL\\pN_\\-]{1,64})/u'; // Brion Vibber 2011-02-23 v2:classes/Notice.php:367 function saveTags
public const TAG_SLUG_REGEX = '[A-Za-z0-9]{1,64}';
public function onAddRoute($r): bool
public function onAddRoute($r): EventResult
{
$r->connect('single_note_tag', '/note-tag/{tag<' . self::TAG_SLUG_REGEX . '>}', [Controller\Tag::class, 'single_note_tag']);
$r->connect('multi_note_tags', '/note-tags/{tags<(' . self::TAG_SLUG_REGEX . ',)+' . self::TAG_SLUG_REGEX . '>}', [Controller\Tag::class, 'multi_note_tags']);
@ -118,7 +119,7 @@ class Tag extends Component
/**
* Process note by extracting any tags present
*/
public function onProcessNoteContent(Note $note, string $content, string $content_type, array $extra_args): bool
public function onProcessNoteContent(Note $note, string $content, string $content_type, array $extra_args): EventResult
{
if ($extra_args['TagProcessed'] ?? false) {
return Event::next;
@ -135,7 +136,7 @@ class Tag extends Component
return Event::next;
}
public function onRenderPlainTextNoteContent(string &$text, ?string $locale = null): bool
public function onRenderPlainTextNoteContent(string &$text, ?string $locale = null): EventResult
{
$text = preg_replace_callback(self::TAG_REGEX, fn ($m) => $m[1] . self::tagLink($m[2], $locale), $text);
return Event::next;
@ -213,7 +214,7 @@ class Tag extends Component
*
* $term /^(note|tag|people|actor)/ means we want to match only either a note or an actor
*/
public function onCollectionQueryCreateExpression(ExpressionBuilder $eb, string $term, ?string $locale, ?Actor $actor, &$note_expr, &$actor_expr): bool
public function onCollectionQueryCreateExpression(ExpressionBuilder $eb, string $term, ?string $locale, ?Actor $actor, &$note_expr, &$actor_expr): EventResult
{
if (!str_contains($term, ':')) {
return Event::next;
@ -252,7 +253,7 @@ class Tag extends Component
return Event::next;
}
public function onCollectionQueryAddJoins(QueryBuilder &$note_qb, QueryBuilder &$actor_qb): bool
public function onCollectionQueryAddJoins(QueryBuilder &$note_qb, QueryBuilder &$actor_qb): EventResult
{
if (!\in_array('note_tag', $note_qb->getAllAliases())) {
$note_qb->leftJoin(NoteTag::class, 'note_tag', Expr\Join::WITH, 'note_tag.note_id = note.id');
@ -263,13 +264,13 @@ class Tag extends Component
return Event::next;
}
public function onPostingAddFormEntries(Request $request, Actor $actor, array &$form_params): bool
public function onPostingAddFormEntries(Request $request, Actor $actor, array &$form_params): EventResult
{
$form_params[] = ['tag_use_canonical', CheckboxType::class, ['required' => false, 'data' => true, 'label' => _m('Make note tags canonical'), 'help' => _m('Canonical tags will be treated as a version of an existing tag with the same root/stem (e.g. \'#great_tag\' will be considered as a version of \'#great\', if it already exists)')]];
return Event::next;
}
public function onAddExtraArgsToNoteContent(Request $request, Actor $actor, array $data, array &$extra_args): bool
public function onAddExtraArgsToNoteContent(Request $request, Actor $actor, array $data, array &$extra_args): EventResult
{
if (!isset($data['tag_use_canonical'])) {
throw new ClientException(_m('Missing Use Canonical preference for Tags.'));

View File

@ -103,6 +103,9 @@
"files": [
"src/Core/I18n/I18n.php"
],
"classmap": [
"src/Core/Event/EventResult.php"
],
"psr-4": {
"App\\": "src/",
"Plugin\\": "plugins/",

View File

@ -13,7 +13,7 @@ services:
# this creates a service per class whose id is the fully-qualified class name
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php,Routes}'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php,Routes,Core/Event/EventResult.php}'
App\Test\Fixtures\:
resource: '../tests/fixtures/*'

View File

@ -50,6 +50,7 @@ use App\Util\Exception\BugFoundException;
use Component\Collection\Util\Controller\OrderedCollection;
use Component\FreeNetwork\Entity\FreeNetworkActorProtocol;
use Component\FreeNetwork\Util\Discovery;
use EventResult;
use Exception;
use InvalidArgumentException;
use Plugin\ActivityPub\Controller\Inbox;
@ -122,14 +123,14 @@ class ActivityPub extends Plugin
],
];
public function onInitializePlugin(): bool
public function onInitializePlugin(): EventResult
{
Event::handle('ActivityStreamsTwoContext', [&self::$activity_streams_two_context]);
self::$activity_streams_two_context = array_unique(self::$activity_streams_two_context, \SORT_REGULAR);
return Event::next;
}
public function onQueueActivitypubInbox(ActivitypubActor $ap_actor, Actor $actor, string|AbstractObject $type): bool
public function onQueueActivitypubInbox(ActivitypubActor $ap_actor, Actor $actor, string|AbstractObject $type): EventResult
{
// TODO: Check if Actor has authority over payload
@ -157,7 +158,7 @@ class ActivityPub extends Plugin
*
* @param Router $r the router that was initialized
*/
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
$r->connect(
'activitypub_inbox',
@ -183,7 +184,7 @@ class ActivityPub extends Plugin
/**
* Fill Actor->getUrl() calls with correct URL coming from ActivityPub
*/
public function onStartGetActorUri(Actor $actor, int $type, ?string &$url): bool
public function onStartGetActorUri(Actor $actor, int $type, ?string &$url): EventResult
{
if (
// Is remote?
@ -203,7 +204,7 @@ class ActivityPub extends Plugin
/**
* Fill Actor->canAdmin() for Actors that came from ActivityPub
*/
public function onFreeNetworkActorCanAdmin(Actor $actor, Actor $other, bool &$canAdmin): bool
public function onFreeNetworkActorCanAdmin(Actor $actor, Actor $other, bool &$canAdmin): EventResult
{
// Are both in AP?
if (
@ -223,7 +224,7 @@ class ActivityPub extends Plugin
*
* @throws Exception
*/
public function onControllerResponseInFormat(string $route, array $accept_header, array $vars, ?TypeResponse &$response = null): bool
public function onControllerResponseInFormat(string $route, array $accept_header, array $vars, ?TypeResponse &$response = null): EventResult
{
if (\count(array_intersect(self::$accept_headers, $accept_header)) === 0) {
return Event::next;
@ -262,7 +263,7 @@ class ActivityPub extends Plugin
/**
* Add ActivityStreams 2 Extensions
*/
public function onActivityPubValidateActivityStreamsTwoData(string $type_name, array &$validators): bool
public function onActivityPubValidateActivityStreamsTwoData(string $type_name, array &$validators): EventResult
{
switch ($type_name) {
case 'Person':
@ -280,7 +281,7 @@ class ActivityPub extends Plugin
/**
* Let FreeNetwork Component know we exist and which class to use to call the freeNetworkDistribute method
*/
public function onAddFreeNetworkProtocol(array &$protocols): bool
public function onAddFreeNetworkProtocol(array &$protocols): EventResult
{
$protocols[] = '\Plugin\ActivityPub\ActivityPub';
return Event::next;
@ -321,7 +322,7 @@ class ActivityPub extends Plugin
string $inbox,
array $to_actors,
array &$retry_args,
): bool {
): EventResult {
try {
$data = Model::toType($activity);
if ($sender->isGroup()) { // When the sender is a group,
@ -426,7 +427,7 @@ class ActivityPub extends Plugin
/**
* Add activity+json mimetype to WebFinger
*/
public function onEndWebFingerProfileLinks(XML_XRD $xrd, Actor $object): bool
public function onEndWebFingerProfileLinks(XML_XRD $xrd, Actor $object): EventResult
{
if ($object->isPerson()) {
$link = new XML_XRD_Element_Link(
@ -442,7 +443,7 @@ class ActivityPub extends Plugin
/**
* When FreeNetwork component asks us to help with identifying Actors from XRDs
*/
public function onFreeNetworkFoundXrd(XML_XRD $xrd, ?Actor &$actor = null): bool
public function onFreeNetworkFoundXrd(XML_XRD $xrd, ?Actor &$actor = null): EventResult
{
$addr = null;
foreach ($xrd->aliases as $alias) {
@ -473,7 +474,7 @@ class ActivityPub extends Plugin
/**
* When FreeNetwork component asks us to help with identifying Actors from URIs
*/
public function onFreeNetworkFindMentions(string $target, ?Actor &$actor = null): bool
public function onFreeNetworkFindMentions(string $target, ?Actor &$actor = null): EventResult
{
try {
if (FreeNetworkActorProtocol::canIAddr('activitypub', $addr = Discovery::normalize($target))) {

View File

@ -41,6 +41,7 @@ use App\Entity\Feed;
use App\Entity\LocalUser;
use App\Util\Nickname;
use Component\Collection\Util\MetaCollectionTrait;
use EventResult;
use Plugin\AttachmentCollections\Controller\AttachmentCollections as AttachmentCollectionsController;
use Plugin\AttachmentCollections\Entity\AttachmentCollection;
use Plugin\AttachmentCollections\Entity\AttachmentCollectionEntry;
@ -122,7 +123,7 @@ class AttachmentCollections extends Plugin
return array_map(fn ($x) => $x['attachment_collection_id'], $res);
}
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
// View all collections by actor id and nickname
$r->connect(
@ -149,7 +150,7 @@ class AttachmentCollections extends Plugin
return Event::next;
}
public function onCreateDefaultFeeds(int $actor_id, LocalUser $user, int &$ordering)
public function onCreateDefaultFeeds(int $actor_id, LocalUser $user, int &$ordering): EventResult
{
DB::persist(Feed::create([
'actor_id' => $actor_id,

View File

@ -28,11 +28,12 @@ use App\Core\Event;
use App\Core\Modules\Plugin;
use App\Util\Common;
use App\Util\Formatting;
use EventResult;
use Symfony\Component\HttpFoundation\Request;
class AttachmentShowRelated extends Plugin
{
public function onAppendRightPanelBlock(Request $request, $vars, &$res): bool
public function onAppendRightPanelBlock(Request $request, $vars, &$res): EventResult
{
if ($vars['path'] === 'note_attachment_show') {
$related_notes = DB::dql('select n from attachment_to_note an '
@ -54,7 +55,7 @@ class AttachmentShowRelated extends Plugin
*
* @return bool hook value; true means continue processing, false means stop
*/
public function onEndShowStyles(array &$styles, string $path): bool
public function onEndShowStyles(array &$styles, string $path): EventResult
{
if ($path === 'note_attachment_show') {
$styles[] = '/assets/default_theme/pages/feeds.css';

View File

@ -38,6 +38,7 @@ use function App\Core\I18n\_m;
use App\Core\Modules\Plugin;
use App\Util\Exception\ServerException;
use App\Util\Formatting;
use EventResult;
use FFMpeg\FFProbe as ffprobe;
use SplFileInfo;
@ -53,7 +54,7 @@ class AudioEncoder extends Plugin
return GSFile::mimetypeMajor($mimetype) === 'audio';
}
public function onFileMetaAvailable(array &$event_map, string $mimetype): bool
public function onFileMetaAvailable(array &$event_map, string $mimetype): EventResult
{
if (!self::shouldHandle($mimetype)) {
return Event::next;
@ -90,7 +91,7 @@ class AudioEncoder extends Plugin
/**
* Generates the view for attachments of type Video
*/
public function onViewAttachment(array $vars, array &$res): bool
public function onViewAttachment(array $vars, array &$res): EventResult
{
if (!self::shouldHandle($vars['attachment']->getMimetype())) {
return Event::next;
@ -110,7 +111,7 @@ class AudioEncoder extends Plugin
/**
* @throws ServerException
*/
public function onPluginVersion(array &$versions): bool
public function onPluginVersion(array &$versions): EventResult
{
$versions[] = [
'name' => 'AudioEncoder',

View File

@ -23,22 +23,23 @@ declare(strict_types = 1);
namespace Plugin\Blog;
use App\Core\Event;
use function App\Core\I18n\_m;
use App\Core\Modules\Plugin;
use App\Core\Router;
use App\Util\Common;
use App\Util\HTML;
use EventResult;
use Plugin\Blog\Controller as C;
use function App\Core\I18n\_m;
class Blog extends Plugin
{
public function onAddRoute(Router $r): bool
public function onAddRoute(Router $r): EventResult
{
$r->connect(id: 'blog_post', uri_path: '/blog/post', target: [C\Post::class, 'makePost']);
return Event::next;
}
public function onAppendCardProfile(array $vars, array &$res): bool
public function onAppendCardProfile(array $vars, array &$res): EventResult
{
$actor = Common::actor();
$group = $vars['actor'];

View File

@ -27,6 +27,7 @@ use App\Core\Event;
use App\Core\Modules\Plugin;
use App\Core\Router;
use App\Util\Common;
use EventResult;
use Plugin\Cover\Controller as C;
use Symfony\Component\HttpFoundation\Request;
@ -47,14 +48,14 @@ class Cover extends Plugin
*
* @return bool hook value; true means continue processing, false means stop
*/
public function onAddRoute(Router $r): bool