resource instanceof MissingValue) { return []; } $get = function ($key) { $r = $this->resource; if ($r instanceof MissingValue || $r === null) { return null; } // Eloquent model: prefer getAttribute to avoid magic proxies 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; }; return [ 'slug' => $get('slug'), 'title' => $get('title'), 'description' => $get('description'), 'width' => $get('width'), 'height' => $get('height'), // File URLs: produce public URLs without exposing internal file_path 'file' => [ 'name' => $get('file_name') ?? null, 'url' => $this->when(! empty($get('file_path')), fn() => Storage::url($get('file_path'))), 'size' => $get('file_size') ?? null, 'mime_type' => $get('mime_type') ?? null, ], 'categories' => $this->whenLoaded('categories', function () { return $this->categories->map(fn($c) => [ 'slug' => $c->slug ?? null, 'name' => $c->name ?? null, ])->values(); }), 'published_at' => $this->whenNotNull($get('published_at') ? $this->published_at->toAtomString() : null), 'urls' => [ 'canonical' => $get('canonical_url') ?? null, ], ]; } }