bitwarden_rs/src/api/core/folders.rs

107 lines
3.0 KiB
Rust
Raw Normal View History

use rocket::serde::json::Json;
use serde_json::Value;
2018-02-10 01:00:55 +01:00
use crate::{
api::{EmptyResult, JsonResult, JsonUpcase, Notify, UpdateType},
auth::Headers,
db::{models::*, DbConn},
};
2018-02-10 01:00:55 +01:00
pub fn routes() -> Vec<rocket::Route> {
2021-04-06 22:54:42 +02:00
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")]
2021-03-27 16:07:26 +01:00
fn get_folders(headers: Headers, conn: DbConn) -> Json<Value> {
2018-02-10 01:00:55 +01:00
let folders = Folder::find_by_user(&headers.user.uuid, &conn);
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 16:07:26 +01:00
Json(json!({
2018-02-10 01:00:55 +01:00
"Data": folders_json,
"Object": "list",
"ContinuationToken": null,
2021-03-27 16:07:26 +01:00
}))
2018-02-10 01:00:55 +01:00
}
#[get("/folders/<uuid>")]
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"),
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()))
}
#[derive(Deserialize)]
#[allow(non_snake_case)]
pub struct FolderData {
pub Name: String,
}
2018-02-10 01:00:55 +01:00
#[post("/folders", data = "<data>")]
fn post_folders(data: JsonUpcase<FolderData>, headers: Headers, conn: DbConn, nt: Notify) -> JsonResult {
let data: FolderData = data.into_inner().data;
2018-02-10 01:00:55 +01:00
let mut folder = Folder::new(headers.user.uuid, data.Name);
2018-02-10 01:00:55 +01:00
folder.save(&conn)?;
nt.send_folder_update(UpdateType::FolderCreate, &folder);
2018-02-10 01:00:55 +01:00
Ok(Json(folder.to_json()))
}
#[post("/folders/<uuid>", data = "<data>")]
fn post_folder(uuid: String, data: JsonUpcase<FolderData>, headers: Headers, conn: DbConn, nt: Notify) -> JsonResult {
put_folder(uuid, data, headers, conn, nt)
2018-02-10 01:00:55 +01:00
}
#[put("/folders/<uuid>", data = "<data>")]
fn put_folder(uuid: String, data: JsonUpcase<FolderData>, headers: Headers, conn: DbConn, nt: Notify) -> JsonResult {
let data: FolderData = data.into_inner().data;
2018-02-10 01:00:55 +01:00
let mut folder = match Folder::find_by_uuid(&uuid, &conn) {
Some(folder) => folder,
_ => err!("Invalid folder"),
2018-02-10 01:00:55 +01:00
};
if folder.user_uuid != headers.user.uuid {
err!("Folder belongs to another user")
}
folder.name = data.Name;
2018-02-10 01:00:55 +01:00
folder.save(&conn)?;
nt.send_folder_update(UpdateType::FolderUpdate, &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")]
fn delete_folder_post(uuid: String, headers: Headers, conn: DbConn, nt: Notify) -> EmptyResult {
delete_folder(uuid, headers, conn, nt)
2018-02-10 01:00:55 +01:00
}
#[delete("/folders/<uuid>")]
fn delete_folder(uuid: String, headers: Headers, conn: DbConn, nt: Notify) -> EmptyResult {
2018-02-10 01:00:55 +01:00
let folder = match Folder::find_by_uuid(&uuid, &conn) {
Some(folder) => folder,
_ => err!("Invalid folder"),
2018-02-10 01:00:55 +01:00
};
if folder.user_uuid != headers.user.uuid {
err!("Folder belongs to another user")
}
// Delete the actual folder entry
folder.delete(&conn)?;
nt.send_folder_update(UpdateType::FolderDelete, &folder);
Ok(())
2018-02-10 01:00:55 +01:00
}