From 03fa923ef4e79cbe14c3dcd239799dfd4a72a07b Mon Sep 17 00:00:00 2001
From: Paul <paulmakles@gmail.com>
Date: Fri, 11 Jun 2021 19:18:46 +0100
Subject: [PATCH] Refactor: Send system messages directly from content.

---
 src/database/entities/message.rs           | 13 ++++++
 src/routes/channels/delete_channel.rs      | 12 ++----
 src/routes/channels/edit_channel.rs        | 46 +++++++---------------
 src/routes/channels/group_add_member.rs    | 18 +++------
 src/routes/channels/group_remove_member.rs | 18 +++------
 5 files changed, 42 insertions(+), 65 deletions(-)

diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs
index 07c2eca..7d107ff 100644
--- a/src/database/entities/message.rs
+++ b/src/database/entities/message.rs
@@ -43,6 +43,19 @@ pub enum Content {
     SystemMessage(SystemMessage),
 }
 
+impl Content {
+    pub async fn send_as_system(self, target: &Channel) -> Result<()> {
+        Message::create(
+            "00000000000000000000000000".to_string(),
+            target.id().to_string(),
+            self,
+            None
+        )
+        .publish(&target)
+        .await
+    }
+}
+
 #[derive(Serialize, Deserialize, Debug, Clone)]
 pub struct Message {
     #[serde(rename = "_id")]
diff --git a/src/routes/channels/delete_channel.rs b/src/routes/channels/delete_channel.rs
index 7b3dfed..2869d17 100644
--- a/src/routes/channels/delete_channel.rs
+++ b/src/routes/channels/delete_channel.rs
@@ -98,15 +98,9 @@ pub async fn req(user: User, target: Ref) -> Result<()> {
             }
             .publish(id.clone());
 
-            Message::create(
-                "00000000000000000000000000".to_string(),
-                id.clone(),
-                Content::SystemMessage(SystemMessage::UserLeft { id: user.id }),
-                None
-            )
-            .publish(&target)
-            .await
-            .ok();
+            Content::SystemMessage(SystemMessage::UserLeft { id: user.id })
+            .send_as_system(&target)
+            .await.ok();
 
             Ok(())
         }
diff --git a/src/routes/channels/edit_channel.rs b/src/routes/channels/edit_channel.rs
index 8d33a14..668dfe0 100644
--- a/src/routes/channels/edit_channel.rs
+++ b/src/routes/channels/edit_channel.rs
@@ -112,44 +112,26 @@ pub async fn req(user: User, target: Ref, data: Json<Data>) -> Result<()> {
 
             if let Channel::Group { .. } = &target {
                 if let Some(name) = data.name {
-                    Message::create(
-                        "00000000000000000000000000".to_string(),
-                        id.clone(),
-                        Content::SystemMessage(SystemMessage::ChannelRenamed {
-                            name,
-                            by: user.id.clone(),
-                        }),
-                        None
-                    )
-                    .publish(&target)
-                    .await
-                    .ok();
+                    Content::SystemMessage(SystemMessage::ChannelRenamed {
+                        name,
+                        by: user.id.clone(),
+                    })
+                    .send_as_system(&target)
+                    .await.ok();
                 }
 
                 if let Some(_) = data.description {
-                    Message::create(
-                        "00000000000000000000000000".to_string(),
-                        id.clone(),
-                        Content::SystemMessage(SystemMessage::ChannelDescriptionChanged {
-                            by: user.id.clone(),
-                        }),
-                        None
-                    )
-                    .publish(&target)
-                    .await
-                    .ok();
+                    Content::SystemMessage(SystemMessage::ChannelDescriptionChanged {
+                        by: user.id.clone(),
+                    })
+                    .send_as_system(&target)
+                    .await.ok();
                 }
 
                 if let Some(_) = data.icon {
-                    Message::create(
-                        "00000000000000000000000000".to_string(),
-                        id.clone(),
-                        Content::SystemMessage(SystemMessage::ChannelIconChanged { by: user.id }),
-                        None
-                    )
-                    .publish(&target)
-                    .await
-                    .ok();
+                    Content::SystemMessage(SystemMessage::ChannelIconChanged { by: user.id })
+                    .send_as_system(&target)
+                    .await.ok();
                 }
             }
 
diff --git a/src/routes/channels/group_add_member.rs b/src/routes/channels/group_add_member.rs
index bb6aa70..e00c8af 100644
--- a/src/routes/channels/group_add_member.rs
+++ b/src/routes/channels/group_add_member.rs
@@ -55,18 +55,12 @@ pub async fn req(user: User, target: Ref, member: Ref) -> Result<()> {
         }
         .publish(id.clone());
 
-        Message::create(
-            "00000000000000000000000000".to_string(),
-            id.clone(),
-            Content::SystemMessage(SystemMessage::UserAdded {
-                id: member.id,
-                by: user.id,
-            }),
-            None
-        )
-        .publish(&channel)
-        .await
-        .ok();
+        Content::SystemMessage(SystemMessage::UserAdded {
+            id: member.id,
+            by: user.id,
+        })
+        .send_as_system(&channel)
+        .await.ok();
 
         Ok(())
     } else {
diff --git a/src/routes/channels/group_remove_member.rs b/src/routes/channels/group_remove_member.rs
index 9f7ea61..640bb8e 100644
--- a/src/routes/channels/group_remove_member.rs
+++ b/src/routes/channels/group_remove_member.rs
@@ -51,18 +51,12 @@ pub async fn req(user: User, target: Ref, member: Ref) -> Result<()> {
         }
         .publish(id.clone());
 
-        Message::create(
-            "00000000000000000000000000".to_string(),
-            id.clone(),
-            Content::SystemMessage(SystemMessage::UserRemove {
-                id: member.id,
-                by: user.id,
-            }),
-            None
-        )
-        .publish(&channel)
-        .await
-        .ok();
+        Content::SystemMessage(SystemMessage::UserRemove {
+            id: member.id,
+            by: user.id,
+        })
+        .send_as_system(&channel)
+        .await.ok();
 
         Ok(())
     } else {
-- 
GitLab