96 lines
3.6 KiB
PHP
96 lines
3.6 KiB
PHP
<?php
|
|
namespace App\Http\Resources;
|
|
|
|
use Illuminate\Http\Resources\Json\JsonResource;
|
|
use Illuminate\Http\Resources\MissingValue;
|
|
use App\Services\ThumbnailService;
|
|
|
|
class ArtworkListResource extends JsonResource
|
|
{
|
|
/**
|
|
* Transform the resource into an array for listings (browse feed).
|
|
*/
|
|
public function toArray($request): array
|
|
{
|
|
if ($this instanceof MissingValue || $this->resource instanceof MissingValue) {
|
|
return [];
|
|
}
|
|
// Safe accessor to avoid magic __get which may trigger MissingValue errors
|
|
$get = function ($key) {
|
|
$r = $this->resource;
|
|
if ($r instanceof MissingValue || $r === null) {
|
|
return null;
|
|
}
|
|
if (method_exists($r, 'getAttribute')) {
|
|
return $r->getAttribute($key);
|
|
}
|
|
if (is_array($r)) {
|
|
return $r[$key] ?? null;
|
|
}
|
|
if (is_object($r)) {
|
|
return $r->{$key} ?? null;
|
|
}
|
|
return null;
|
|
};
|
|
$primaryCategory = $this->whenLoaded('categories', function () {
|
|
return $this->categories->sortBy('sort_order')->first();
|
|
});
|
|
|
|
// Normalize MissingValue into null so later checks are straightforward
|
|
if ($primaryCategory instanceof MissingValue) {
|
|
$primaryCategory = null;
|
|
}
|
|
|
|
$contentTypeSlug = null;
|
|
$contentTypeName = null;
|
|
$categoryPath = null;
|
|
if ($primaryCategory) {
|
|
$contentTypeSlug = optional($primaryCategory->contentType)->slug ?? null;
|
|
$contentTypeName = optional($primaryCategory->contentType)->name ?? null;
|
|
$categoryPath = $primaryCategory->full_slug_path ?? null;
|
|
}
|
|
$slugVal = $get('slug');
|
|
$hash = (string) ($get('hash') ?? '');
|
|
$thumbExt = (string) ($get('thumb_ext') ?? '');
|
|
$webUrl = $contentTypeSlug && $categoryPath && $slugVal
|
|
? '/' . strtolower($contentTypeSlug) . '/' . strtolower($categoryPath) . '/' . $slugVal
|
|
: null;
|
|
|
|
$artId = $get('id');
|
|
$directUrl = $artId && $slugVal ? '/art/' . $artId . '/' . $slugVal : null;
|
|
|
|
$decode = static fn (?string $v): string => html_entity_decode((string) ($v ?? ''), ENT_QUOTES | ENT_HTML5, 'UTF-8');
|
|
|
|
return [
|
|
'id' => $artId,
|
|
'slug' => $slugVal,
|
|
'title' => $decode($get('title')),
|
|
'description' => $this->when($request->boolean('include_description'), fn() => $decode($get('description'))),
|
|
'dimensions' => [
|
|
'width' => $get('width'),
|
|
'height' => $get('height'),
|
|
],
|
|
'thumbnail_url' => $this->when(! empty($hash) && ! empty($thumbExt), fn() => ThumbnailService::fromHash($hash, $thumbExt, 'md')),
|
|
'author' => $this->whenLoaded('user', function () use ($decode) {
|
|
return [
|
|
'name' => $decode($this->user->name ?? null),
|
|
'avatar_url' => $this->user?->profile?->avatar_url,
|
|
];
|
|
}),
|
|
'category' => $primaryCategory ? [
|
|
'slug' => $primaryCategory->slug ?? null,
|
|
'name' => $decode($primaryCategory->name ?? null),
|
|
'content_type' => $contentTypeSlug,
|
|
'content_type_slug' => $contentTypeSlug,
|
|
'content_type_name' => $decode($contentTypeName),
|
|
'url' => $webUrl,
|
|
] : null,
|
|
'urls' => [
|
|
'web' => $webUrl ?? $directUrl,
|
|
'direct' => $directUrl,
|
|
'canonical' => $webUrl ?? $directUrl,
|
|
],
|
|
];
|
|
}
|
|
}
|