diff --git a/src/api.rs b/src/api.rs index 1488129..57e7b69 100644 --- a/src/api.rs +++ b/src/api.rs @@ -22,9 +22,10 @@ use config::MiscSettings; use db::{ConnectionSource, DB}; use db::misc_settings; use errors::*; -use thumbnails::*; use index; +use playlist; use user; +use thumbnails::*; use utils::*; use vfs::VFSSource; @@ -149,6 +150,19 @@ fn get_endpoints(db: Arc, index_channel: Arc>>) auth_api_mount.mount("/trigger_index/", reindex_api_chain); } + { + let mut playlist_router = Router::new(); + let put_db = db.clone(); + playlist_router.put("/", + move |request: &mut Request| self::save_playlist(request, put_db.deref()), + "save_playlist"); + + let mut playlist_api_chain = Chain::new(playlist_router); + let admin_req = AdminRequirement { db: db.clone() }; + playlist_api_chain.link_around(admin_req); + + auth_api_mount.mount("/playlist/", playlist_api_chain); + } let mut auth_api_chain = Chain::new(auth_api_mount); let auth = AuthRequirement { db: db.clone() }; @@ -471,3 +485,32 @@ fn trigger_index(channel: &Mutex>) -> IronResult IronResult { + + let username = match request.extensions.get::() { + Some(s) => s.username.clone(), + None => return Err(Error::from(ErrorKind::AuthenticationRequired).into()), + }; + + let input = request.get_ref::().unwrap(); + let playlist = match input.find(&["playlist"]) { + Some(¶ms::Value::String(ref playlist)) => playlist, + _ => return Err(Error::from(ErrorKind::MissingPlaylist).into()), + }; + + #[derive(Deserialize)] + struct SavePlaylistInput { + name: String, + tracks: Vec, + } + + let playlist = match serde_json::from_str::(playlist) { + Ok(p) => p, + Err(e) => return Err(IronError::new(e, status::BadRequest)), + }; + + playlist::save_playlist(&playlist.name, &username, &playlist.tracks, db)?; + + Ok(Response::with(status::Ok)) +} diff --git a/src/errors.rs b/src/errors.rs index 0d4dc62..cb9a46d 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -38,9 +38,10 @@ error_chain! { DaemonError {} AuthenticationRequired {} AdminPrivilegeRequired {} + MissingConfig {} MissingUsername {} MissingPassword {} - MissingConfig {} + MissingPlaylist {} IncorrectCredentials {} CannotServeDirectory {} UnsupportedFileType {} diff --git a/src/playlist.rs b/src/playlist.rs index eb575e9..2ad37c9 100644 --- a/src/playlist.rs +++ b/src/playlist.rs @@ -51,7 +51,7 @@ pub struct NewPlaylistSong { ordering: i32, } -fn list_playlists(owner: &str, db: &T) -> Result> +pub fn list_playlists(owner: &str, db: &T) -> Result> where T: ConnectionSource + VFSSource { let connection = db.get_connection(); @@ -74,7 +74,7 @@ fn list_playlists(owner: &str, db: &T) -> Result> } } -fn save_playlist(name: &str, owner: &str, content: &Vec, db: &T) -> Result<()> +pub fn save_playlist(name: &str, owner: &str, content: &Vec, db: &T) -> Result<()> where T: ConnectionSource + VFSSource { let user: User; @@ -148,7 +148,7 @@ fn save_playlist(name: &str, owner: &str, content: &Vec, db: &T) -> R Ok(()) } -fn read_playlist(playlist_name: &str, owner: &str, db: &T) -> Result> +pub fn read_playlist(playlist_name: &str, owner: &str, db: &T) -> Result> where T: ConnectionSource + VFSSource { let vfs = db.get_vfs()?; @@ -207,7 +207,7 @@ fn read_playlist(playlist_name: &str, owner: &str, db: &T) -> Result(playlist_name: &str, owner: &str, db: &T) -> Result<()> +pub fn delete_playlist(playlist_name: &str, owner: &str, db: &T) -> Result<()> where T: ConnectionSource + VFSSource { let connection = db.get_connection();