2018-08-30 17:43:46 +02:00
|
|
|
use rocket::State;
|
2018-10-10 20:40:39 +02:00
|
|
|
use rocket_contrib::json::Json;
|
|
|
|
use serde_json::Value;
|
2018-02-10 01:00:55 +01:00
|
|
|
|
|
|
|
use db::DbConn;
|
|
|
|
use db::models::*;
|
|
|
|
|
2018-08-30 17:43:46 +02:00
|
|
|
use api::{JsonResult, EmptyResult, JsonUpcase, WebSocketUsers, UpdateType};
|
2018-02-10 01:00:55 +01:00
|
|
|
use auth::Headers;
|
|
|
|
|
2018-10-10 20:40:39 +02:00
|
|
|
use rocket::Route;
|
|
|
|
|
|
|
|
pub fn routes() -> Vec<Route> {
|
|
|
|
routes![
|
|
|
|
get_folders,
|
|
|
|
get_folder,
|
|
|
|
post_folders,
|
|
|
|
post_folder,
|
|
|
|
put_folder,
|
|
|
|
delete_folder_post,
|
|
|
|
delete_folder,
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
2018-02-10 01:00:55 +01:00
|
|
|
#[get("/folders")]
|
2018-02-17 20:47:13 +01:00
|
|
|
fn get_folders(headers: Headers, conn: DbConn) -> JsonResult {
|
2018-02-10 01:00:55 +01:00
|
|
|
let folders = Folder::find_by_user(&headers.user.uuid, &conn);
|
|
|
|
|
|
|
|
let folders_json: Vec<Value> = folders.iter().map(|c| c.to_json()).collect();
|
|
|
|
|
|
|
|
Ok(Json(json!({
|
|
|
|
"Data": folders_json,
|
|
|
|
"Object": "list",
|
2018-10-01 18:02:58 +02:00
|
|
|
"ContinuationToken": null,
|
2018-02-10 01:00:55 +01:00
|
|
|
})))
|
|
|
|
}
|
|
|
|
|
|
|
|
#[get("/folders/<uuid>")]
|
2018-02-17 20:47:13 +01:00
|
|
|
fn get_folder(uuid: String, headers: Headers, conn: DbConn) -> JsonResult {
|
2018-02-15 00:53:11 +01:00
|
|
|
let folder = match Folder::find_by_uuid(&uuid, &conn) {
|
2018-02-10 01:00:55 +01:00
|
|
|
Some(folder) => folder,
|
|
|
|
_ => err!("Invalid folder")
|
|
|
|
};
|
|
|
|
|
|
|
|
if folder.user_uuid != headers.user.uuid {
|
|
|
|
err!("Folder belongs to another user")
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(Json(folder.to_json()))
|
|
|
|
}
|
|
|
|
|
2018-02-23 00:38:54 +01:00
|
|
|
#[derive(Deserialize)]
|
2018-06-01 00:18:50 +02:00
|
|
|
#[allow(non_snake_case)]
|
|
|
|
|
2018-02-23 00:38:54 +01:00
|
|
|
pub struct FolderData {
|
2018-06-01 00:18:50 +02:00
|
|
|
pub Name: String
|
2018-02-23 00:38:54 +01:00
|
|
|
}
|
2018-02-10 01:00:55 +01:00
|
|
|
|
2018-02-23 00:38:54 +01:00
|
|
|
#[post("/folders", data = "<data>")]
|
2018-08-30 17:43:46 +02:00
|
|
|
fn post_folders(data: JsonUpcase<FolderData>, headers: Headers, conn: DbConn, ws: State<WebSocketUsers>) -> JsonResult {
|
2018-06-01 00:18:50 +02:00
|
|
|
let data: FolderData = data.into_inner().data;
|
2018-02-10 01:00:55 +01:00
|
|
|
|
2018-06-01 00:18:50 +02:00
|
|
|
let mut folder = Folder::new(headers.user.uuid.clone(), data.Name);
|
2018-02-10 01:00:55 +01:00
|
|
|
|
2018-10-14 14:55:00 +02:00
|
|
|
if folder.save(&conn).is_err() {
|
|
|
|
err!("Failed to save folder")
|
|
|
|
}
|
2018-08-30 17:43:46 +02:00
|
|
|
ws.send_folder_update(UpdateType::SyncFolderCreate, &folder);
|
2018-02-10 01:00:55 +01:00
|
|
|
|
|
|
|
Ok(Json(folder.to_json()))
|
|
|
|
}
|
|
|
|
|
|
|
|
#[post("/folders/<uuid>", data = "<data>")]
|
2018-08-30 17:43:46 +02:00
|
|
|
fn post_folder(uuid: String, data: JsonUpcase<FolderData>, headers: Headers, conn: DbConn, ws: State<WebSocketUsers>) -> JsonResult {
|
|
|
|
put_folder(uuid, data, headers, conn, ws)
|
2018-02-10 01:00:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#[put("/folders/<uuid>", data = "<data>")]
|
2018-08-30 17:43:46 +02:00
|
|
|
fn put_folder(uuid: String, data: JsonUpcase<FolderData>, headers: Headers, conn: DbConn, ws: State<WebSocketUsers>) -> JsonResult {
|
2018-06-01 00:18:50 +02:00
|
|
|
let data: FolderData = data.into_inner().data;
|
2018-02-23 00:38:54 +01:00
|
|
|
|
2018-02-10 01:00:55 +01:00
|
|
|
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")
|
|
|
|
}
|
|
|
|
|
2018-06-01 00:18:50 +02:00
|
|
|
folder.name = data.Name;
|
2018-02-10 01:00:55 +01:00
|
|
|
|
2018-10-14 14:55:00 +02:00
|
|
|
if folder.save(&conn).is_err() {
|
|
|
|
err!("Failed to save folder")
|
|
|
|
}
|
2018-08-30 17:43:46 +02:00
|
|
|
ws.send_folder_update(UpdateType::SyncFolderUpdate, &folder);
|
2018-02-10 01:00:55 +01:00
|
|
|
|
|
|
|
Ok(Json(folder.to_json()))
|
|
|
|
}
|
|
|
|
|
2018-02-17 23:38:55 +01:00
|
|
|
#[post("/folders/<uuid>/delete")]
|
2018-08-30 17:43:46 +02:00
|
|
|
fn delete_folder_post(uuid: String, headers: Headers, conn: DbConn, ws: State<WebSocketUsers>) -> EmptyResult {
|
|
|
|
delete_folder(uuid, headers, conn, ws)
|
2018-02-10 01:00:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#[delete("/folders/<uuid>")]
|
2018-08-30 17:43:46 +02:00
|
|
|
fn delete_folder(uuid: String, headers: Headers, conn: DbConn, ws: State<WebSocketUsers>) -> EmptyResult {
|
2018-02-10 01:00:55 +01:00
|
|
|
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")
|
|
|
|
}
|
|
|
|
|
2018-05-04 19:02:19 +02:00
|
|
|
// Delete the actual folder entry
|
2018-05-16 18:19:52 +02:00
|
|
|
match folder.delete(&conn) {
|
2018-08-30 17:43:46 +02:00
|
|
|
Ok(()) => {
|
|
|
|
ws.send_folder_update(UpdateType::SyncFolderDelete, &folder);
|
|
|
|
Ok(())
|
|
|
|
}
|
2018-05-16 18:19:52 +02:00
|
|
|
Err(_) => err!("Failed deleting folder")
|
|
|
|
}
|
2018-02-10 01:00:55 +01:00
|
|
|
}
|