'array', 'license_type' => ImageLicenseType::class, 'persons_consent' => 'boolean', 'rights_confirmed_at' => 'datetime', 'is_preview' => 'boolean', 'sort_order' => 'integer', 'width' => 'integer', 'height' => 'integer', 'deleted_at' => 'datetime', ]; } public function pressRelease(): BelongsTo { return $this->belongsTo(PressRelease::class); } public function url(): ?string { if (blank($this->path)) { return null; } return $this->resolveDiskUrl($this->path); } public function variantUrl(string $key): ?string { $variantPath = $this->variants[$key] ?? null; if (! is_string($variantPath) || blank($variantPath)) { return null; } return $this->resolveDiskUrl($variantPath); } private function resolveDiskUrl(string $relativePath): ?string { if ($this->disk === 'public') { return asset('storage/'.ltrim($relativePath, '/')); } try { $disk = Storage::disk($this->disk); if (method_exists($disk, 'url')) { return $disk->url($relativePath); } return null; } catch (\Throwable) { return null; } } }