From e69a4271cb95eb7934d80ed20d1cfd2c3455e602 Mon Sep 17 00:00:00 2001 From: 409 Date: Tue, 3 Dec 2024 01:32:23 +0100 Subject: [PATCH] fix(library): remove track from playlist --- proto/library.proto | 4 ++-- src/database/tracks.rs | 30 +++++++++++++++++++++++++----- src/library.rs | 24 ++++++++++++++++++++---- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/proto/library.proto b/proto/library.proto index 353cec5..fc412fd 100644 --- a/proto/library.proto +++ b/proto/library.proto @@ -9,8 +9,8 @@ service Library { rpc ListPlaylists(google.protobuf.Empty) returns (ListPlaylistsResponse); rpc CreatePlaylist(CreatePlaylistRequest) returns (CreatePlaylistResponse); rpc DeletePlaylist(DeletePlaylistRequest) returns (google.protobuf.Empty); - rpc AddTrackToPlaylist(AddTrackToPlaylistRequest) returns (google.protobuf.Empty); - rpc RemoveTrackFromPlaylist(RemoveTrackFromPlaylistRequest) returns (google.protobuf.Empty); + rpc AddTrackToPlaylist(AddTrackToPlaylistRequest) returns (TrackList); + rpc RemoveTrackFromPlaylist(RemoveTrackFromPlaylistRequest) returns (TrackList); rpc SwapTracks(SwapTracksRequest) returns (TrackList); } diff --git a/src/database/tracks.rs b/src/database/tracks.rs index ca8cd8b..b7c64f7 100644 --- a/src/database/tracks.rs +++ b/src/database/tracks.rs @@ -332,13 +332,33 @@ pub async fn remove_track_from_playlist( track_rank: u32, ) -> Result { let manager = pool.get().await.unwrap(); - let connection = manager.lock().unwrap(); + let mut connection = manager.lock().unwrap(); - let mut statement = connection - .prepare("DELETE FROM playlist_tracks WHERE playlist_id = ?1 AND track_rank = ?2")?; - let len = statement.execute(params![playlist_id, track_rank])?; + let tx = connection.transaction()?; - Ok(len == 1) + let len = tx.execute( + "DELETE FROM playlist_tracks WHERE playlist_id = ?1 AND rank = ?2", + params![playlist_id, track_rank], + )?; + + tx.execute( + "UPDATE playlist_tracks SET rank = - rank WHERE playlist_id = ?1 AND rank > ?2", + [playlist_id, track_rank], + )?; + + tx.execute( + "UPDATE playlist_tracks SET rank = - rank - 1 WHERE playlist_id = ?1 AND rank < 0", + [playlist_id], + )?; + + if len != 1 { + tx.rollback()?; + return Ok(false); + } + + tx.commit()?; + + Ok(true) } pub async fn swap_playlist_tracks( diff --git a/src/library.rs b/src/library.rs index 9f08975..f6b1e16 100644 --- a/src/library.rs +++ b/src/library.rs @@ -105,7 +105,7 @@ impl Library for LibraryService { async fn add_track_to_playlist( &self, request: Request, - ) -> Result, Status> { + ) -> Result, Status> { let input = request.get_ref(); let Ok(success) = @@ -118,13 +118,21 @@ impl Library for LibraryService { return Err(Status::internal("")); } - Ok(Response::new(())) + let Ok(playlist) = get_playlist(&self.pool, input.playlist_id).await else { + return Err(Status::internal("")); + }; + + let response = TrackList { + tracks: playlist.tracks, + }; + + Ok(Response::new(response)) } async fn remove_track_from_playlist( &self, request: Request, - ) -> Result, Status> { + ) -> Result, Status> { let input = request.get_ref(); let Ok(success) = @@ -137,7 +145,15 @@ impl Library for LibraryService { return Err(Status::internal("")); } - Ok(Response::new(())) + let Ok(playlist) = get_playlist(&self.pool, input.playlist_id).await else { + return Err(Status::internal("")); + }; + + let response = TrackList { + tracks: playlist.tracks, + }; + + Ok(Response::new(response)) } async fn swap_tracks(