From 5a31e282772f348712008fcd745fd10537fe35ef Mon Sep 17 00:00:00 2001
From: Pierre Jarriges <pierre.jarriges@tutanota.com>
Date: Fri, 30 Sep 2022 12:03:07 +0200
Subject: [PATCH] update page

---
 src/main.rs            |  4 ++-
 src/service/admin.rs   | 42 +-------------------------
 src/service/mod.rs     |  2 ++
 src/service/website.rs | 67 ++++++++++++++++++++++++++++++++++++++++++
 src/website/website.rs | 30 +++++++++++++++++++
 5 files changed, 103 insertions(+), 42 deletions(-)
 create mode 100644 src/service/website.rs

diff --git a/src/main.rs b/src/main.rs
index b8d0cc2..1ce9988 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 d10c659..76fe7a2 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 f461f48..18a7bf1 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 0000000..a7242a3
--- /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 3168dbf..2de39e9 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);
+    }
 }
-- 
GitLab