store/app/Support/Media/MediaPresenter.php
Yoga Pangestu 3d00511626
Some checks failed
linter / quality (push) Waiting to run
tests / ci (8.3) (push) Has been cancelled
tests / ci (8.4) (push) Has been cancelled
tests / ci (8.5) (push) Has been cancelled
feat: enhance PresignedUploadController to support local uploads and improve S3 integration; add localUpload method for handling uploads when S3 is not the default disk
2026-07-02 22:53:28 +07:00

71 lines
2.0 KiB
PHP

<?php
namespace App\Support\Media;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
class MediaPresenter
{
/**
* @return list<array{id: int, url: string, thumb_url: string}>
*/
public static function collection(HasMedia $model, string $collectionName): array
{
return $model->getMedia($collectionName)
->map(fn (Media $media) => self::item($media))
->values()
->all();
}
/**
* @return array{id: int, url: string, thumb_url: string}|null
*/
public static function first(HasMedia $model, string $collectionName): ?array
{
$media = $model->getFirstMedia($collectionName);
return $media ? self::item($media) : null;
}
/**
* @return array{id: int, url: string, thumb_url: string}
*/
public static function item(Media $media): array
{
return [
'id' => $media->id,
'url' => self::temporaryUrl($media),
'thumb_url' => $media->hasGeneratedConversion('thumb')
? self::temporaryUrl($media, 'thumb')
: self::temporaryUrl($media),
];
}
private static function temporaryUrl(Media $media, ?string $conversion = null): string
{
$disk = $media->disk;
if ($disk === 's3') {
$visibility = config('filesystems.disks.s3.visibility', 'private');
if ($visibility === 'public') {
return $conversion
? $media->getUrl($conversion)
: $media->getUrl();
}
try {
return $media->getTemporaryUrl(now()->addMinutes(30), $conversion ?? '');
} catch (\Exception $e) {
return $conversion
? $media->getUrl($conversion)
: $media->getUrl();
}
}
return $conversion
? $media->getUrl($conversion)
: $media->getUrl();
}
}