Skip to content

Commit 2711428

Browse files
committed
Added separate policy for Attachment
1 parent 08375e7 commit 2711428

3 files changed

Lines changed: 85 additions & 2 deletions

File tree

src/Platform/Http/Controllers/SortableController.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,30 @@
99
class SortableController extends Controller
1010
{
1111
/**
12-
* @param Request $request
12+
* Save the sort order for a sortable model.
13+
* Authorization is performed via the model's Policy method `isSortable`.
14+
*
15+
* @param \Illuminate\Http\Request $request Must contain 'model' (class name) and 'items' (array of {id, sortOrder})
1316
*
1417
* @return void
1518
*/
1619
public function saveSortOrder(Request $request): void
1720
{
21+
$request->validate([
22+
'model' => 'required|string',
23+
'items' => 'required|array',
24+
'items.*.id' => 'required',
25+
'items.*.sortOrder' => 'required|integer|min:0',
26+
]);
27+
1828
$classModel = $request->input('model');
1929

2030
abort_unless(class_exists($classModel), 400);
2131

2232
$model = new $classModel;
2333

34+
$this->authorize('isSortable', $model);
35+
2436
$request->collect('items')->each(function ($item) use ($model) {
2537
$model->where($model->getKeyName(), '=', $item['id'])->update([
2638
$model->getSortColumnName() => $item['sortOrder'],
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Orchid\Tests\App\Policies;
6+
7+
use Illuminate\Contracts\Auth\Authenticatable;
8+
9+
/**
10+
* Policy for tests: forbids sorting to assert that SortableController
11+
* respects the policy and returns 403 when isSortable() returns false.
12+
*/
13+
class PolicySortDeny
14+
{
15+
public function isSortable(?Authenticatable $user): bool
16+
{
17+
return false;
18+
}
19+
}

tests/Feature/Platform/SortableTest.php

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,64 @@
44

55
namespace Orchid\Tests\Feature\Platform;
66

7+
use Illuminate\Support\Facades\Gate;
78
use Illuminate\Http\UploadedFile;
89
use Orchid\Attachment\Models\Attachment;
10+
use Orchid\Platform\Models\User;
11+
use Orchid\Tests\App\Policies\PolicySortDeny;
912
use Orchid\Tests\TestFeatureCase;
1013

1114
class SortableTest extends TestFeatureCase
1215
{
16+
public function setUp():void
17+
{
18+
parent::setUp();
19+
Gate::policy(Attachment::class, null);
20+
}
21+
22+
public function tearDown():void
23+
{
24+
Gate::policy(Attachment::class, null);
25+
parent::tearDown();
26+
}
27+
28+
public function testSortingIsForbiddenWhenPolicyDenies(): void
29+
{
30+
Gate::policy(Attachment::class, PolicySortDeny::class);
31+
32+
$response = $this
33+
->actingAs($this->createAdminUser())
34+
->post(route('orchid.files.upload'), [
35+
'files' => [
36+
UploadedFile::fake()->image('first.jpg'),
37+
UploadedFile::fake()->image('second.png'),
38+
],
39+
]);
40+
41+
$attachments = $response->decodeResponseJson()->json();
42+
43+
$ids = array_column($attachments, 'id');
44+
$sortBefore = Attachment::whereIn('id', $ids)->pluck('sort', 'id')->toArray();
45+
46+
$sortItems = collect($ids)->map(fn ($id, $index) => [
47+
'id' => $id,
48+
'sortOrder' => $index,
49+
])->values()->all();
50+
51+
$response = $this
52+
->actingAs($this->createAdminUser())
53+
->post(route('orchid.sorting'), [
54+
'items' => $sortItems,
55+
'model' => Attachment::class,
56+
]);
57+
58+
$response->assertForbidden();
59+
60+
$sortAfter = Attachment::whereIn('id', $ids)->pluck('sort', 'id')->toArray();
61+
$this->assertSame($sortBefore, $sortAfter, 'Sort order must not change when policy denies.');
62+
}
63+
64+
1365
public function testAttachmentHttpSort(): void
1466
{
1567
$response = $this
@@ -43,7 +95,7 @@ public function testAttachmentHttpSort(): void
4395
'model' => Attachment::class,
4496
]);
4597

46-
$response->isOk();
98+
$response->assertOk();
4799

48100
$attachments = Attachment::whereIn('id', $originalFiles)
49101
->pluck('sort', 'id')

0 commit comments

Comments
 (0)