belongsTo(Note::class); } /** * Get the URL for an S3 media file. * * @return string */ public function getUrlAttribute(): string { if (Str::startsWith($this->path, 'https://')) { return $this->path; } return config('filesystems.disks.s3.url') . '/' . $this->path; } /** * Get the URL for the medium size of an S3 image file. * * @return string */ public function getMediumurlAttribute(): string { $basename = $this->getBasename($this->path); $extension = $this->getExtension($this->path); return config('filesystems.disks.s3.url') . '/' . $basename . '-medium.' . $extension; } /** * Get the URL for the small size of an S3 image file. * * @return string */ public function getSmallurlAttribute(): string { $basename = $this->getBasename($this->path); $extension = $this->getExtension($this->path); return config('filesystems.disks.s3.url') . '/' . $basename . '-small.' . $extension; } /** * Give the real part of a filename, i.e. strip the file extension. * * @param string $path * @return string */ public function getBasename(string $path): string { // the following achieves this data flow // foo.bar.png => ['foo', 'bar', 'png'] => ['foo', 'bar'] => foo.bar $filenameParts = explode('.', $path); array_pop($filenameParts); return ltrim(array_reduce($filenameParts, static function ($carry, $item) { return $carry . '.' . $item; }, ''), '.'); } /** * Get the extension from a given filename. * * @param string $path * @return string */ public function getExtension(string $path): string { $parts = explode('.', $path); return array_pop($parts); } }