X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapi_crud%2Fsrc%2Fcomment%2Fupdate.rs;h=558965f62fd8ac67434f152c6a4383792b7bb224;hb=3471f3533cb724b2cf6953d563aadfcc9f66c1d2;hp=b0892c58c538c027a08aa45c63e10ec112645696;hpb=2402515fccee0c6ee79ed8e1fecf6b0449efa2c4;p=lemmy.git diff --git a/crates/api_crud/src/comment/update.rs b/crates/api_crud/src/comment/update.rs index b0892c58..558965f6 100644 --- a/crates/api_crud/src/comment/update.rs +++ b/crates/api_crud/src/comment/update.rs @@ -1,104 +1,105 @@ use crate::PerformCrud; use actix_web::web::Data; use lemmy_api_common::{ - blocking, - check_community_ban, - check_community_deleted_or_removed, - check_post_deleted_or_removed, - 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::activities::{ - comment::create_or_update::CreateOrUpdateComment, - CreateOrUpdateType, +use lemmy_db_schema::{ + source::{ + actor_language::CommunityLanguage, + comment::{Comment, CommentUpdateForm}, + local_site::LocalSite, + }, + traits::Crud, + utils::naive_now, }; -use lemmy_db_queries::source::comment::Comment_; -use lemmy_db_schema::source::comment::*; -use lemmy_db_views::comment_view::CommentView; +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::{send::send_comment_ws_message, LemmyContext, UserOperationCrud}; #[async_trait::async_trait(?Send)] impl PerformCrud for EditComment { type Response = CommentResponse; - async fn perform( - &self, - context: &Data, - websocket_id: Option, - ) -> Result { + #[tracing::instrument(skip(context))] + async fn perform(&self, context: &Data) -> Result { let data: &EditComment = self; - let local_user_view = - get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; + 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?; - // TODO is this necessary? It should really only need to check on create check_community_ban( local_user_view.person.id, orig_comment.community.id, - context.pool(), + &mut 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_plain("no_comment_edit_allowed").into()); + return Err(LemmyErrorType::NoCommentEditAllowed)?; } - // 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| ApiError::err("couldnt_update_comment", e))?; - - // Send the apub update - CreateOrUpdateComment::send( - &updated_comment, - &local_user_view.person, - CreateOrUpdateType::Update, - context, + 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); + + 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.settings(), + context, ) .await?; - send_comment_ws_message( - data.comment_id, - UserOperationCrud::EditComment, - websocket_id, - data.form_id.to_owned(), - None, - recipient_ids, + build_comment_response( context, + updated_comment.id, + Some(local_user_view), + self.form_id.clone(), + recipient_ids, ) .await }