2021-11-07 18:53:39 +01:00
|
|
|
use rocket::serde::json::Json;
|
2018-10-10 20:40:39 +02:00
|
|
|
use serde_json::Value;
|
2018-02-10 01:00:55 +01:00
|
|
|
|
2020-07-14 18:00:09 +02:00
|
|
|
use crate::{
|
|
|
|
api::{EmptyResult, JsonResult, JsonUpcase, Notify, UpdateType},
|
|
|
|
auth::Headers,
|
|
|
|
db::{models::*, DbConn},
|
|
|
|
};
|
2018-02-10 01:00:55 +01:00
|
|
|
|
2020-07-14 18:00:09 +02:00
|
|
|
pub fn routes() -> Vec<rocket::Route> {
|
2021-04-06 21:54:42 +01:00
|
|
|
routes![get_folders, get_folder, post_folders, post_folder, put_folder, delete_folder_post, delete_folder,]
|
2018-10-10 20:40:39 +02:00
|
|
|
}
|
|
|
|
|
2018-02-10 01:00:55 +01:00
|
|
|
#[get("/folders")]
|
2022-05-20 23:39:47 +02:00
|
|
|
async fn get_folders(headers: Headers, mut conn: DbConn) -> Json<Value> {
|
|
|
|
let folders = Folder::find_by_user(&headers.user.uuid, &mut conn).await;
|
2019-02-27 17:21:04 +01:00
|
|
|
let folders_json: Vec<Value> = folders.iter().map(Folder::to_json).collect();
|
2018-02-10 01:00:55 +01:00
|
|
|
|
2021-03-27 15:07:26 +00:00
|
|
|
Json(json!({
|
2018-02-10 01:00:55 +01:00
|
|
|
"Data": folders_json,
|
|
|
|
"Object": "list",
|
2018-10-01 17:02:58 +01:00
|
|
|
"ContinuationToken": null,
|
2021-03-27 15:07:26 +00:00
|
|
|
}))
|
2018-02-10 01:00:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#[get("/folders/<uuid>")]
|
2023-04-30 17:18:12 +02:00
|
|
|
async fn get_folder(uuid: &str, headers: Headers, mut conn: DbConn) -> JsonResult {
|
|
|
|
let folder = match Folder::find_by_uuid(uuid, &mut conn).await {
|
2018-02-10 01:00:55 +01:00
|
|
|
Some(folder) => folder,
|
2018-12-30 23:34:31 +01:00
|
|
|
_ => err!("Invalid folder"),
|
2018-02-10 01:00:55 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
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-12-30 23:34:31 +01: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>")]
|
2022-05-20 23:39:47 +02:00
|
|
|
async fn post_folders(data: JsonUpcase<FolderData>, headers: Headers, mut conn: DbConn, nt: Notify<'_>) -> JsonResult {
|
2018-06-01 00:18:50 +02:00
|
|
|
let data: FolderData = data.into_inner().data;
|
2018-02-10 01:00:55 +01:00
|
|
|
|
2019-11-02 17:39:01 +01:00
|
|
|
let mut folder = Folder::new(headers.user.uuid, data.Name);
|
2018-02-10 01:00:55 +01:00
|
|
|
|
2022-05-20 23:39:47 +02:00
|
|
|
folder.save(&mut conn).await?;
|
2022-12-30 21:23:55 +01:00
|
|
|
nt.send_folder_update(UpdateType::SyncFolderCreate, &folder, &headers.device.uuid).await;
|
2018-02-10 01:00:55 +01:00
|
|
|
|
|
|
|
Ok(Json(folder.to_json()))
|
|
|
|
}
|
|
|
|
|
|
|
|
#[post("/folders/<uuid>", data = "<data>")]
|
2021-11-16 17:07:55 +01:00
|
|
|
async fn post_folder(
|
2023-04-30 17:18:12 +02:00
|
|
|
uuid: &str,
|
2021-11-16 17:07:55 +01:00
|
|
|
data: JsonUpcase<FolderData>,
|
|
|
|
headers: Headers,
|
|
|
|
conn: DbConn,
|
|
|
|
nt: Notify<'_>,
|
|
|
|
) -> JsonResult {
|
|
|
|
put_folder(uuid, data, headers, conn, nt).await
|
2018-02-10 01:00:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#[put("/folders/<uuid>", data = "<data>")]
|
2021-11-16 17:07:55 +01:00
|
|
|
async fn put_folder(
|
2023-04-30 17:18:12 +02:00
|
|
|
uuid: &str,
|
2021-11-16 17:07:55 +01:00
|
|
|
data: JsonUpcase<FolderData>,
|
|
|
|
headers: Headers,
|
2022-05-20 23:39:47 +02:00
|
|
|
mut conn: DbConn,
|
2021-11-16 17:07:55 +01:00
|
|
|
nt: Notify<'_>,
|
|
|
|
) -> JsonResult {
|
2018-06-01 00:18:50 +02:00
|
|
|
let data: FolderData = data.into_inner().data;
|
2018-02-23 00:38:54 +01:00
|
|
|
|
2023-04-30 17:18:12 +02:00
|
|
|
let mut folder = match Folder::find_by_uuid(uuid, &mut conn).await {
|
2018-02-10 01:00:55 +01:00
|
|
|
Some(folder) => folder,
|
2018-12-30 23:34:31 +01:00
|
|
|
_ => err!("Invalid folder"),
|
2018-02-10 01:00:55 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
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
|
|
|
|
2022-05-20 23:39:47 +02:00
|
|
|
folder.save(&mut conn).await?;
|
2022-12-30 21:23:55 +01:00
|
|
|
nt.send_folder_update(UpdateType::SyncFolderUpdate, &folder, &headers.device.uuid).await;
|
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")]
|
2023-04-30 17:18:12 +02:00
|
|
|
async fn delete_folder_post(uuid: &str, headers: Headers, conn: DbConn, nt: Notify<'_>) -> EmptyResult {
|
2021-11-16 17:07:55 +01:00
|
|
|
delete_folder(uuid, headers, conn, nt).await
|
2018-02-10 01:00:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#[delete("/folders/<uuid>")]
|
2023-04-30 17:18:12 +02:00
|
|
|
async fn delete_folder(uuid: &str, headers: Headers, mut conn: DbConn, nt: Notify<'_>) -> EmptyResult {
|
|
|
|
let folder = match Folder::find_by_uuid(uuid, &mut conn).await {
|
2018-02-10 01:00:55 +01:00
|
|
|
Some(folder) => folder,
|
2018-12-30 23:34:31 +01:00
|
|
|
_ => err!("Invalid folder"),
|
2018-02-10 01:00:55 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
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
|
2022-05-20 23:39:47 +02:00
|
|
|
folder.delete(&mut conn).await?;
|
2018-12-19 21:52:53 +01:00
|
|
|
|
2022-12-30 21:23:55 +01:00
|
|
|
nt.send_folder_update(UpdateType::SyncFolderDelete, &folder, &headers.device.uuid).await;
|
2018-12-19 21:52:53 +01:00
|
|
|
Ok(())
|
2018-02-10 01:00:55 +01:00
|
|
|
}
|