about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/micropub/post.rs47
1 files changed, 35 insertions, 12 deletions
diff --git a/src/micropub/post.rs b/src/micropub/post.rs
index 260b9aa..6906dc0 100644
--- a/src/micropub/post.rs
+++ b/src/micropub/post.rs
@@ -17,6 +17,8 @@ static DEFAULT_CHANNEL_PATH: &str = "/feeds/main";
 static DEFAULT_CHANNEL_NAME: &str = "Main feed";
 static CONTACTS_CHANNEL_PATH: &str = "/feeds/vcards";
 static CONTACTS_CHANNEL_NAME: &str = "My address book";
+static FOOD_CHANNEL_PATH: &str = "/feeds/food";
+static FOOD_CHANNEL_NAME: &str = "My recipe book";
 
 macro_rules! response {
     ($($code:expr, $json:tt)+) => {
@@ -125,19 +127,31 @@ pub fn normalize_mf2(mut body: serde_json::Value, user: &User) -> (String, serde
         }])
     }
     if body["properties"]["channel"][0].as_str().is_none() {
-        if body["type"][0] == "h-entry" {
-            // Set the channel to the main channel...
-            let default_channel = me.join(DEFAULT_CHANNEL_PATH).unwrap().to_string();
+        match body["type"][0].as_str() {
+            Some("h-entry") => {
+                // Set the channel to the main channel...
+                let default_channel = me.join(DEFAULT_CHANNEL_PATH).unwrap().to_string();
 
-            body["properties"]["channel"] = json!([default_channel]);
-        } else if body["type"][0] == "h-card" {
-            let default_channel = me.join(CONTACTS_CHANNEL_PATH).unwrap().to_string();
+                body["properties"]["channel"] = json!([default_channel]);
+            },
+            Some("h-card") => {
+                let default_channel = me.join(CONTACTS_CHANNEL_PATH).unwrap().to_string();
 
-            body["properties"]["channel"] = json!([default_channel]);
-        } else {
-            body["properties"]["channel"] = json!([]);
+                body["properties"]["channel"] = json!([default_channel]);
+            },
+            Some("h-food") => {
+                let default_channel = me.join(FOOD_CHANNEL_PATH).unwrap().to_string();
+
+                body["properties"]["channel"] = json!([default_channel]);
+            },
+            // TODO h-event
+            /*"h-event" => {
+                let default_channel
+            },*/
+            _ => {
+                body["properties"]["channel"] = json!([]);
+            }
         }
-        // TODO: Sort other types of posts into channels too
     }
     body["properties"]["posted-with"] = json!([user.client_id]);
     if body["properties"]["author"][0].as_str().is_none() {
@@ -220,6 +234,7 @@ pub async fn new_post<S: Storage>(
     {
         let default_channel = user.me.join(DEFAULT_CHANNEL_PATH).unwrap().to_string();
         let vcards_channel = user.me.join(CONTACTS_CHANNEL_PATH).unwrap().to_string();
+        let food_channel = user.me.join(FOOD_CHANNEL_PATH).unwrap().to_string();
         match storage.post_exists(&channel).await {
             Ok(exists) => {
                 if exists {
@@ -243,7 +258,7 @@ pub async fn new_post<S: Storage>(
                             )
                         );
                     }
-                } else if channel == default_channel || channel == vcards_channel {
+                } else if channel == default_channel || channel == vcards_channel || channel == food_channel {
                     if let Err(err) = create_feed(storage, &uid, &channel, &user).await {
                         return error_json!(
                             500,
@@ -279,12 +294,18 @@ async fn create_feed(
     user: &User,
 ) -> crate::database::Result<()> {
     let path = url::Url::parse(channel).unwrap().path().to_string();
+
+    // Note to Future Vika: DO NOT CONVERT THIS TO A MATCH BLOCK
+    // It will get treated as a binding instead of a const
+    // See `rustc --explain E0530` for more info
     let (name, slug) = if path == DEFAULT_CHANNEL_PATH {
         (DEFAULT_CHANNEL_NAME, "main")
     } else if path == CONTACTS_CHANNEL_PATH {
         (CONTACTS_CHANNEL_NAME, "vcards")
+    } else if path == FOOD_CHANNEL_PATH {
+        (FOOD_CHANNEL_NAME, "food")
     } else {
-        panic!("Tried to create an unknown default feed!");
+        panic!("Tried to create an unknown default feed!")
     };
 
     let (_, feed) = normalize_mf2(
@@ -437,6 +458,8 @@ async fn post_process_new_post<S: Storage>(
                 if let Some(values) = response.header("Link") {
                     let iter = values.iter().flat_map(|i| i.as_str().split(','));
 
+                    // Honestly I don't like this parser. It's very crude.
+                    // But it should do the job. But I don't like it.
                     for link in iter {
                         let mut split = link.split(';');