feat: Implement playlist sound deletion and update current playlist logic on deletion
Some checks failed
Backend CI / lint (push) Failing after 9s
Backend CI / test (push) Failing after 1m34s

This commit is contained in:
JSC
2025-09-21 18:32:48 +02:00
parent 702d7ee577
commit c13e18c290

View File

@@ -3,10 +3,12 @@
from typing import Any, TypedDict from typing import Any, TypedDict
from fastapi import HTTPException, status from fastapi import HTTPException, status
from sqlmodel import select
from sqlmodel.ext.asyncio.session import AsyncSession from sqlmodel.ext.asyncio.session import AsyncSession
from app.core.logging import get_logger from app.core.logging import get_logger
from app.models.playlist import Playlist from app.models.playlist import Playlist
from app.models.playlist_sound import PlaylistSound
from app.models.sound import Sound from app.models.sound import Sound
from app.repositories.playlist import PlaylistRepository, PlaylistSortField, SortOrder from app.repositories.playlist import PlaylistRepository, PlaylistSortField, SortOrder
from app.repositories.sound import SoundRepository from app.repositories.sound import SoundRepository
@@ -231,11 +233,20 @@ class PlaylistService:
# Check if this was the current playlist before deleting # Check if this was the current playlist before deleting
was_current = playlist.is_current was_current = playlist.is_current
# First, delete all playlist_sound relationships
await self._delete_playlist_sounds(playlist_id)
# Then delete the playlist itself
await self.playlist_repo.delete(playlist) await self.playlist_repo.delete(playlist)
logger.info("Deleted playlist %s for user %s", playlist_id, user_id) logger.info("Deleted playlist %s for user %s", playlist_id, user_id)
# If the deleted playlist was current, reload player to use main fallback # If the deleted playlist was current, set main playlist as current
if was_current: if was_current:
main_playlist = await self.get_main_playlist()
await self.playlist_repo.update(main_playlist, {"is_current": True})
logger.info("Set main playlist as current after deleting current playlist %s", playlist_id)
# Reload player to reflect the change
await _reload_player_playlist() await _reload_player_playlist()
async def search_playlists(self, query: str, user_id: int) -> list[Playlist]: async def search_playlists(self, query: str, user_id: int) -> list[Playlist]:
@@ -539,6 +550,20 @@ class PlaylistService:
# Reload player playlist to reflect the change (will fallback to main) # Reload player playlist to reflect the change (will fallback to main)
await _reload_player_playlist() await _reload_player_playlist()
async def _delete_playlist_sounds(self, playlist_id: int) -> None:
"""Delete all playlist_sound records for a given playlist."""
# Get all playlist_sound records for this playlist
stmt = select(PlaylistSound).where(PlaylistSound.playlist_id == playlist_id)
result = await self.session.exec(stmt)
playlist_sounds = result.all()
# Delete each playlist_sound record
for playlist_sound in playlist_sounds:
await self.session.delete(playlist_sound)
await self.session.commit()
logger.info("Deleted %d playlist_sound records for playlist %s", len(playlist_sounds), playlist_id)
async def _unset_current_playlist(self) -> None: async def _unset_current_playlist(self) -> None:
"""Unset any current playlist globally.""" """Unset any current playlist globally."""
current_playlist = await self.playlist_repo.get_current_playlist() current_playlist = await self.playlist_repo.get_current_playlist()