<?php
namespace App\Services;
use App\Models\QueueState;
use App\Models\Song;
use App\Models\User;
use App\Repositories\SongRepository;
use App\Values\QueueState as QueueStateDTO;
class QueueService
{
public function __construct(private readonly SongRepository $songRepository)
{
}
public function getQueueState(User $user): QueueStateDTO
{
$state = QueueState::query()
->whereBelongsTo($user)
->firstOrCreate(
['user_id' => $user->id],
['song_ids' => []],
);
$currentSong = $state->current_song_id ? $this->songRepository->findOne($state->current_song_id, $user) : null;
return QueueStateDTO::make(
$this->songRepository->getMany(ids: $state->song_ids, preserveOrder: true, scopedUser: $user),
$currentSong,
$state->playback_position ?? 0
);
}
public function updateQueueState(User $user, array $songIds): void
{
QueueState::query()->updateOrCreate(['user_id' => $user->id], ['song_ids' => $songIds]);
}
public function updatePlaybackStatus(User $user, Song $song, int $position): void
{
QueueState::query()->updateOrCreate([
'user_id' => $user->id,
], [
'current_song_id' => $song->id,
'playback_position' => $position,
]);
}
}