diff --git a/framework/core/src/Api/Resource/NotificationResource.php b/framework/core/src/Api/Resource/NotificationResource.php index 682b9b1b90..854d452e32 100644 --- a/framework/core/src/Api/Resource/NotificationResource.php +++ b/framework/core/src/Api/Resource/NotificationResource.php @@ -13,11 +13,14 @@ use Flarum\Api\Endpoint; use Flarum\Api\Schema; use Flarum\Bus\Dispatcher; +use Flarum\Discussion\Discussion; use Flarum\Notification\Command\ReadNotification; use Flarum\Notification\Notification; use Flarum\Notification\NotificationRepository; +use Flarum\Post\Post; use Illuminate\Contracts\Cache\Repository as CacheRepository; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Relations\MorphTo; use Tobyz\JsonApiServer\Pagination\OffsetPagination; /** @@ -93,10 +96,34 @@ public function endpoints(): array ? 'subject.discussion' : null, ])) + ->eagerLoad(['fromUser']) + ->eagerLoadWhere('subject', function ($query) { + if ($query instanceof MorphTo) { + $query->morphWith($this->subjectMorphWith()); + } + }) ->paginate(), ]; } + /** + * @return array + */ + protected function subjectMorphWith(): array + { + $map = []; + + foreach (array_unique(Notification::getSubjectModels()) as $class) { + if (is_a($class, Discussion::class, true)) { + $map[$class] = ['state']; + } elseif (is_a($class, Post::class, true)) { + $map[$class] = ['discussion.state']; + } + } + + return $map; + } + public function fields(): array { return [