use canapi::{Error as ApiError, Provider}; use rocket::http::uri::Origin; use rocket_contrib::json::Json; use serde_json; use serde_qs; use api::authorization::*; use plume_api::posts::PostEndpoint; use plume_models::{posts::Post, users::User, PlumeRocket}; #[get("/posts/")] pub fn get( id: i32, auth: Option>, mut rockets: PlumeRocket, ) -> Json { rockets.user = auth.and_then(|a| User::get(&*rockets.conn, a.0.user_id).ok()); let post = >::get(&rockets, id).ok(); Json(json!(post)) } #[get("/posts")] pub fn list( uri: &Origin, auth: Option>, mut rockets: PlumeRocket, ) -> Json { rockets.user = auth.and_then(|a| User::get(&*rockets.conn, a.0.user_id).ok()); let query: PostEndpoint = serde_qs::from_str(uri.query().unwrap_or("")).expect("api::list: invalid query error"); let post = >::list(&rockets, query); Json(json!(post)) } #[post("/posts", data = "")] pub fn create( auth: Authorization, payload: Json, mut rockets: PlumeRocket, ) -> Json { rockets.user = User::get(&*rockets.conn, auth.0.user_id).ok(); let new_post = >::create(&rockets, (*payload).clone()); Json(new_post.map(|p| json!(p)).unwrap_or_else(|e| { json!({ "error": "Invalid data, couldn't create new post", "details": match e { ApiError::Fetch(msg) => msg, ApiError::SerDe(msg) => msg, ApiError::NotFound(msg) => msg, ApiError::Authorization(msg) => msg, } }) })) }