feat: add group media and music

This commit is contained in:
2026-06-12 16:55:19 +03:30
parent 3a2ed286b6
commit f2e9adf7f1
3 changed files with 65 additions and 0 deletions
@@ -65,6 +65,33 @@ public function show($id)
return response()->json($category);
}
// Category with each of its sub-categories and that sub-category's medias.
public function grouped($id)
{
$category = Category::with(['subcategories' => function ($q) {
$q->orderBy('name')->with(['media' => function ($m) {
$m->with(['image', 'detailImage', 'tags'])->latest();
}]);
}])->findOrFail($id);
return response()->json([
'category' => [
'id' => $category->id,
'title' => $category->name,
'description' => $category->description,
'icon_url' => $category->icon_url,
],
'sub_categories' => $category->subcategories->map(fn ($sub) => [
'sub_category' => [
'id' => $sub->id,
'title' => $sub->name,
'description' => $sub->description,
],
'medias' => $sub->media,
])->values(),
]);
}
public function update(Request $request, $id)
{
$category = Category::findOrFail($id);
@@ -89,6 +89,40 @@ public function show($id)
return response()->json($category);
}
// Category with each of its sub-categories and that sub-category's playlists.
public function grouped($id)
{
$category = MusicCategory::with([
'image',
'subcategories' => function ($q) {
$q->orderBy('order')->with([
'image',
'playlists' => function ($p) {
$p->where('is_active', true)->with('image')->orderBy('order');
},
]);
},
])->findOrFail($id);
return response()->json([
'category' => [
'id' => $category->id,
'title' => $category->name,
'description' => $category->description,
'image_url' => $category->image?->url,
],
'sub_categories' => $category->subcategories->map(fn ($sub) => [
'sub_category' => [
'id' => $sub->id,
'title' => $sub->name,
'description' => $sub->description,
'image_url' => $sub->image?->url,
],
'playlists' => $sub->playlists,
])->values(),
]);
}
public function update(Request $request, $id)
{
$category = MusicCategory::findOrFail($id);
+4
View File
@@ -241,6 +241,8 @@
Route::post('/media/{id}/note', [MediaController::class, 'storeNote']);
// Media categories
// Category with its sub-categories, each carrying its medias.
Route::get('categories/{id}/grouped', [CategoryController::class, 'grouped']);
// Explicit POST update so an icon image can be uploaded (multipart can't ride a PUT).
Route::post('categories/{id}', [CategoryController::class, 'update']);
Route::apiResource('categories', CategoryController::class);
@@ -252,6 +254,8 @@
// Music Categories
// Category with its sub-categories, each carrying its playlists.
Route::get('music-categories/{id}/grouped', [MusicCategoryController::class, 'grouped']);
Route::apiResource('music-categories', MusicCategoryController::class);
Route::get('public/music-categories', [MusicCategoryController::class, 'index']);