From d058e2217a458abe5bdeb11be14b5f4723329d8a Mon Sep 17 00:00:00 2001
From: Felix Ableitner <me@nutomic.com>
Date: Tue, 23 Aug 2022 23:40:56 +0200
Subject: [PATCH] api changes for comment language tagging

---
 crates/api_common/src/comment.rs      |  4 ++-
 crates/api_crud/src/comment/create.rs |  8 ++++++
 crates/api_crud/src/comment/update.rs | 39 +++++++++++++++------------
 crates/api_crud/src/post/create.rs    |  1 -
 crates/api_crud/src/post/update.rs    | 19 +++----------
 crates/db_schema/src/impls/comment.rs | 22 ---------------
 scripts/test.sh                       |  2 +-
 7 files changed, 37 insertions(+), 58 deletions(-)

diff --git a/crates/api_common/src/comment.rs b/crates/api_common/src/comment.rs
index df3ddbaf..ea83f8aa 100644
--- a/crates/api_common/src/comment.rs
+++ b/crates/api_common/src/comment.rs
@@ -1,6 +1,6 @@
 use crate::sensitive::Sensitive;
 use lemmy_db_schema::{
-  newtypes::{CommentId, CommentReportId, CommunityId, LocalUserId, PostId},
+  newtypes::{CommentId, CommentReportId, CommunityId, LanguageId, LocalUserId, PostId},
   CommentSortType,
   ListingType,
 };
@@ -12,6 +12,7 @@ pub struct CreateComment {
   pub content: String,
   pub post_id: PostId,
   pub parent_id: Option<CommentId>,
+  pub language_id: Option<LanguageId>,
   pub form_id: Option<String>,
   pub auth: Sensitive<String>,
 }
@@ -27,6 +28,7 @@ pub struct EditComment {
   pub comment_id: CommentId,
   pub content: Option<String>,
   pub distinguished: Option<bool>,
+  pub language_id: Option<LanguageId>,
   pub form_id: Option<String>,
   pub auth: Sensitive<String>,
 }
diff --git a/crates/api_crud/src/comment/create.rs b/crates/api_crud/src/comment/create.rs
index c6b38612..73408fa9 100644
--- a/crates/api_crud/src/comment/create.rs
+++ b/crates/api_crud/src/comment/create.rs
@@ -84,10 +84,18 @@ impl PerformCrud for CreateComment {
       }
     }
 
+    // if no language is set, copy language from parent post/comment
+    let parent_language = parent_opt
+      .as_ref()
+      .map(|p| p.language_id)
+      .unwrap_or(post.language_id);
+    let language_id = Some(data.language_id.unwrap_or(parent_language));
+
     let comment_form = CommentForm {
       content: content_slurs_removed,
       post_id: data.post_id,
       creator_id: local_user_view.person.id,
+      language_id,
       ..CommentForm::default()
     };
 
diff --git a/crates/api_crud/src/comment/update.rs b/crates/api_crud/src/comment/update.rs
index 4939d5ab..3a56a23d 100644
--- a/crates/api_crud/src/comment/update.rs
+++ b/crates/api_crud/src/comment/update.rs
@@ -14,7 +14,10 @@ use lemmy_apub::protocol::activities::{
   create_or_update::comment::CreateOrUpdateComment,
   CreateOrUpdateType,
 };
-use lemmy_db_schema::source::comment::Comment;
+use lemmy_db_schema::{
+  source::comment::{Comment, CommentForm},
+  traits::Crud,
+};
 use lemmy_db_views::structs::CommentView;
 use lemmy_utils::{
   error::LemmyError,
@@ -48,7 +51,6 @@ 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(
@@ -65,7 +67,7 @@ impl PerformCrud for EditComment {
       return Err(LemmyError::from_message("no_comment_edit_allowed"));
     }
 
-    if let Some(distinguished) = data.distinguished {
+    if data.distinguished.is_some() {
       // Verify that only a mod or admin can distinguish a comment
       is_mod_or_admin(
         context.pool(),
@@ -73,24 +75,27 @@ impl PerformCrud for EditComment {
         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"))?;
+    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(conn, comment_id, &form)
+    })
+    .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();
diff --git a/crates/api_crud/src/post/create.rs b/crates/api_crud/src/post/create.rs
index ef74ece8..64a23827 100644
--- a/crates/api_crud/src/post/create.rs
+++ b/crates/api_crud/src/post/create.rs
@@ -90,7 +90,6 @@ impl PerformCrud for CreatePost {
     let (embed_title, embed_description, embed_video_url) = metadata_res
       .map(|u| (Some(u.title), Some(u.description), Some(u.embed_video_url)))
       .unwrap_or_default();
-
     let language_id = Some(
       data.language_id.unwrap_or(
         blocking(context.pool(), move |conn| {
diff --git a/crates/api_crud/src/post/update.rs b/crates/api_crud/src/post/update.rs
index d96a12d5..3cf36d30 100644
--- a/crates/api_crud/src/post/update.rs
+++ b/crates/api_crud/src/post/update.rs
@@ -1,3 +1,4 @@
+use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
   post::{EditPost, PostResponse},
@@ -14,10 +15,7 @@ use lemmy_apub::protocol::activities::{
   CreateOrUpdateType,
 };
 use lemmy_db_schema::{
-  source::{
-    language::Language,
-    post::{Post, PostForm},
-  },
+  source::post::{Post, PostForm},
   traits::Crud,
   utils::{diesel_option_overwrite, naive_now},
 };
@@ -28,8 +26,6 @@ use lemmy_utils::{
 };
 use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperationCrud};
 
-use crate::PerformCrud;
-
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for EditPost {
   type Response = PostResponse;
@@ -85,15 +81,6 @@ impl PerformCrud for EditPost {
       .map(|u| (Some(u.title), Some(u.description), Some(u.embed_video_url)))
       .unwrap_or_default();
 
-    let language_id = Some(
-      data.language_id.unwrap_or(
-        blocking(context.pool(), move |conn| {
-          Language::read_undetermined(conn)
-        })
-        .await??,
-      ),
-    );
-
     let post_form = PostForm {
       creator_id: orig_post.creator_id.to_owned(),
       community_id: orig_post.community_id,
@@ -105,7 +92,7 @@ impl PerformCrud for EditPost {
       embed_title,
       embed_description,
       embed_video_url,
-      language_id,
+      language_id: data.language_id,
       thumbnail_url: Some(thumbnail_url),
       ..PostForm::default()
     };
diff --git a/crates/db_schema/src/impls/comment.rs b/crates/db_schema/src/impls/comment.rs
index 1a145809..5eaedcb9 100644
--- a/crates/db_schema/src/impls/comment.rs
+++ b/crates/db_schema/src/impls/comment.rs
@@ -75,28 +75,6 @@ impl Comment {
       .get_results::<Self>(conn)
   }
 
-  pub fn update_content(
-    conn: &PgConnection,
-    comment_id: CommentId,
-    new_content: &str,
-  ) -> Result<Self, Error> {
-    use crate::schema::comment::dsl::*;
-    diesel::update(comment.find(comment_id))
-      .set((content.eq(new_content), updated.eq(naive_now())))
-      .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,
diff --git a/scripts/test.sh b/scripts/test.sh
index 71a8b8ee..61a6ad48 100755
--- a/scripts/test.sh
+++ b/scripts/test.sh
@@ -9,5 +9,5 @@ export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy
 # so to load the config we need to traverse to the repo root
 export LEMMY_CONFIG_LOCATION=../../config/config.hjson
 RUST_BACKTRACE=1 \
-  cargo test -p lemmy_db_views --no-fail-fast --all-features -- --nocapture
+  cargo test --workspace --no-fail-fast --all-features
 # Add this to do printlns: -- --nocapture
-- 
2.44.1