From 5aa9624d5c7aa4e3342c5ae9feaf7c71f55f0f6b Mon Sep 17 00:00:00 2001
From: Paul <paulmakles@gmail.com>
Date: Wed, 26 May 2021 11:02:16 +0100
Subject: [PATCH] Database: Add user settings sync entity. Run cargo fmt.

---
 src/database/entities/message.rs              |  7 +--
 .../entities/{ => microservice}/autumn.rs     |  0
 .../entities/{ => microservice}/january.rs    |  0
 src/database/entities/microservice/mod.rs     |  2 +
 src/database/entities/mod.rs                  |  7 ++-
 src/database/entities/sync.rs                 |  3 ++
 src/database/entities/user.rs                 |  8 +--
 src/database/migrations/scripts.rs            | 53 ++++++++++---------
 src/routes/channels/edit_channel.rs           |  9 +++-
 src/routes/channels/message_query.rs          |  2 +-
 src/routes/channels/message_send.rs           |  4 +-
 src/routes/root.rs                            |  5 +-
 src/util/result.rs                            |  8 ++-
 13 files changed, 67 insertions(+), 41 deletions(-)
 rename src/database/entities/{ => microservice}/autumn.rs (100%)
 rename src/database/entities/{ => microservice}/january.rs (100%)
 create mode 100644 src/database/entities/microservice/mod.rs
 create mode 100644 src/database/entities/sync.rs

diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs
index 177c530..a5b6eb9 100644
--- a/src/database/entities/message.rs
+++ b/src/database/entities/message.rs
@@ -1,4 +1,4 @@
-use crate::util::variables::{VAPID_PRIVATE_KEY, USE_JANUARY};
+use crate::util::variables::{USE_JANUARY, VAPID_PRIVATE_KEY};
 use crate::{
     database::*,
     notifications::{events::ClientboundNotification, websocket::is_online},
@@ -297,12 +297,13 @@ impl Message {
         let channel = self.channel.clone();
         ClientboundNotification::MessageDelete {
             id: self.id.clone(),
-            channel: self.channel.clone()
+            channel: self.channel.clone(),
         }
         .publish(channel);
 
         if let Some(attachments) = &self.attachments {
-            let attachment_ids: Vec<String> = attachments.iter().map(|f| f.id.to_string()).collect();
+            let attachment_ids: Vec<String> =
+                attachments.iter().map(|f| f.id.to_string()).collect();
             get_collection("attachments")
                 .update_one(
                     doc! {
diff --git a/src/database/entities/autumn.rs b/src/database/entities/microservice/autumn.rs
similarity index 100%
rename from src/database/entities/autumn.rs
rename to src/database/entities/microservice/autumn.rs
diff --git a/src/database/entities/january.rs b/src/database/entities/microservice/january.rs
similarity index 100%
rename from src/database/entities/january.rs
rename to src/database/entities/microservice/january.rs
diff --git a/src/database/entities/microservice/mod.rs b/src/database/entities/microservice/mod.rs
new file mode 100644
index 0000000..334ed6f
--- /dev/null
+++ b/src/database/entities/microservice/mod.rs
@@ -0,0 +1,2 @@
+pub mod autumn;
+pub mod january;
\ No newline at end of file
diff --git a/src/database/entities/mod.rs b/src/database/entities/mod.rs
index d384f5d..358b2ea 100644
--- a/src/database/entities/mod.rs
+++ b/src/database/entities/mod.rs
@@ -1,9 +1,11 @@
-mod autumn;
+mod microservice;
 mod channel;
-mod january;
 mod message;
 mod server;
 mod user;
+mod sync;
+
+use microservice::*;
 
 pub use autumn::*;
 pub use channel::*;
@@ -11,3 +13,4 @@ pub use january::*;
 pub use message::*;
 pub use server::*;
 pub use user::*;
+pub use sync::*;
diff --git a/src/database/entities/sync.rs b/src/database/entities/sync.rs
new file mode 100644
index 0000000..d905c69
--- /dev/null
+++ b/src/database/entities/sync.rs
@@ -0,0 +1,3 @@
+use std::collections::HashMap;
+
+pub type UserSettings = HashMap<String, (i64, String)>;
diff --git a/src/database/entities/user.rs b/src/database/entities/user.rs
index 6648ad1..f9c1605 100644
--- a/src/database/entities/user.rs
+++ b/src/database/entities/user.rs
@@ -4,11 +4,11 @@ use mongodb::{
     bson::{doc, from_document},
     options::FindOptions,
 };
-use serde::{Deserialize, Serialize};
-use validator::Validate;
 use num_enum::TryFromPrimitive;
-use ulid::Ulid;
+use serde::{Deserialize, Serialize};
 use std::ops;
+use ulid::Ulid;
+use validator::Validate;
 
 use crate::database::permissions::user::UserPermissions;
 use crate::database::*;
@@ -65,7 +65,7 @@ pub enum Badges {
     Developer = 1,
     Translator = 2,
     Supporter = 4,
-    EarlyAdopter = 256
+    EarlyAdopter = 256,
 }
 
 impl_op_ex_commutative!(+ |a: &i32, b: &Badges| -> i32 { *a | *b as i32 });
diff --git a/src/database/migrations/scripts.rs b/src/database/migrations/scripts.rs
index e085959..8e28d7d 100644
--- a/src/database/migrations/scripts.rs
+++ b/src/database/migrations/scripts.rs
@@ -1,9 +1,12 @@
 use crate::database::{get_collection, get_db};
 
-use log::info;
 use futures::StreamExt;
+use log::info;
+use mongodb::{
+    bson::{doc, from_document},
+    options::FindOptions,
+};
 use serde::{Deserialize, Serialize};
-use mongodb::{bson::{doc, from_document}, options::FindOptions};
 
 #[derive(Serialize, Deserialize)]
 struct MigrationInfo {
@@ -92,34 +95,36 @@ pub async fn run_migrations(revision: i32) -> i32 {
         info!("Running migration [revision 3 / 2021-05-25]: Support multiple file uploads, add channel_unreads and user_settings.");
 
         let messages = get_collection("messages");
-        let mut cursor = messages.find(
-            doc! {
-                "attachment": {
-                    "$exists": 1
-                }
-            },
-            FindOptions::builder()
-                .projection(doc! {
-                    "_id": 1,
-                    "attachments": [ "$attachment" ]
-                })
-                .build()
-        )
-        .await
-        .expect("Failed to fetch messages.");
+        let mut cursor = messages
+            .find(
+                doc! {
+                    "attachment": {
+                        "$exists": 1
+                    }
+                },
+                FindOptions::builder()
+                    .projection(doc! {
+                        "_id": 1,
+                        "attachments": [ "$attachment" ]
+                    })
+                    .build(),
+            )
+            .await
+            .expect("Failed to fetch messages.");
 
         while let Some(result) = cursor.next().await {
             let doc = result.unwrap();
             let id = doc.get_str("_id").unwrap();
             let attachments = doc.get_array("attachments").unwrap();
 
-            messages.update_one(
-                doc! { "_id": id },
-                doc! { "$unset": { "attachment": 1 }, "$set": { "attachments": attachments } },
-                None
-            )
-            .await
-            .unwrap();
+            messages
+                .update_one(
+                    doc! { "_id": id },
+                    doc! { "$unset": { "attachment": 1 }, "$set": { "attachments": attachments } },
+                    None,
+                )
+                .await
+                .unwrap();
         }
 
         get_db()
diff --git a/src/routes/channels/edit_channel.rs b/src/routes/channels/edit_channel.rs
index d032377..5b2fbd2 100644
--- a/src/routes/channels/edit_channel.rs
+++ b/src/routes/channels/edit_channel.rs
@@ -111,7 +111,10 @@ pub async fn req(user: User, target: Ref, data: Json<Data>) -> Result<()> {
                 Message::create(
                     "00000000000000000000000000".to_string(),
                     id.clone(),
-                    Content::SystemMessage(SystemMessage::ChannelRenamed { name, by: user.id.clone() }),
+                    Content::SystemMessage(SystemMessage::ChannelRenamed {
+                        name,
+                        by: user.id.clone(),
+                    }),
                 )
                 .publish(&target)
                 .await
@@ -122,7 +125,9 @@ pub async fn req(user: User, target: Ref, data: Json<Data>) -> Result<()> {
                 Message::create(
                     "00000000000000000000000000".to_string(),
                     id.clone(),
-                    Content::SystemMessage(SystemMessage::ChannelDescriptionChanged { by: user.id.clone() }),
+                    Content::SystemMessage(SystemMessage::ChannelDescriptionChanged {
+                        by: user.id.clone(),
+                    }),
                 )
                 .publish(&target)
                 .await
diff --git a/src/routes/channels/message_query.rs b/src/routes/channels/message_query.rs
index 3206f23..b0ca01c 100644
--- a/src/routes/channels/message_query.rs
+++ b/src/routes/channels/message_query.rs
@@ -28,7 +28,7 @@ pub struct Options {
     #[validate(length(min = 26, max = 26))]
     after: Option<String>,
     sort: Option<Sort>,
-    include_users: Option<bool>
+    include_users: Option<bool>,
 }
 
 #[get("/<target>/messages?<options..>")]
diff --git a/src/routes/channels/message_send.rs b/src/routes/channels/message_send.rs
index 38c529d..60591fa 100644
--- a/src/routes/channels/message_send.rs
+++ b/src/routes/channels/message_send.rs
@@ -59,7 +59,9 @@ pub async fn req(user: User, target: Ref, message: Json<Data>) -> Result<JsonVal
 
     let id = Ulid::new().to_string();
     let attachments = if let Some(attachment_id) = &message.attachment {
-        Some(vec![ File::find_and_use(attachment_id, "attachments", "message", &id).await? ])
+        Some(vec![
+            File::find_and_use(attachment_id, "attachments", "message", &id).await?,
+        ])
     } else {
         None
     };
diff --git a/src/routes/root.rs b/src/routes/root.rs
index d14ff38..c1f4008 100644
--- a/src/routes/root.rs
+++ b/src/routes/root.rs
@@ -1,6 +1,7 @@
 use crate::util::variables::{
-    APP_URL, JANUARY_URL, AUTUMN_URL, DISABLE_REGISTRATION, EXTERNAL_WS_URL, HCAPTCHA_SITEKEY, INVITE_ONLY,
-    USE_AUTUMN, USE_JANUARY, USE_EMAIL, USE_HCAPTCHA, USE_VOSO, VAPID_PUBLIC_KEY, VOSO_URL, VOSO_WS_HOST,
+    APP_URL, AUTUMN_URL, DISABLE_REGISTRATION, EXTERNAL_WS_URL, HCAPTCHA_SITEKEY, INVITE_ONLY,
+    JANUARY_URL, USE_AUTUMN, USE_EMAIL, USE_HCAPTCHA, USE_JANUARY, USE_VOSO, VAPID_PUBLIC_KEY,
+    VOSO_URL, VOSO_WS_HOST,
 };
 
 use mongodb::bson::doc;
diff --git a/src/util/result.rs b/src/util/result.rs
index e130c96..8b39c95 100644
--- a/src/util/result.rs
+++ b/src/util/result.rs
@@ -29,13 +29,17 @@ pub enum Error {
     CannotEditMessage,
     EmptyMessage,
     CannotRemoveYourself,
-    GroupTooLarge { max: usize },
+    GroupTooLarge {
+        max: usize,
+    },
     AlreadyInGroup,
     NotInGroup,
 
     // ? General errors.
     TooManyIds,
-    FailedValidation { error: ValidationErrors },
+    FailedValidation {
+        error: ValidationErrors,
+    },
     DatabaseError {
         operation: &'static str,
         with: &'static str,
-- 
GitLab