Compare commits
1 Commits
f03f8f0362
...
4fda9071c7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4fda9071c7 |
@@ -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<i32>,
|
||||
) -> 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(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user