fix(library): remove track from playlist
This commit is contained in:
@@ -9,8 +9,8 @@ service Library {
|
|||||||
rpc ListPlaylists(google.protobuf.Empty) returns (ListPlaylistsResponse);
|
rpc ListPlaylists(google.protobuf.Empty) returns (ListPlaylistsResponse);
|
||||||
rpc CreatePlaylist(CreatePlaylistRequest) returns (CreatePlaylistResponse);
|
rpc CreatePlaylist(CreatePlaylistRequest) returns (CreatePlaylistResponse);
|
||||||
rpc DeletePlaylist(DeletePlaylistRequest) returns (google.protobuf.Empty);
|
rpc DeletePlaylist(DeletePlaylistRequest) returns (google.protobuf.Empty);
|
||||||
rpc AddTrackToPlaylist(AddTrackToPlaylistRequest) returns (google.protobuf.Empty);
|
rpc AddTrackToPlaylist(AddTrackToPlaylistRequest) returns (TrackList);
|
||||||
rpc RemoveTrackFromPlaylist(RemoveTrackFromPlaylistRequest) returns (google.protobuf.Empty);
|
rpc RemoveTrackFromPlaylist(RemoveTrackFromPlaylistRequest) returns (TrackList);
|
||||||
rpc SwapTracks(SwapTracksRequest) returns (TrackList);
|
rpc SwapTracks(SwapTracksRequest) returns (TrackList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -332,13 +332,33 @@ pub async fn remove_track_from_playlist(
|
|||||||
track_rank: u32,
|
track_rank: u32,
|
||||||
) -> Result<bool, rusqlite::Error> {
|
) -> Result<bool, rusqlite::Error> {
|
||||||
let manager = pool.get().await.unwrap();
|
let manager = pool.get().await.unwrap();
|
||||||
let connection = manager.lock().unwrap();
|
let mut connection = manager.lock().unwrap();
|
||||||
|
|
||||||
let mut statement = connection
|
let tx = connection.transaction()?;
|
||||||
.prepare("DELETE FROM playlist_tracks WHERE playlist_id = ?1 AND track_rank = ?2")?;
|
|
||||||
let len = statement.execute(params![playlist_id, track_rank])?;
|
|
||||||
|
|
||||||
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(
|
pub async fn swap_playlist_tracks(
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ impl Library for LibraryService {
|
|||||||
async fn add_track_to_playlist(
|
async fn add_track_to_playlist(
|
||||||
&self,
|
&self,
|
||||||
request: Request<AddTrackToPlaylistRequest>,
|
request: Request<AddTrackToPlaylistRequest>,
|
||||||
) -> Result<Response<()>, Status> {
|
) -> Result<Response<TrackList>, Status> {
|
||||||
let input = request.get_ref();
|
let input = request.get_ref();
|
||||||
|
|
||||||
let Ok(success) =
|
let Ok(success) =
|
||||||
@@ -118,13 +118,21 @@ impl Library for LibraryService {
|
|||||||
return Err(Status::internal(""));
|
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(
|
async fn remove_track_from_playlist(
|
||||||
&self,
|
&self,
|
||||||
request: Request<RemoveTrackFromPlaylistRequest>,
|
request: Request<RemoveTrackFromPlaylistRequest>,
|
||||||
) -> Result<Response<()>, Status> {
|
) -> Result<Response<TrackList>, Status> {
|
||||||
let input = request.get_ref();
|
let input = request.get_ref();
|
||||||
|
|
||||||
let Ok(success) =
|
let Ok(success) =
|
||||||
@@ -137,7 +145,15 @@ impl Library for LibraryService {
|
|||||||
return Err(Status::internal(""));
|
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(
|
async fn swap_tracks(
|
||||||
|
|||||||
Reference in New Issue
Block a user