From 0b53d2f66e7c29706ca9a2e83b74a64e833bb4a0 Mon Sep 17 00:00:00 2001
From: Pierre Jarriges <pierre.jarriges@tutanota.com>
Date: Mon, 26 Sep 2022 10:12:13 +0200
Subject: [PATCH] load website from existing

---
 src/main.rs                      | 15 +++++-----
 src/static_files/static_files.rs |  2 +-
 src/website/website.rs           | 49 ++++++++++++++++++++++++++++----
 3 files changed, 52 insertions(+), 14 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index ba4dd2d..1edfb00 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -26,10 +26,14 @@ async fn main() -> std::io::Result<()> {
     )
     .init();
 
-    let website = WebSiteBuilder::load(&app_state.config)
-        .with_static_files_manager(StaticFilesManager::new(&app_state).unwrap().build())
-        .build()
-        .unwrap();
+    let website = {
+        let mut wb = WebSiteBuilder::load(&app_state.config);
+        let static_manager = StaticFilesManager::new(&app_state).unwrap().build();
+        wb.save(&app_state.config).unwrap();
+        wb.with_static_files_manager(static_manager)
+            .build()
+            .unwrap()
+    };
 
     let host = app_state.config.host.clone();
     let port = app_state.config.port;
@@ -37,9 +41,6 @@ async fn main() -> std::io::Result<()> {
 
     let srv_conf = tls_config(&app_state.config);
     let dir = website.static_files_manager.dir.clone();
-    // let mut_app_state = RwLock::new(app_state);
-    // let app_state = web::Data::new(mut_app_state);
-    // let mut_website = web::Data::new(RwLock::new(website));
 
     HttpServer::new(move || {
         App::new()
diff --git a/src/static_files/static_files.rs b/src/static_files/static_files.rs
index 5fd6643..00e42d5 100644
--- a/src/static_files/static_files.rs
+++ b/src/static_files/static_files.rs
@@ -3,7 +3,7 @@ use crate::website::Page;
 use std::io::prelude::*;
 use std::path::{Path, PathBuf};
 
-#[derive(Clone, Debug)]
+#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
 pub struct StaticFilesManager {
     pub dir: PathBuf,
     pub index: Vec<String>,
diff --git a/src/website/website.rs b/src/website/website.rs
index 8e2d201..970451d 100644
--- a/src/website/website.rs
+++ b/src/website/website.rs
@@ -2,6 +2,7 @@ use super::page::{Page, PageTemplate};
 use crate::app::AppConfig;
 use crate::static_files::StaticFilesManager;
 use serde::{Deserialize, Serialize};
+use std::io::prelude::*;
 use std::path::PathBuf;
 
 #[derive(Debug, Serialize, Deserialize, Clone)]
@@ -45,16 +46,52 @@ impl WebSiteBuilder {
             .with_static_files_manager(StaticFilesManager::testing_new(test_dir).unwrap())
     }
 
-    pub fn load(config: &AppConfig) -> WebSiteBuilder {
+    fn blank_website_template() -> PathBuf {
+        std::env::current_dir()
+            .unwrap()
+            .join("templates")
+            .join("new_website.json")
+    }
+
+    pub fn load(config: &AppConfig) -> Self {
         let file_path = match &config.load {
-            None => std::env::current_dir()
-                .unwrap()
-                .join("templates")
-                .join("new_website.json"),
             Some(pth) => pth.clone(),
+            None => {
+                if let Some(loaded) = Self::try_load_from_existing_file(config) {
+                    return loaded;
+                }
+                Self::blank_website_template()
+            }
         };
 
-        WebSiteBuilder::from_json(&std::fs::read_to_string(file_path).unwrap())
+        Self::from_json(&std::fs::read_to_string(file_path).unwrap())
+    }
+
+    fn try_load_from_existing_file(config: &AppConfig) -> Option<Self> {
+        let website_file_path = config.storage_dir.join("website.json");
+
+        if website_file_path.exists() {
+            match &std::fs::read_to_string(&website_file_path) {
+                Ok(json) => return Some(Self::from_json(&json)),
+                Err(_) => return None,
+            }
+        }
+
+        None
+    }
+
+    pub fn save(&self, config: &AppConfig) -> std::io::Result<()> {
+        let save_json = serde_json::to_string(self).unwrap();
+        let json_path = config.storage_dir.join("website.json");
+        let mut f = std::fs::OpenOptions::new()
+            .write(true)
+            .create(true)
+            .truncate(true)
+            .open(&json_path)?;
+        f.write_all(save_json.as_bytes())?;
+        f.flush()?;
+
+        Ok(())
     }
 }
 
-- 
GitLab