diff --git a/src/Api/Controllers/SearchController.php b/src/Api/Controllers/SearchController.php index a866c88..31c007a 100644 --- a/src/Api/Controllers/SearchController.php +++ b/src/Api/Controllers/SearchController.php @@ -4,6 +4,9 @@ namespace Blomstra\Search\Api\Controllers; use Blomstra\Search\Schemas\Schema; use Flarum\Api\Controller\AbstractListController; +use Flarum\Extension\ExtensionManager; +use Flarum\Http\RequestUtil; +use Flarum\User\User; use Illuminate\Contracts\Container\Container; use Illuminate\Support\Arr; use Illuminate\Support\Collection; @@ -19,6 +22,9 @@ class SearchController extends AbstractListController protected function data(ServerRequestInterface $request, Document $document) { $index = Arr::get($request->getQueryParams(), 'index'); + + $actor = RequestUtil::getActor($request); + $filters = $this->extractFilter($request); $schema = $this->getSchema($index); @@ -26,7 +32,9 @@ class SearchController extends AbstractListController $result = $this->meili->index($index)->search($filters['q'], [ 'offset' => $this->extractOffset($request), 'limit' => $this->extractLimit($request), - 'sort' => $this->extractSort($request) + 'sort' => $this->extractSort($request), + // Filters based on permissions etc.. + 'filter' => $this->getFilters($actor) ]); $this->serializer = $schema::serializer(); @@ -45,4 +53,23 @@ class SearchController extends AbstractListController return $schema::index() === $index; }); } + + protected function extensionEnabled(string $extension): bool + { + /** @var ExtensionManager $manager */ + $manager = resolve(ExtensionManager::class); + + return $manager->isEnabled($extension); + } + + protected function getFilters(User $actor): array + { + $filters = []; + + $filters = array_merge($filters, $actor->groups->pluck('id')->map(function(int $id) { + return ["groups = $id"]; + })->toArray()); + + return $filters; + } } diff --git a/src/Schemas/DiscussionSchema.php b/src/Schemas/DiscussionSchema.php index 9ae05c0..83e1c01 100644 --- a/src/Schemas/DiscussionSchema.php +++ b/src/Schemas/DiscussionSchema.php @@ -7,6 +7,9 @@ use Flarum\Discussion\Discussion; use Flarum\Discussion\Event\Deleted; use Flarum\Discussion\Event\Hidden; use Flarum\Discussion\Event\Started; +use Flarum\Group\Group; +use Flarum\Group\Permission; +use Flarum\Tags\Tag; use Illuminate\Contracts\Events\Dispatcher; class DiscussionSchema extends Schema @@ -15,8 +18,46 @@ class DiscussionSchema extends Schema { $filters = []; + $permissions = null; + if ($this->extensionEnabled('flarum-tags')) { - $filters['tags'] = $discussion->tags->pluck('id')->toArray(); + /** @var \Illuminate\Database\Eloquent\Collection $tags */ + $tags = $discussion->tags; + + $filters['tags'] = $tags->pluck('id')->toArray(); + $tagPermissions = Permission::query() + ->whereIn( + 'permission', + $tags->pluck('id')->map(function (int $id) { + return "tag$id.viewForum"; + }) + )->get(); + + $permissions = $tags->map(function (Tag $tag) use ($tagPermissions) { + $permissions = $tagPermissions->where('permission', "tag$tag->id.viewForum"); + + if ($tag->is_restricted) { + $permissions = $permissions->add(['group_id' => Group::ADMINISTRATOR_ID]); + } + + return $permissions->pluck('group_id'); + })->flatten(); + } + + if (! $permissions) { + $permissions = Permission::query() + ->where('permission', 'viewForum') + ->pluck('group_id') + ->get(); + } + + $filters['groups'] = $permissions->toArray(); + + $filters['private'] = $discussion->is_private; + + if ($this->extensionEnabled('fof-byobu')) { + $filters['recipient-users'] = $discussion->recipientUsers->pluck('id')->toArray(); + $filters['recipient-groups'] = $discussion->recipientGroups->pluck('id')->toArray(); } return $filters;