diff --git a/src/main.rs b/src/main.rs index b8d0cc219c7c70b5c3e0cf791b001e553b83ad69..1ce99885332f93719ce6e09faf6722c47b8aaef2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -60,7 +60,9 @@ async fn main() -> std::io::Result<()> { .wrap(AuthService {}) .service(service::admin_workspace) .service(service::add_page) - .service(service::get_page_data), + .service(service::get_page_data) + .service(service::files::post_files) + .service(service::files::delete_static_file), ), ) .service(service::files::favicon) diff --git a/src/service/admin.rs b/src/service/admin.rs index d10c659fbeabc6da0a1bd1bd3f1302fc0db84747..76fe7a2f1dd1b822d826b811891e284134f4b2f3 100644 --- a/src/service/admin.rs +++ b/src/service/admin.rs @@ -1,8 +1,7 @@ -use crate::website::{Page, WebSite}; use crate::AppState; use actix_web::{ get, post, - web::{Data, Form, Json}, + web::{Data, Form}, HttpRequest, HttpResponse, }; use std::sync::RwLock; @@ -89,42 +88,3 @@ pub async fn admin_login() -> HttpResponse { ", ) } - -#[derive(serde::Deserialize, Clone)] -pub struct AddPageData { - parent_page_id: usize, - new_page: Page, -} - -#[post("/add-page")] -pub async fn add_page( - website: Data<RwLock<WebSite>>, - add_page_data: Json<AddPageData>, -) -> HttpResponse { - match website - .write() - .expect("Couldn't acquire website write lock") - .add_page(add_page_data.parent_page_id, add_page_data.new_page.clone()) - { - Ok(()) => HttpResponse::Ok().finish(), - Err(msg) => { - HttpResponse::BadRequest().body(format!("Error adding new page to website - {}", msg)) - } - } -} - -#[get("/page-data/{id}")] -pub async fn get_page_data( - website: Data<RwLock<WebSite>>, - id: actix_web::web::Path<usize>, -) -> HttpResponse { - let id = id.into_inner(); - match website - .read() - .expect("Couldn't acquire website read lock") - .get_page(id) - { - Some(page) => HttpResponse::Ok().json(page), - None => HttpResponse::NotFound().body(format!("Page with id {} was not found", id)), - } -} diff --git a/src/service/mod.rs b/src/service/mod.rs index f461f48edf00e87b0d99250d2c16288a977ae750..18a7bf114a2cfc700b076b7cf847efb25c7f166d 100644 --- a/src/service/mod.rs +++ b/src/service/mod.rs @@ -1,3 +1,5 @@ mod admin; pub mod files; +mod website; pub use admin::*; +pub use website::*; diff --git a/src/service/website.rs b/src/service/website.rs new file mode 100644 index 0000000000000000000000000000000000000000..a7242a3b5a8cb3736e56159123f3d90d44206f01 --- /dev/null +++ b/src/service/website.rs @@ -0,0 +1,67 @@ +use crate::website::{Page, WebSite}; +use actix_web::{ + get, post, put, + web::{Data, Json}, + HttpResponse, +}; +use std::sync::RwLock; + +#[derive(serde::Deserialize, Clone)] +pub struct AddPageData { + parent_page_id: usize, + new_page: Page, +} + +#[post("/add-page")] +pub async fn add_page( + website: Data<RwLock<WebSite>>, + add_page_data: Json<AddPageData>, +) -> HttpResponse { + let add_page_data = add_page_data.into_inner(); + match website + .write() + .expect("Couldn't acquire website write lock") + .add_page(add_page_data.parent_page_id, add_page_data.new_page.clone()) + { + Ok(()) => HttpResponse::Ok().finish(), + Err(msg) => { + HttpResponse::BadRequest().body(format!("Error adding new page to website - {}", msg)) + } + } +} + +#[get("/page-data/{id}")] +pub async fn get_page_data( + website: Data<RwLock<WebSite>>, + id: actix_web::web::Path<usize>, +) -> HttpResponse { + let id = id.into_inner(); + match website + .read() + .expect("Couldn't acquire website read lock") + .get_page(id) + { + Some(page) => HttpResponse::Ok().json(page), + None => HttpResponse::NotFound().body(format!("Page with id {} was not found", id)), + } +} + +#[put("/update-page/{id}")] +pub async fn update_page( + id: actix_web::web::Path<usize>, + website: Data<RwLock<WebSite>>, + updated_page: Json<Page>, +) -> HttpResponse { + let id = id.into_inner(); + let updated_page = updated_page.into_inner(); + match website + .write() + .expect("Couldn't acquire website write lock") + .update_page(id, updated_page) + { + Ok(page) => HttpResponse::Ok().json(page), + Err(msg) => { + HttpResponse::NotFound().body(format!("Error updating page with id {} - {:?}", id, msg)) + } + } +} diff --git a/src/website/website.rs b/src/website/website.rs index 3168dbf3162d0298ac4aff448e1d0bb3fd927ec1..2de39e99cd48f4341b02f34380f20b20ca4a09e8 100644 --- a/src/website/website.rs +++ b/src/website/website.rs @@ -194,6 +194,10 @@ impl WebSite { Self::find_page(&self.root_page, id) } + pub fn get_page_mut(&mut self, id: usize) -> Option<&mut Page> { + Self::find_page_mut(&mut self.root_page, id) + } + pub fn add_page(&mut self, parent_page_id: usize, page: Page) -> Result<(), String> { let id = self.last_generated_page_id + 1; let parent_page = Self::find_page_mut(&mut self.root_page, parent_page_id); @@ -215,6 +219,16 @@ impl WebSite { Ok(()) } + + pub fn update_page(&mut self, id: usize, updated_page: Page) -> Result<&mut Page, String> { + match self.get_page_mut(id) { + Some(page) => { + *page = updated_page; + Ok(page) + } + None => Err(format!("Page with id {} was not found", id)), + } + } } #[cfg(test)] @@ -290,4 +304,20 @@ mod test_website { assert_eq!(retrieved.metadata.title, "Added page"); remove_test_dir(&test_dir); } + + #[test] + fn test_update_page() { + let test_dir = PathBuf::from("./test"); + let mut ws = test_website(&test_dir); + let mut root_page = ws.get_page_mut(1).unwrap().clone(); + assert_eq!(root_page.metadata.title, "TEST"); + root_page.metadata.title = String::from("UPDATED"); + let updated = ws.update_page(1, root_page).unwrap(); + assert_eq!(updated.metadata.title, "UPDATED"); + + let root_page = ws.get_page(1).unwrap(); + assert_eq!(root_page.metadata.title, "UPDATED"); + + remove_test_dir(&test_dir); + } }