JezK
Edit File: MediaService.php
<?php namespace App\Services; use App\Models\Media; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; class MediaService { /** * Get paginated media items. */ public function getPaginated(int $perPage = 24, ?string $type = null): LengthAwarePaginator { $query = Media::with('user')->latest(); if ($type === 'image') { $query->where('mime_type', 'LIKE', 'image/%'); } return $query->paginate($perPage); } /** * Upload a file to media library. */ public function upload(UploadedFile $file, int $userId, ?string $altText = null): Media { $filename = Str::uuid() . '.' . $file->getClientOriginalExtension(); $path = $file->storeAs('media/' . date('Y/m'), $filename, 'public'); $data = [ 'user_id' => $userId, 'filename' => $filename, 'original_name' => $file->getClientOriginalName(), 'path' => $path, 'disk' => 'public', 'mime_type' => $file->getMimeType(), 'size' => $file->getSize(), 'alt_text' => $altText, ]; // Get image dimensions if applicable if (str_starts_with($file->getMimeType(), 'image/')) { $dimensions = @getimagesize($file->getRealPath()); if ($dimensions) { $data['width'] = $dimensions[0]; $data['height'] = $dimensions[1]; } } return Media::create($data); } /** * Delete a media item. */ public function delete(Media $media): bool { Storage::disk($media->disk)->delete($media->path); return $media->delete(); } /** * Update alt text. */ public function updateAlt(Media $media, string $altText): Media { $media->update(['alt_text' => $altText]); return $media; } }