]> Untitled Git - lemmy.git/commitdiff
Adding distinguish comment. Fixes #2002 (#2391)
authorDessalines <dessalines@users.noreply.github.com>
Wed, 17 Aug 2022 11:38:52 +0000 (07:38 -0400)
committerGitHub <noreply@github.com>
Wed, 17 Aug 2022 11:38:52 +0000 (11:38 +0000)
* Adding distinguish comment. Fixes #2002

* Adding lemmy:distinguished

12 files changed:
crates/api_common/src/comment.rs
crates/api_crud/src/comment/update.rs
crates/apub/assets/lemmy/context.json
crates/apub/assets/lemmy/objects/note.json
crates/apub/src/objects/comment.rs
crates/apub/src/protocol/objects/note.rs
crates/db_schema/src/impls/comment.rs
crates/db_schema/src/schema.rs
crates/db_schema/src/source/comment.rs
crates/db_views/src/comment_view.rs
migrations/2022-08-04-214722_add_distinguished_comment/down.sql [new file with mode: 0644]
migrations/2022-08-04-214722_add_distinguished_comment/up.sql [new file with mode: 0644]

index dc2360edd7c8c5fb2ea6cc0c5e868838954feb5e..df3ddbafacbe7a31537b0d55adc315046eeba7b4 100644 (file)
@@ -24,8 +24,9 @@ pub struct GetComment {
 
 #[derive(Debug, Serialize, Deserialize, Clone, Default)]
 pub struct EditComment {
-  pub content: String,
   pub comment_id: CommentId,
+  pub content: Option<String>,
+  pub distinguished: Option<bool>,
   pub form_id: Option<String>,
   pub auth: Sensitive<String>,
 }
index 2a769277a5017ae676a5ce09477d8c84719beda4..4939d5abdf2256e2686162564bfcd3b6e27427eb 100644 (file)
@@ -7,6 +7,7 @@ use lemmy_api_common::{
     check_community_deleted_or_removed,
     check_post_deleted_or_removed,
     get_local_user_view_from_jwt,
+    is_mod_or_admin,
   },
 };
 use lemmy_apub::protocol::activities::{
@@ -47,6 +48,7 @@ impl PerformCrud for EditComment {
       CommentView::read(conn, comment_id, None)
     })
     .await??;
+    let mut updated_comment = orig_comment.comment.clone();
 
     // TODO is this necessary? It should really only need to check on create
     check_community_ban(
@@ -63,15 +65,32 @@ impl PerformCrud for EditComment {
       return Err(LemmyError::from_message("no_comment_edit_allowed"));
     }
 
-    // Do the update
-    let content_slurs_removed =
-      remove_slurs(&data.content.to_owned(), &context.settings().slur_regex());
-    let comment_id = data.comment_id;
-    let updated_comment = blocking(context.pool(), move |conn| {
-      Comment::update_content(conn, comment_id, &content_slurs_removed)
-    })
-    .await?
-    .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
+    if let Some(distinguished) = data.distinguished {
+      // Verify that only a mod or admin can distinguish a comment
+      is_mod_or_admin(
+        context.pool(),
+        local_user_view.person.id,
+        orig_comment.community.id,
+      )
+      .await?;
+
+      updated_comment = blocking(context.pool(), move |conn| {
+        Comment::update_distinguished(conn, comment_id, distinguished)
+      })
+      .await?
+      .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
+    }
+
+    // Update the Content
+    if let Some(content) = &data.content {
+      let content_slurs_removed = remove_slurs(content, &context.settings().slur_regex());
+      let comment_id = data.comment_id;
+      updated_comment = blocking(context.pool(), move |conn| {
+        Comment::update_content(conn, comment_id, &content_slurs_removed)
+      })
+      .await?
+      .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
+    };
 
     // Do the mentions / recipients
     let updated_comment_content = updated_comment.content.to_owned();
index 1a0fb07d1f57e855ee2a3fb756498801cd043925..68476585cbaeb55e15cc6f74271315b978a4e9f4 100644 (file)
@@ -16,6 +16,7 @@
       "@type": "@id",
       "@id": "lemmy:moderators"
     },
-    "expires": "as:endTime"
+    "expires": "as:endTime",
+    "distinguished": "lemmy:distinguished"
   }
 ]
index 269063a769e7f1ccd9622221cc63121c210772f9..44a3b516cf9649f0df1f64a4413b6ae7df8b123d 100644 (file)
@@ -21,6 +21,7 @@
       "name": "@picard@enterprise.lemmy.ml"
     }
   ],
+  "distinguished": false,
   "published": "2021-03-01T13:42:43.966208+00:00",
   "updated": "2021-03-01T13:43:03.955787+00:00"
 }
index 88b08746c15ea6507ccbd7067f38118900364328..82601170e1d7a9f7563b389eaed18e32ef89a87d 100644 (file)
@@ -121,6 +121,7 @@ impl ApubObject for ApubComment {
       published: Some(convert_datetime(self.published)),
       updated: self.updated.map(convert_datetime),
       tag: maa.tags,
+      distinguished: Some(self.distinguished),
     };
 
     Ok(note)
@@ -184,6 +185,7 @@ impl ApubObject for ApubComment {
       updated: note.updated.map(|u| u.naive_local()),
       deleted: None,
       ap_id: Some(note.id.into()),
+      distinguished: note.distinguished,
       local: Some(false),
     };
     let parent_comment_path = parent_comment.map(|t| t.0.path);
index 211737377a050976a147d67a815ca4cac73f0527..75fecac799bb371adb0c3abcdb9fe6401e5c44f9 100644 (file)
@@ -44,6 +44,8 @@ pub struct Note {
   pub(crate) updated: Option<DateTime<FixedOffset>>,
   #[serde(default)]
   pub(crate) tag: Vec<MentionOrValue>,
+  // lemmy extension
+  pub(crate) distinguished: Option<bool>,
 }
 
 impl Note {
index f3199c77fedc52ac5f04fa17a675393f608cb23c..bb6a928b7d74277636ae99e22cda01a18e23695a 100644 (file)
@@ -86,6 +86,17 @@ impl Comment {
       .get_result::<Self>(conn)
   }
 
+  pub fn update_distinguished(
+    conn: &PgConnection,
+    comment_id: CommentId,
+    new_distinguished: bool,
+  ) -> Result<Self, Error> {
+    use crate::schema::comment::dsl::*;
+    diesel::update(comment.find(comment_id))
+      .set((distinguished.eq(new_distinguished), updated.eq(naive_now())))
+      .get_result::<Self>(conn)
+  }
+
   pub fn create(
     conn: &PgConnection,
     comment_form: &CommentForm,
@@ -330,6 +341,7 @@ mod tests {
       published: inserted_comment.published,
       updated: None,
       ap_id: inserted_comment.ap_id.to_owned(),
+      distinguished: false,
       local: true,
     };
 
index 44e8e0bbc0b79920c034ff22cffee2226dd6dad0..4c2caaf06c738071bae18d3e1b9fb2251052edb8 100644 (file)
@@ -26,6 +26,7 @@ table! {
         ap_id -> Varchar,
         local -> Bool,
         path -> Ltree,
+        distinguished -> Bool,
     }
 }
 
index 7418d122d01697310c3dd984829340b3f756edb2..80a71053cf43f5802f25b1ce39332a079b570db3 100644 (file)
@@ -22,6 +22,7 @@ pub struct Comment {
   pub local: bool,
   #[serde(with = "LtreeDef")]
   pub path: Ltree,
+  pub distinguished: bool,
 }
 
 #[derive(Clone, Default)]
@@ -37,6 +38,7 @@ pub struct CommentForm {
   pub deleted: Option<bool>,
   pub ap_id: Option<DbUrl>,
   pub local: Option<bool>,
+  pub distinguished: Option<bool>,
 }
 
 #[derive(PartialEq, Debug, Clone)]
index 05c6a698c41f1caccb36210a60b5e3099af22d61..9fa543d03c144d20c2cbbcc514f5dea2fbf8f77d 100644 (file)
@@ -531,6 +531,7 @@ mod tests {
         ap_id: inserted_comment_0.ap_id,
         updated: None,
         local: true,
+        distinguished: false,
         path: top_path,
       },
       creator: PersonSafe {
diff --git a/migrations/2022-08-04-214722_add_distinguished_comment/down.sql b/migrations/2022-08-04-214722_add_distinguished_comment/down.sql
new file mode 100644 (file)
index 0000000..fff6449
--- /dev/null
@@ -0,0 +1 @@
+alter table comment drop column distinguished;
diff --git a/migrations/2022-08-04-214722_add_distinguished_comment/up.sql b/migrations/2022-08-04-214722_add_distinguished_comment/up.sql
new file mode 100644 (file)
index 0000000..a23d233
--- /dev/null
@@ -0,0 +1 @@
+alter table comment add column distinguished boolean not null default false;