169 lines
5.2 KiB
PHP
169 lines
5.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\MusicPlaylist;
|
|
use App\Models\Music;
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
class MusicController extends Controller
|
|
{ public function getMusicByPlaylist($playlistId)
|
|
{
|
|
$playlist = MusicPlaylist::findOrFail($playlistId);
|
|
|
|
$music = Music::where('playlist_id', $playlistId)
|
|
->where('is_active', true)
|
|
->with(['image', 'tags'])
|
|
->orderBy('order')
|
|
->get();
|
|
|
|
return response()->json([
|
|
'playlist' => $playlist->load('image'),
|
|
'musics' => $music
|
|
]);
|
|
}
|
|
|
|
public function addToPlaylist(Request $request, $musicId)
|
|
{
|
|
$music = Music::where('id', $musicId)
|
|
->where(function($q) {
|
|
$q->where('type', 'public')
|
|
->orWhere('user_id', auth()->id());
|
|
})
|
|
->firstOrFail();
|
|
|
|
$data = $request->validate([
|
|
'playlist_id' => 'required|exists:music_playlists,id',
|
|
'order' => 'nullable|integer',
|
|
]);
|
|
|
|
$music->update([
|
|
'playlist_id' => $data['playlist_id'],
|
|
'order' => $data['order'] ?? $music->order,
|
|
]);
|
|
|
|
return response()->json([
|
|
'message' => 'Music added to playlist successfully',
|
|
'music' => $music->load(['image', 'playlist'])
|
|
]);
|
|
}
|
|
|
|
public function removeFromPlaylist($musicId)
|
|
{
|
|
$music = Music::where('id', $musicId)
|
|
->where('user_id', auth()->id())
|
|
->firstOrFail();
|
|
|
|
$music->update(['playlist_id' => null]);
|
|
|
|
return response()->json(['message' => 'Music removed from playlist']);
|
|
}
|
|
|
|
public function updateOrder(Request $request)
|
|
{
|
|
$data = $request->validate([
|
|
'musics' => 'required|array',
|
|
'musics.*.id' => 'required|exists:music,id',
|
|
'musics.*.order' => 'required|integer',
|
|
]);
|
|
|
|
foreach ($data['musics'] as $item) {
|
|
Music::where('id', $item['id'])
|
|
->where('user_id', auth()->id())
|
|
->update(['order' => $item['order']]);
|
|
}
|
|
|
|
return response()->json(['message' => 'Order updated successfully']);
|
|
}
|
|
// ✅ Upload music
|
|
public function store(Request $request)
|
|
{
|
|
$data = $request->validate([
|
|
'title' => 'required|string|max:255',
|
|
'artist' => 'nullable|string|max:255',
|
|
'file' => 'required|mimes:mp3,wav,ogg|max:10240', // max 10MB
|
|
'type' => 'nullable|in:public,private',
|
|
'image_id' => 'nullable|exists:images,id',
|
|
]);
|
|
|
|
$path = $request->file('file')->store('music', 'public');
|
|
|
|
$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,
|
|
]);
|
|
|
|
return response()->json([
|
|
'message' => 'Music uploaded successfully',
|
|
'music' => $music->load('image'),
|
|
'url' => asset('storage/' . $path),
|
|
]);
|
|
}
|
|
|
|
// ✅ Get all public + user private music
|
|
public function all()
|
|
{
|
|
$userId = auth()->id();
|
|
|
|
$music = Music::where('type', 'public')
|
|
->orWhere(function($query) use ($userId) {
|
|
$query->where('type', 'private')->where('user_id', $userId);
|
|
})
|
|
->get();
|
|
|
|
$music = Music::with('image') // eager load image
|
|
->where('type', 'public')
|
|
->orWhere(function($query) use ($userId) {
|
|
$query->where('type', 'private')->where('user_id', $userId);
|
|
})
|
|
->get();
|
|
|
|
return response()->json($music);
|
|
}
|
|
|
|
// ✅ Update music
|
|
public function update(Request $request, $id)
|
|
{
|
|
$music = Music::where('id', $id)->where('user_id', auth()->id())->firstOrFail();
|
|
|
|
$data = $request->validate([
|
|
'title' => 'nullable|string|max:255',
|
|
'artist' => 'nullable|string|max:255',
|
|
'type' => 'nullable|in:public,private',
|
|
'file' => 'nullable|mimes:mp3,wav,ogg|max:10240',
|
|
'image_id' => 'nullable|exists:images,id',
|
|
]);
|
|
|
|
if ($request->hasFile('file')) {
|
|
Storage::disk('public')->delete($music->file_path);
|
|
$path = $request->file('file')->store('music', 'public');
|
|
$music->file_path = $path;
|
|
}
|
|
|
|
$music->fill($data);
|
|
$music->save();
|
|
|
|
|
|
return response()->json([
|
|
'message' => 'Music updated successfully',
|
|
'music' => $music->load('image'),
|
|
'url' => asset('storage/' . $music->file_path),
|
|
]);
|
|
}
|
|
|
|
// ✅ Delete music
|
|
public function destroy($id)
|
|
{
|
|
$music = Music::where('id', $id)->where('user_id', auth()->id())->firstOrFail();
|
|
Storage::disk('public')->delete($music->file_path);
|
|
$music->delete();
|
|
|
|
return response()->json(['message' => 'Music deleted successfully']);
|
|
}
|
|
}
|