]> Untitled Git - lemmy.git/blobdiff - crates/api_crud/src/comment/update.rs
implement language tags for site/community in db and api (#2434)
[lemmy.git] / crates / api_crud / src / comment / update.rs
index 24e2ddbdd2ae0ae3ba64232027044b6e0a13f240..f03ad5f50b5d6d3a3ca19a376f6bd9294665ffd5 100644 (file)
@@ -1,31 +1,45 @@
-use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
-  blocking,
-  check_community_ban,
-  comment::*,
-  get_local_user_view_from_jwt,
-  send_local_notifs,
+  comment::{CommentResponse, EditComment},
+  utils::{
+    blocking,
+    check_community_ban,
+    check_community_deleted_or_removed,
+    check_post_deleted_or_removed,
+    get_local_user_view_from_jwt,
+    is_mod_or_admin,
+  },
 };
-use lemmy_apub::activities::{
-  comment::create_or_update::CreateOrUpdateComment,
+use lemmy_apub::protocol::activities::{
+  create_or_update::comment::CreateOrUpdateComment,
   CreateOrUpdateType,
 };
-use lemmy_db_queries::source::comment::Comment_;
-use lemmy_db_schema::source::comment::*;
-use lemmy_db_views::comment_view::CommentView;
+use lemmy_db_schema::{
+  source::{
+    actor_language::CommunityLanguage,
+    comment::{Comment, CommentForm},
+  },
+  traits::Crud,
+};
+use lemmy_db_views::structs::CommentView;
 use lemmy_utils::{
+  error::LemmyError,
   utils::{remove_slurs, scrape_text_for_mentions},
-  ApiError,
   ConnectionId,
-  LemmyError,
 };
-use lemmy_websocket::{send::send_comment_ws_message, LemmyContext, UserOperationCrud};
+use lemmy_websocket::{
+  send::{send_comment_ws_message, send_local_notifs},
+  LemmyContext,
+  UserOperationCrud,
+};
+
+use crate::PerformCrud;
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for EditComment {
   type Response = CommentResponse;
 
+  #[tracing::instrument(skip(context, websocket_id))]
   async fn perform(
     &self,
     context: &Data<LemmyContext>,
@@ -48,42 +62,70 @@ impl PerformCrud for EditComment {
       context.pool(),
     )
     .await?;
+    check_community_deleted_or_removed(orig_comment.community.id, context.pool()).await?;
+    check_post_deleted_or_removed(&orig_comment.post)?;
 
     // Verify that only the creator can edit
     if local_user_view.person.id != orig_comment.creator.id {
-      return Err(ApiError::err("no_comment_edit_allowed").into());
+      return Err(LemmyError::from_message("no_comment_edit_allowed"));
+    }
+
+    if data.distinguished.is_some() {
+      // 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?;
     }
 
-    // Do the update
-    let content_slurs_removed =
-      remove_slurs(&data.content.to_owned(), &context.settings().slur_regex());
+    let language_id = self.language_id;
+    blocking(context.pool(), move |conn| {
+      CommunityLanguage::is_allowed_community_language(conn, language_id, orig_comment.community.id)
+    })
+    .await??;
+
+    // Update the Content
+    let content_slurs_removed = data
+      .content
+      .as_ref()
+      .map(|c| remove_slurs(c, &context.settings().slur_regex()));
     let comment_id = data.comment_id;
+    let form = CommentForm {
+      creator_id: orig_comment.comment.creator_id,
+      post_id: orig_comment.comment.post_id,
+      content: content_slurs_removed.unwrap_or(orig_comment.comment.content),
+      distinguished: data.distinguished,
+      language_id: data.language_id,
+      ..Default::default()
+    };
     let updated_comment = blocking(context.pool(), move |conn| {
-      Comment::update_content(conn, comment_id, &content_slurs_removed)
+      Comment::update(conn, comment_id, &form)
     })
     .await?
-    .map_err(|_| ApiError::err("couldnt_update_comment"))?;
-
-    // Send the apub update
-    CreateOrUpdateComment::send(
-      &updated_comment,
-      &local_user_view.person,
-      CreateOrUpdateType::Update,
-      context,
-    )
-    .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();
     let mentions = scrape_text_for_mentions(&updated_comment_content);
     let recipient_ids = send_local_notifs(
       mentions,
-      updated_comment,
-      local_user_view.person.clone(),
-      orig_comment.post,
-      context.pool(),
+      &updated_comment,
+      &local_user_view.person,
+      &orig_comment.post,
       false,
-      &context.settings(),
+      context,
+    )
+    .await?;
+
+    // Send the apub update
+    CreateOrUpdateComment::send(
+      updated_comment.into(),
+      &local_user_view.person.into(),
+      CreateOrUpdateType::Update,
+      context,
+      &mut 0,
     )
     .await?;