Skip to content

Commit 3d3dfbe

Browse files
duncanmccleanclaudejasonvarga
authored
[6.x] Reduce amount of data provided in Assets fieldtype meta (#14366)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Jason Varga <jason@pixelfear.com>
1 parent cfbc771 commit 3d3dfbe

3 files changed

Lines changed: 121 additions & 1 deletion

File tree

src/Fieldtypes/Assets/Assets.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
use Statamic\Fields\Fieldtype;
1919
use Statamic\Fieldtypes\UpdatesReferences;
2020
use Statamic\GraphQL\Types\AssetInterface;
21-
use Statamic\Http\Resources\CP\Assets\Asset as AssetResource;
21+
use Statamic\Http\Resources\CP\Assets\AssetsFieldtypeAsset as AssetResource;
2222
use Statamic\Query\Scopes\Filter;
2323
use Statamic\Support\Arr;
2424
use Statamic\Support\Str;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace Statamic\Http\Resources\CP\Assets;
4+
5+
use Illuminate\Http\Resources\Json\JsonResource;
6+
use Statamic\Facades\User;
7+
use Statamic\Support\Str;
8+
9+
class AssetsFieldtypeAsset extends JsonResource
10+
{
11+
use HasThumbnails;
12+
13+
public function toArray($request)
14+
{
15+
$data = [
16+
'id' => $this->id(),
17+
'basename' => $this->basename(),
18+
'extension' => $this->extension(),
19+
'size' => Str::fileSizeForHumans($this->size()),
20+
'isImage' => $this->isImage(),
21+
'url' => $this->url(),
22+
'downloadUrl' => $this->cpDownloadUrl(),
23+
'isSvg' => $this->isSvg(),
24+
'isMedia' => $this->isMedia(),
25+
'isEditable' => User::current()->can('edit', $this->resource),
26+
'isViewable' => User::current()->can('view', $this->resource),
27+
...$this->thumbnails(),
28+
...$this->publishFormData(),
29+
];
30+
31+
return ['data' => $data];
32+
}
33+
34+
protected function publishFormData()
35+
{
36+
$fields = $this->blueprint()->fields()
37+
->addValues($this->data()->all())
38+
->preProcess();
39+
40+
return [
41+
'values' => $this->data()->merge($fields->values()),
42+
'meta' => $fields->meta(),
43+
];
44+
}
45+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<?php
2+
3+
namespace Tests\Http\Resources\CP\Assets;
4+
5+
use Illuminate\Support\Facades\Storage;
6+
use PHPUnit\Framework\Attributes\Test;
7+
use Statamic\Facades\AssetContainer;
8+
use Statamic\Facades\User;
9+
use Statamic\Http\Resources\CP\Assets\AssetsFieldtypeAsset;
10+
use Tests\FakesRoles;
11+
use Tests\PreventSavingStacheItemsToDisk;
12+
use Tests\TestCase;
13+
14+
class AssetsFieldtypeAssetTest extends TestCase
15+
{
16+
use FakesRoles;
17+
use PreventSavingStacheItemsToDisk;
18+
19+
private $container;
20+
21+
protected function setUp(): void
22+
{
23+
parent::setUp();
24+
25+
Storage::fake('test', ['url' => '/assets']);
26+
Storage::disk('test')->put('img/photo.jpg', '');
27+
28+
$this->container = AssetContainer::make('test')->disk('test')->save();
29+
}
30+
31+
#[Test]
32+
public function it_returns_expected_data()
33+
{
34+
$this->actingAs(tap(User::make()->makeSuper())->save());
35+
36+
$asset = AssetContainer::find('test')->asset('img/photo.jpg');
37+
38+
$resource = (new AssetsFieldtypeAsset($asset))->resolve()['data'];
39+
40+
$this->assertEquals('test::img/photo.jpg', $resource['id']);
41+
$this->assertEquals('photo.jpg', $resource['basename']);
42+
$this->assertEquals('jpg', $resource['extension']);
43+
$this->assertEquals('/assets/img/photo.jpg', $resource['url']);
44+
$this->assertArrayHasKey('downloadUrl', $resource);
45+
$this->assertArrayHasKey('size', $resource);
46+
$this->assertTrue($resource['isImage']);
47+
$this->assertFalse($resource['isSvg']);
48+
$this->assertTrue($resource['isMedia']);
49+
$this->assertTrue($resource['isEditable']);
50+
$this->assertTrue($resource['isViewable']);
51+
$this->assertArrayHasKey('thumbnail', $resource);
52+
$this->assertArrayHasKey('values', $resource);
53+
$this->assertArrayHasKey('meta', $resource);
54+
55+
$this->assertArrayNotHasKey('actions', $resource);
56+
$this->assertArrayNotHasKey('actionUrl', $resource);
57+
$this->assertArrayNotHasKey('blueprint', $resource);
58+
}
59+
60+
#[Test]
61+
public function it_reflects_permissions()
62+
{
63+
$this->setTestRoles(['test' => ['view test assets']]);
64+
65+
$user = tap(User::make()->assignRole('test'))->save();
66+
$this->actingAs($user);
67+
68+
$asset = AssetContainer::find('test')->asset('img/photo.jpg');
69+
70+
$resource = (new AssetsFieldtypeAsset($asset))->resolve()['data'];
71+
72+
$this->assertFalse($resource['isEditable']);
73+
$this->assertTrue($resource['isViewable']);
74+
}
75+
}

0 commit comments

Comments
 (0)