diff --git a/src/queries/playlists.rs b/src/queries/playlists.rs index 4f58b15..206ef4f 100644 --- a/src/queries/playlists.rs +++ b/src/queries/playlists.rs @@ -103,3 +103,76 @@ pub async fn delete(db: &DatabaseConnection, id: i32) -> DbResult<()> { Playlists::delete_by_id(id).exec(db).await?; Ok(()) } + +pub async fn add_track(db: &DatabaseConnection, playlist_id: i32, track_id: i32) -> DbResult<()> { + // Get max position for this playlist + let max_pos = PlaylistTracks::find() + .filter(playlist_track::Column::PlaylistId.eq(playlist_id)) + .order_by_desc(playlist_track::Column::Position) + .one(db) + .await? + .map(|pt| pt.position) + .unwrap_or(-1); + + let pt = TrackActiveModel { + playlist_id: Set(playlist_id), + track_id: Set(track_id), + position: Set(max_pos + 1), + ..Default::default() + }; + pt.insert(db).await?; + Ok(()) +} + +pub async fn remove_track( + db: &DatabaseConnection, + playlist_id: i32, + track_id: i32, +) -> DbResult<()> { + // Delete the playlist_track row + PlaylistTracks::delete_many() + .filter(playlist_track::Column::PlaylistId.eq(playlist_id)) + .filter(playlist_track::Column::TrackId.eq(track_id)) + .exec(db) + .await?; + + // Renumber remaining positions + let remaining = PlaylistTracks::find() + .filter(playlist_track::Column::PlaylistId.eq(playlist_id)) + .order_by_asc(playlist_track::Column::Position) + .all(db) + .await?; + + for (i, pt) in remaining.into_iter().enumerate() { + let mut active: TrackActiveModel = pt.into(); + active.position = Set(i as i32); + active.update(db).await?; + } + + Ok(()) +} + +pub async fn reorder_tracks( + db: &DatabaseConnection, + playlist_id: i32, + track_ids: Vec, +) -> DbResult<()> { + // Delete all playlist_tracks for this playlist + PlaylistTracks::delete_many() + .filter(playlist_track::Column::PlaylistId.eq(playlist_id)) + .exec(db) + .await?; + + // Re-insert with positions matching the vec order + for (pos, track_id) in track_ids.iter().enumerate() { + let pt = TrackActiveModel { + playlist_id: Set(playlist_id), + track_id: Set(*track_id), + position: Set(pos as i32), + ..Default::default() + }; + pt.insert(db).await?; + } + + Ok(()) +}