diff --git a/app/Http/Controllers/MusicCategoryController.php b/app/Http/Controllers/MusicCategoryController.php index 7f3ac64..7715a75 100644 --- a/app/Http/Controllers/MusicCategoryController.php +++ b/app/Http/Controllers/MusicCategoryController.php @@ -3,11 +3,14 @@ namespace App\Http\Controllers; use App\Models\MusicPlaylist; use App\Models\MusicCategory; +use App\Traits\HandlesImageUpload; use Illuminate\Support\Str; use Illuminate\Http\Request; class MusicCategoryController extends Controller { + use HandlesImageUpload; + public function index() { $categories = MusicCategory::with(['image', 'playlists' => function($q) { @@ -24,10 +27,14 @@ public function store(Request $request) 'name' => 'required|string|max:255', 'description' => 'nullable|string', 'image_id' => 'nullable|exists:images,id', + 'image' => 'nullable|file|extensions:jpg,jpeg,png,gif,webp,bmp,svg|max:8192', 'order' => 'nullable|integer', 'is_active' => 'nullable|boolean', ]); - + + // An uploaded image file takes precedence over a provided image_id. + $data['image_id'] = $this->uploadedImageId($request) ?? ($data['image_id'] ?? null); + // Check for duplicate name $slug = Str::slug($data['name']); $existingCategory = MusicCategory::where('slug', $slug)->first(); @@ -132,14 +139,20 @@ public function update(Request $request, $id) 'name' => 'sometimes|string|max:255', 'description' => 'nullable|string', 'image_id' => 'nullable|exists:images,id', + 'image' => 'nullable|file|extensions:jpg,jpeg,png,gif,webp,bmp,svg|max:8192', 'order' => 'nullable|integer', 'is_active' => 'nullable|boolean', ]); - + if (isset($data['name'])) { $data['slug'] = Str::slug($data['name']); } - + + // An uploaded image file takes precedence over a provided image_id. + if (($uploadedImageId = $this->uploadedImageId($request)) !== null) { + $data['image_id'] = $uploadedImageId; + } + $category->update($data); return response()->json([ diff --git a/routes/api.php b/routes/api.php index 5a70530..2ca7305 100644 --- a/routes/api.php +++ b/routes/api.php @@ -258,6 +258,8 @@ // Music Categories // Category with its sub-categories, each carrying its playlists. Route::get('music-categories/{id}/grouped', [MusicCategoryController::class, 'grouped']); + // Explicit POST update so an image can be uploaded (multipart can't ride a PUT). + Route::post('music-categories/{id}', [MusicCategoryController::class, 'update']); Route::apiResource('music-categories', MusicCategoryController::class); Route::get('public/music-categories', [MusicCategoryController::class, 'index']);