X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapi_crud%2Fsrc%2Fcomment%2Fupdate.rs;h=558965f62fd8ac67434f152c6a4383792b7bb224;hb=3471f3533cb724b2cf6953d563aadfcc9f66c1d2;hp=46d99e936785470bf73812012440814644fb14c0;hpb=249fcc5066c30158eb3a3094a21ff5e021534cd2;p=lemmy.git diff --git a/crates/api_crud/src/comment/update.rs b/crates/api_crud/src/comment/update.rs index 46d99e93..558965f6 100644 --- a/crates/api_crud/src/comment/update.rs +++ b/crates/api_crud/src/comment/update.rs @@ -1,103 +1,106 @@ 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, + build_response::{build_comment_response, send_local_notifs}, + comment::{CommentResponse, EditComment}, + context::LemmyContext, + utils::{ + check_community_ban, + local_site_to_slur_regex, + local_user_view_from_jwt, + sanitize_html_opt, + }, }; -use lemmy_apub::ApubObjectType; -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, CommentUpdateForm}, + local_site::LocalSite, + }, + traits::Crud, + utils::naive_now, +}; +use lemmy_db_views::structs::CommentView; use lemmy_utils::{ - utils::{remove_slurs, scrape_text_for_mentions}, - ApiError, - ConnectionId, - LemmyError, + error::{LemmyError, LemmyErrorExt, LemmyErrorType}, + utils::{ + mention::scrape_text_for_mentions, + slurs::remove_slurs, + validation::is_valid_body_field, + }, }; -use lemmy_websocket::{messages::SendComment, LemmyContext, UserOperation}; #[async_trait::async_trait(?Send)] impl PerformCrud for EditComment { type Response = CommentResponse; - async fn perform( - &self, - context: &Data, - websocket_id: Option, - ) -> Result { - let data: &EditComment = &self; - let local_user_view = get_local_user_view_from_jwt(&data.auth, context.pool()).await?; + #[tracing::instrument(skip(context))] + async fn perform(&self, context: &Data) -> Result { + let data: &EditComment = self; + let local_user_view = local_user_view_from_jwt(&data.auth, context).await?; + let local_site = LocalSite::read(&mut context.pool()).await?; let comment_id = data.comment_id; - let orig_comment = blocking(context.pool(), move |conn| { - CommentView::read(&conn, comment_id, None) - }) - .await??; + let orig_comment = CommentView::read(&mut context.pool(), comment_id, None).await?; check_community_ban( local_user_view.person.id, orig_comment.community.id, - context.pool(), + &mut context.pool(), ) .await?; // 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(LemmyErrorType::NoCommentEditAllowed)?; } - // Do the update - let content_slurs_removed = remove_slurs(&data.content.to_owned()); - let comment_id = data.comment_id; - let updated_comment = match blocking(context.pool(), move |conn| { - Comment::update_content(conn, comment_id, &content_slurs_removed) - }) - .await? - { - Ok(comment) => comment, - Err(_e) => return Err(ApiError::err("couldnt_update_comment").into()), - }; + let language_id = self.language_id; + CommunityLanguage::is_allowed_community_language( + &mut context.pool(), + language_id, + orig_comment.community.id, + ) + .await?; + + // Update the Content + let content = data + .content + .as_ref() + .map(|c| remove_slurs(c, &local_site_to_slur_regex(&local_site))); + is_valid_body_field(&content, false)?; + let content = sanitize_html_opt(&content); - // Send the apub update - updated_comment - .send_update(&local_user_view.person, context) - .await?; + let comment_id = data.comment_id; + let form = CommentUpdateForm::builder() + .content(content) + .language_id(data.language_id) + .updated(Some(Some(naive_now()))) + .build(); + let updated_comment = Comment::update(&mut context.pool(), comment_id, &form) + .await + .with_lemmy_type(LemmyErrorType::CouldntUpdateComment)?; // Do the mentions / recipients - let updated_comment_content = updated_comment.content.to_owned(); + let updated_comment_content = updated_comment.content.clone(); 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, ) .await?; - let comment_id = data.comment_id; - let person_id = local_user_view.person.id; - let comment_view = blocking(context.pool(), move |conn| { - CommentView::read(conn, comment_id, Some(person_id)) - }) - .await??; - - let res = CommentResponse { - comment_view, + build_comment_response( + context, + updated_comment.id, + Some(local_user_view), + self.form_id.clone(), recipient_ids, - form_id: data.form_id.to_owned(), - }; - - context.chat_server().do_send(SendComment { - op: UserOperation::EditComment, - comment: res.clone(), - websocket_id, - }); - - Ok(res) + ) + .await } }