Skip to content

Commit 3fa2a64

Browse files
[9.x] Searchable authorization (#797)
1 parent 9da529d commit 3fa2a64

5 files changed

Lines changed: 79 additions & 0 deletions

File tree

src/Search/Searchable.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ public function getCpSearchResultBadge(): string
9393
return $this->resource->name();
9494
}
9595

96+
public function getCpSearchResultIcon(): string
97+
{
98+
return $this->resource->icon();
99+
}
100+
96101
public function newAugmentedInstance(): Augmented
97102
{
98103
foreach ($this->supplements as $key => $value) {

src/Search/SearchablePolicy.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace StatamicRadPack\Runway\Search;
4+
5+
class SearchablePolicy
6+
{
7+
public function view($user, Searchable $searchable)
8+
{
9+
return $user->can('view', [$searchable->resource(), $searchable->model()]);
10+
}
11+
}

src/ServiceProvider.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,11 @@ protected function registerPermissions(): self
152152
}
153153
});
154154

155+
Gate::policy(
156+
\StatamicRadPack\Runway\Search\Searchable::class,
157+
\StatamicRadPack\Runway\Search\SearchablePolicy::class
158+
);
159+
155160
return $this;
156161
}
157162

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace StatamicRadPack\Runway\Tests\Search;
4+
5+
use PHPUnit\Framework\Attributes\Test;
6+
use Statamic\Facades\Role;
7+
use Statamic\Facades\User;
8+
use StatamicRadPack\Runway\Search\Searchable;
9+
use StatamicRadPack\Runway\Tests\Fixtures\Models\Post;
10+
use StatamicRadPack\Runway\Tests\TestCase;
11+
12+
class SearchablePolicyTest extends TestCase
13+
{
14+
#[Test]
15+
public function user_with_view_permission_can_view_searchable()
16+
{
17+
$post = Post::factory()->create();
18+
$searchable = new Searchable($post);
19+
20+
Role::make('test')->addPermission('view post')->save();
21+
$user = User::make()->assignRole('test')->save();
22+
23+
$this->assertTrue($user->can('view', $searchable));
24+
}
25+
26+
#[Test]
27+
public function user_without_view_permission_cannot_view_searchable()
28+
{
29+
$post = Post::factory()->create();
30+
$searchable = new Searchable($post);
31+
32+
Role::make('test')->save();
33+
$user = User::make()->assignRole('test')->save();
34+
35+
$this->assertFalse($user->can('view', $searchable));
36+
}
37+
38+
#[Test]
39+
public function super_user_can_view_searchable()
40+
{
41+
$post = Post::factory()->create();
42+
$searchable = new Searchable($post);
43+
44+
$user = User::make()->makeSuper()->save();
45+
46+
$this->assertTrue($user->can('view', $searchable));
47+
}
48+
}

tests/Search/SearchableTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,16 @@ public function can_get_cp_search_result_badge()
101101
$this->assertEquals('Posts', $searchable->getCpSearchResultBadge());
102102
}
103103

104+
#[Test]
105+
public function can_get_cp_search_result_icon()
106+
{
107+
$post = Post::factory()->create();
108+
109+
$searchable = new Searchable($post);
110+
111+
$this->assertIsString($searchable->getCpSearchResultIcon());
112+
}
113+
104114
#[Test]
105115
public function can_get_new_augmented_instance()
106116
{

0 commit comments

Comments
 (0)