Added the playlist editor
This commit is contained in:
@@ -22,7 +22,16 @@ pub fn configure(cfg: &mut web::ServiceConfig) {
|
||||
.route(web::put().to(update_playlist))
|
||||
.route(web::delete().to(delete_playlist)),
|
||||
)
|
||||
.service(web::resource("/playlists/{id}/m3u").route(web::get().to(export_m3u)));
|
||||
.service(web::resource("/playlists/{id}/m3u").route(web::get().to(export_m3u)))
|
||||
.service(
|
||||
web::resource("/playlists/{id}/tracks")
|
||||
.route(web::post().to(add_track))
|
||||
.route(web::put().to(reorder_tracks)),
|
||||
)
|
||||
.service(
|
||||
web::resource("/playlists/{id}/tracks/{track_id}")
|
||||
.route(web::delete().to(remove_track)),
|
||||
);
|
||||
}
|
||||
|
||||
/// POST /api/playlists/generate — generate a playlist without saving.
|
||||
@@ -194,6 +203,56 @@ async fn delete_playlist(
|
||||
Ok(HttpResponse::NoContent().finish())
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct AddTrackRequest {
|
||||
track_id: i32,
|
||||
}
|
||||
|
||||
/// POST /api/playlists/{id}/tracks — add a track to playlist.
|
||||
async fn add_track(
|
||||
state: web::Data<AppState>,
|
||||
session: Session,
|
||||
path: web::Path<i32>,
|
||||
body: web::Json<AddTrackRequest>,
|
||||
) -> Result<HttpResponse, ApiError> {
|
||||
auth::require_auth(&session)?;
|
||||
let id = path.into_inner();
|
||||
let req = body.into_inner();
|
||||
queries::playlists::add_track(state.db.conn(), id, req.track_id).await?;
|
||||
Ok(HttpResponse::Ok().json(serde_json::json!({"ok": true})))
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct ReorderTracksRequest {
|
||||
track_ids: Vec<i32>,
|
||||
}
|
||||
|
||||
/// PUT /api/playlists/{id}/tracks — reorder tracks in playlist.
|
||||
async fn reorder_tracks(
|
||||
state: web::Data<AppState>,
|
||||
session: Session,
|
||||
path: web::Path<i32>,
|
||||
body: web::Json<ReorderTracksRequest>,
|
||||
) -> Result<HttpResponse, ApiError> {
|
||||
auth::require_auth(&session)?;
|
||||
let id = path.into_inner();
|
||||
let req = body.into_inner();
|
||||
queries::playlists::reorder_tracks(state.db.conn(), id, req.track_ids).await?;
|
||||
Ok(HttpResponse::Ok().json(serde_json::json!({"ok": true})))
|
||||
}
|
||||
|
||||
/// DELETE /api/playlists/{id}/tracks/{track_id} — remove a track from playlist.
|
||||
async fn remove_track(
|
||||
state: web::Data<AppState>,
|
||||
session: Session,
|
||||
path: web::Path<(i32, i32)>,
|
||||
) -> Result<HttpResponse, ApiError> {
|
||||
auth::require_auth(&session)?;
|
||||
let (id, track_id) = path.into_inner();
|
||||
queries::playlists::remove_track(state.db.conn(), id, track_id).await?;
|
||||
Ok(HttpResponse::NoContent().finish())
|
||||
}
|
||||
|
||||
/// GET /api/playlists/{id}/m3u — export as M3U file.
|
||||
async fn export_m3u(
|
||||
state: web::Data<AppState>,
|
||||
|
||||
Reference in New Issue
Block a user