diff --git a/app/Http/Controllers/MediaController.php b/app/Http/Controllers/MediaController.php index 14418e2..75355db 100644 --- a/app/Http/Controllers/MediaController.php +++ b/app/Http/Controllers/MediaController.php @@ -7,12 +7,15 @@ use App\Models\Category; use App\Models\SubCategory; use App\Models\Tag; +use App\Traits\HandlesImageUpload; use Illuminate\Support\Facades\DB; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; class MediaController extends Controller { + use HandlesImageUpload; + // CREATE media public function store(Request $request) { @@ -25,6 +28,7 @@ public function store(Request $request) 'subcategory_ids' => 'nullable|array', 'subcategory_ids.*' => 'integer|exists:sub_categories,id', 'image_id' => 'nullable|exists:images,id', + 'image' => 'nullable|image|max:8192', 'duration' => 'nullable|integer', 'is_premium' => 'nullable|boolean', 'file' => 'nullable|mimes:mp3,wav,mp4,mov|max:512000', @@ -40,6 +44,9 @@ public function store(Request $request) $path = $request->file('file')->store('media', 'public'); } + // An uploaded image file takes precedence over a provided image_id. + $imageId = $this->uploadedImageId($request) ?? ($data['image_id'] ?? null); + $media = Media::create([ 'user_id' => auth()->id(), 'title' => $data['title'], @@ -47,7 +54,7 @@ public function store(Request $request) 'type' => $data['type'], 'file_path' => $path, 'external_url' => $data['external_url'] ?? null, - 'image_id' => $data['image_id'] ?? null, + 'image_id' => $imageId, 'duration' => $data['duration'] ?? null, 'visibility' => $data['visibility'] ?? 'public', 'is_premium'=> $data['is_premium'] ?? false @@ -469,6 +476,7 @@ public function update(Request $request, $id) 'subcategory_ids.*' => 'integer|exists:sub_categories,id', 'is_premium' => 'nullable|boolean', 'image_id' => 'nullable|exists:images,id', + 'image' => 'nullable|image|max:8192', 'duration' => 'nullable|integer', 'file' => 'nullable|mimes:mp3,wav,mp4,mov|max:512000', 'external_url' => 'nullable|string', @@ -495,10 +503,13 @@ public function update(Request $request, $id) 'file_path' => $data['file_path'] ?? $media->file_path, ]; - // --- Handle image_id specifically --- - // If image_id is provided in request, use it (even if null to remove association) - // If not provided, keep the existing value - if (array_key_exists('image_id', $data)) { + // --- Handle image --- + // An uploaded image file wins; otherwise an explicit image_id (even null to + // clear) is honored; otherwise the existing value is kept. + $uploadedImageId = $this->uploadedImageId($request); + if ($uploadedImageId !== null) { + $updateData['image_id'] = $uploadedImageId; + } elseif (array_key_exists('image_id', $data)) { $updateData['image_id'] = $data['image_id']; } else { $updateData['image_id'] = $media->image_id; diff --git a/app/Http/Controllers/MusicController.php b/app/Http/Controllers/MusicController.php index bc1fe3b..e834eb0 100644 --- a/app/Http/Controllers/MusicController.php +++ b/app/Http/Controllers/MusicController.php @@ -5,10 +5,12 @@ use Illuminate\Http\Request; use App\Models\MusicPlaylist; use App\Models\Music; +use App\Traits\HandlesImageUpload; use Illuminate\Support\Facades\Storage; class MusicController extends Controller { + use HandlesImageUpload; // Add this new method to your MusicController public function getAllMusic() @@ -135,6 +137,7 @@ public function store(Request $request) 'file' => 'required|mimes:mp3,wav,ogg,flac|max:20971520', 'type' => 'nullable|in:public,private', 'image_id' => 'nullable|exists:images,id', + 'image' => 'nullable|image|max:8192', 'playlist_id' => 'nullable|exists:music_playlists,id', // single (backward compatible) 'playlist_ids' => 'nullable|array', // multiple 'playlist_ids.*' => 'integer|exists:music_playlists,id', @@ -165,13 +168,16 @@ public function store(Request $request) ], 500); } + // An uploaded image file takes precedence over a provided image_id. + $imageId = $this->uploadedImageId($request) ?? ($data['image_id'] ?? null); + $music = Music::create([ 'user_id' => auth()->id(), 'title' => $data['title'], 'artist' => $data['artist'] ?? null, 'file_path' => $path, 'type' => $data['type'] ?? 'private', - 'image_id' => $data['image_id'] ?? null, + 'image_id' => $imageId, 'duration' => $data['duration'] ?? null, // Store as string 'is_active' => true, ]); @@ -234,6 +240,7 @@ public function update(Request $request, $id) 'type' => 'nullable|in:public,private', 'file' => 'nullable|mimes:mp3,wav,ogg,flac|max:20971520', 'image_id' => 'nullable|exists:images,id', + 'image' => 'nullable|image|max:8192', 'duration' => 'nullable|integer|min:1', 'is_active' => 'nullable|boolean', ]); @@ -245,8 +252,15 @@ public function update(Request $request, $id) $music->file_path = $path; } - // Update only provided fields - $music->fill($data); + // Update only provided fields (drop the raw file input from mass-assign). + $music->fill(collect($data)->except('image')->toArray()); + + // An uploaded image file takes precedence over a provided image_id. + $uploadedImageId = $this->uploadedImageId($request); + if ($uploadedImageId !== null) { + $music->image_id = $uploadedImageId; + } + $music->save(); return response()->json([ diff --git a/app/Traits/HandlesImageUpload.php b/app/Traits/HandlesImageUpload.php new file mode 100644 index 0000000..0dfd570 --- /dev/null +++ b/app/Traits/HandlesImageUpload.php @@ -0,0 +1,29 @@ +hasFile($field)) { + return null; + } + + $path = $request->file($field)->store('images', 'public'); + + return Image::create([ + 'user_id' => auth()->id(), + 'path' => $path, + 'type' => 'public', + ])->id; + } +}