basic permissions working
This commit is contained in:
parent
62d3b3e39a
commit
453c67620d
|
|
@ -4,6 +4,9 @@ namespace Blomstra\Search\Api\Controllers;
|
||||||
|
|
||||||
use Blomstra\Search\Schemas\Schema;
|
use Blomstra\Search\Schemas\Schema;
|
||||||
use Flarum\Api\Controller\AbstractListController;
|
use Flarum\Api\Controller\AbstractListController;
|
||||||
|
use Flarum\Extension\ExtensionManager;
|
||||||
|
use Flarum\Http\RequestUtil;
|
||||||
|
use Flarum\User\User;
|
||||||
use Illuminate\Contracts\Container\Container;
|
use Illuminate\Contracts\Container\Container;
|
||||||
use Illuminate\Support\Arr;
|
use Illuminate\Support\Arr;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
|
|
@ -19,6 +22,9 @@ class SearchController extends AbstractListController
|
||||||
protected function data(ServerRequestInterface $request, Document $document)
|
protected function data(ServerRequestInterface $request, Document $document)
|
||||||
{
|
{
|
||||||
$index = Arr::get($request->getQueryParams(), 'index');
|
$index = Arr::get($request->getQueryParams(), 'index');
|
||||||
|
|
||||||
|
$actor = RequestUtil::getActor($request);
|
||||||
|
|
||||||
$filters = $this->extractFilter($request);
|
$filters = $this->extractFilter($request);
|
||||||
|
|
||||||
$schema = $this->getSchema($index);
|
$schema = $this->getSchema($index);
|
||||||
|
|
@ -26,7 +32,9 @@ class SearchController extends AbstractListController
|
||||||
$result = $this->meili->index($index)->search($filters['q'], [
|
$result = $this->meili->index($index)->search($filters['q'], [
|
||||||
'offset' => $this->extractOffset($request),
|
'offset' => $this->extractOffset($request),
|
||||||
'limit' => $this->extractLimit($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();
|
$this->serializer = $schema::serializer();
|
||||||
|
|
@ -45,4 +53,23 @@ class SearchController extends AbstractListController
|
||||||
return $schema::index() === $index;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,9 @@ use Flarum\Discussion\Discussion;
|
||||||
use Flarum\Discussion\Event\Deleted;
|
use Flarum\Discussion\Event\Deleted;
|
||||||
use Flarum\Discussion\Event\Hidden;
|
use Flarum\Discussion\Event\Hidden;
|
||||||
use Flarum\Discussion\Event\Started;
|
use Flarum\Discussion\Event\Started;
|
||||||
|
use Flarum\Group\Group;
|
||||||
|
use Flarum\Group\Permission;
|
||||||
|
use Flarum\Tags\Tag;
|
||||||
use Illuminate\Contracts\Events\Dispatcher;
|
use Illuminate\Contracts\Events\Dispatcher;
|
||||||
|
|
||||||
class DiscussionSchema extends Schema
|
class DiscussionSchema extends Schema
|
||||||
|
|
@ -15,8 +18,46 @@ class DiscussionSchema extends Schema
|
||||||
{
|
{
|
||||||
$filters = [];
|
$filters = [];
|
||||||
|
|
||||||
|
$permissions = null;
|
||||||
|
|
||||||
if ($this->extensionEnabled('flarum-tags')) {
|
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;
|
return $filters;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue