use rocket::response::status::BadRequest; use rocket_contrib::{Json, Value}; use db::DbConn; use db::models::*; use auth::Headers; #[get("/folders")] fn get_folders(headers: Headers, conn: DbConn) -> Result> { let folders = Folder::find_by_user(&headers.user.uuid, &conn); let folders_json: Vec = folders.iter().map(|c| c.to_json()).collect(); Ok(Json(json!({ "Data": folders_json, "Object": "list", }))) } #[get("/folders/")] fn get_folder(uuid: String, headers: Headers, conn: DbConn) -> Result> { let folder = match Folder::find_by_uuid(&uuid, &conn) { Some(folder) => folder, _ => err!("Invalid folder") }; if folder.user_uuid != headers.user.uuid { err!("Folder belongs to another user") } Ok(Json(folder.to_json())) } #[post("/folders", data = "")] fn post_folders(data: Json, headers: Headers, conn: DbConn) -> Result> { let name = &data["name"].as_str(); if name.is_none() { err!("Invalid name") } let mut folder = Folder::new(headers.user.uuid.clone(), name.unwrap().into()); folder.save(&conn); Ok(Json(folder.to_json())) } #[post("/folders/", data = "")] fn post_folder(uuid: String, data: Json, headers: Headers, conn: DbConn) -> Result> { put_folder(uuid, data, headers, conn) } #[put("/folders/", data = "")] fn put_folder(uuid: String, data: Json, headers: Headers, conn: DbConn) -> Result> { let mut folder = match Folder::find_by_uuid(&uuid, &conn) { Some(folder) => folder, _ => err!("Invalid folder") }; if folder.user_uuid != headers.user.uuid { err!("Folder belongs to another user") } let name = &data["name"].as_str(); if name.is_none() { err!("Invalid name") } folder.name = name.unwrap().into(); folder.save(&conn); Ok(Json(folder.to_json())) } #[post("/folders//delete", data = "<_data>")] fn delete_folder_post(uuid: String, _data: Json, headers: Headers, conn: DbConn) -> Result<(), BadRequest> { // Data contains a json object with the id, but we don't need it delete_folder(uuid, headers, conn) } #[delete("/folders/")] fn delete_folder(uuid: String, headers: Headers, conn: DbConn) -> Result<(), BadRequest> { let folder = match Folder::find_by_uuid(&uuid, &conn) { Some(folder) => folder, _ => err!("Invalid folder") }; if folder.user_uuid != headers.user.uuid { err!("Folder belongs to another user") } if !Cipher::find_by_folder(&folder.uuid, &conn).is_empty() { err!("Folder is not empty") } folder.delete(&conn); Ok(()) }