From 4f1cfa7be61fa8de5e9dcf0070cf70c48c1ef4f9 Mon Sep 17 00:00:00 2001 From: Antoine Gersant Date: Mon, 17 Jul 2017 22:57:36 -0700 Subject: [PATCH] Added API endpoint to fetch playlists --- src/api.rs | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/api.rs b/src/api.rs index 57e7b69..f4f4717 100644 --- a/src/api.rs +++ b/src/api.rs @@ -153,10 +153,19 @@ fn get_endpoints(db: Arc, index_channel: Arc>>) { let mut playlist_router = Router::new(); let put_db = db.clone(); + let list_db = db.clone(); playlist_router.put("/", - move |request: &mut Request| self::save_playlist(request, put_db.deref()), + move |request: &mut Request| { + self::save_playlist(request, put_db.deref()) + }, "save_playlist"); + playlist_router.get("/list", + move |request: &mut Request| { + self::list_playlists(request, list_db.deref()) + }, + "list_playlists"); + let mut playlist_api_chain = Chain::new(playlist_router); let admin_req = AdminRequirement { db: db.clone() }; playlist_api_chain.link_around(admin_req); @@ -514,3 +523,27 @@ fn save_playlist(request: &mut Request, db: &DB) -> IronResult { Ok(Response::with(status::Ok)) } + +fn list_playlists(request: &mut Request, db: &DB) -> IronResult { + let username = match request.extensions.get::() { + Some(s) => s.username.clone(), + None => return Err(Error::from(ErrorKind::AuthenticationRequired).into()), + }; + + #[derive(Serialize)] + struct ListPlaylistsOutput { + name: String, + } + + let playlist_name = playlist::list_playlists(&username, db)?; + let playlists: Vec = playlist_name.into_iter().map(|p| ListPlaylistsOutput{ + name: p, + }).collect(); + + let result_json = serde_json::to_string(&playlists); + let result_json = match result_json { + Ok(j) => j, + Err(e) => return Err(IronError::new(e, status::InternalServerError)), + }; + Ok(Response::with((status::Ok, result_json))) +}