X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapi_crud%2Fsrc%2Fcomment%2Fremove.rs;h=c18a8c5b7486f24ce217435cbf8cc732781c5941;hb=f7f6766650b9b573a72075e564aed353c0131cd7;hp=c866eca3dfc239fc9413ebea56b0db362e11f051;hpb=5d837780f5d149cb8d3b861c63a7dc4466a7cbf1;p=lemmy.git diff --git a/crates/api_crud/src/comment/remove.rs b/crates/api_crud/src/comment/remove.rs index c866eca3..c18a8c5b 100644 --- a/crates/api_crud/src/comment/remove.rs +++ b/crates/api_crud/src/comment/remove.rs @@ -1,114 +1,105 @@ -use crate::PerformCrud; -use actix_web::web::Data; +use activitypub_federation::config::Data; +use actix_web::web::Json; use lemmy_api_common::{ + build_response::{build_comment_response, send_local_notifs}, comment::{CommentResponse, RemoveComment}, - utils::{check_community_ban, get_local_user_view_from_jwt, is_mod_or_admin}, + context::LemmyContext, + send_activity::{ActivityChannel, SendActivityData}, + utils::{check_community_ban, is_mod_or_admin, local_user_view_from_jwt}, }; -use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects}; use lemmy_db_schema::{ source::{ comment::{Comment, CommentUpdateForm}, - community::Community, + comment_report::CommentReport, moderator::{ModRemoveComment, ModRemoveCommentForm}, post::Post, }, - traits::Crud, + traits::{Crud, Reportable}, }; use lemmy_db_views::structs::CommentView; -use lemmy_utils::{error::LemmyError, ConnectionId}; -use lemmy_websocket::{ - send::{send_comment_ws_message, send_local_notifs}, - LemmyContext, - UserOperationCrud, -}; +use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType}; -#[async_trait::async_trait(?Send)] -impl PerformCrud for RemoveComment { - type Response = CommentResponse; +#[tracing::instrument(skip(context))] +pub async fn remove_comment( + data: Json, + context: Data, +) -> Result, LemmyError> { + let local_user_view = local_user_view_from_jwt(&data.auth, &context).await?; - #[tracing::instrument(skip(context, websocket_id))] - async fn perform( - &self, - context: &Data, - websocket_id: Option, - ) -> Result { - let data: &RemoveComment = self; - let local_user_view = - get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; + let comment_id = data.comment_id; + let orig_comment = CommentView::read(&mut context.pool(), comment_id, None).await?; - let comment_id = data.comment_id; - let orig_comment = CommentView::read(context.pool(), comment_id, None).await?; + check_community_ban( + local_user_view.person.id, + orig_comment.community.id, + &mut context.pool(), + ) + .await?; - check_community_ban( - local_user_view.person.id, - orig_comment.community.id, - context.pool(), - ) - .await?; + // Verify that only a mod or admin can remove + is_mod_or_admin( + &mut context.pool(), + local_user_view.person.id, + orig_comment.community.id, + ) + .await?; - // Verify that only a mod or admin can remove - is_mod_or_admin( - context.pool(), - local_user_view.person.id, - orig_comment.community.id, - ) + // Do the remove + let removed = data.removed; + let updated_comment = Comment::update( + &mut context.pool(), + comment_id, + &CommentUpdateForm { + removed: Some(removed), + ..Default::default() + }, + ) + .await + .with_lemmy_type(LemmyErrorType::CouldntUpdateComment)?; + + CommentReport::resolve_all_for_object(&mut context.pool(), comment_id, local_user_view.person.id) .await?; - // Do the remove - let removed = data.removed; - let updated_comment = Comment::update( - context.pool(), - comment_id, - &CommentUpdateForm::builder().removed(Some(removed)).build(), - ) - .await - .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?; + // Mod tables + let form = ModRemoveCommentForm { + mod_person_id: local_user_view.person.id, + comment_id: data.comment_id, + removed: Some(removed), + reason: data.reason.clone(), + }; + ModRemoveComment::create(&mut context.pool(), &form).await?; - // Mod tables - let form = ModRemoveCommentForm { - mod_person_id: local_user_view.person.id, - comment_id: data.comment_id, - removed: Some(removed), - reason: data.reason.to_owned(), - }; - ModRemoveComment::create(context.pool(), &form).await?; + let post_id = updated_comment.post_id; + let post = Post::read(&mut context.pool(), post_id).await?; + let recipient_ids = send_local_notifs( + vec![], + &updated_comment, + &local_user_view.person.clone(), + &post, + false, + &context, + ) + .await?; + let updated_comment_id = updated_comment.id; - let post_id = updated_comment.post_id; - let post = Post::read(context.pool(), post_id).await?; - let recipient_ids = send_local_notifs( - vec![], - &updated_comment, - &local_user_view.person.clone(), - &post, - false, - context, - ) - .await?; + ActivityChannel::submit_activity( + SendActivityData::RemoveComment( + updated_comment, + local_user_view.person.clone(), + orig_comment.community, + data.reason.clone(), + ), + &context, + ) + .await?; - let res = send_comment_ws_message( - data.comment_id, - UserOperationCrud::RemoveComment, - websocket_id, - None, // TODO maybe this might clear other forms - Some(local_user_view.person.id), + Ok(Json( + build_comment_response( + &context, + updated_comment_id, + Some(local_user_view), recipient_ids, - context, ) - .await?; - - // Send the apub message - let community = Community::read(context.pool(), orig_comment.post.community_id).await?; - let deletable = DeletableObjects::Comment(Box::new(updated_comment.clone().into())); - send_apub_delete_in_community( - local_user_view.person, - community, - deletable, - data.reason.clone().or_else(|| Some("".to_string())), - removed, - context, - ) - .await?; - - Ok(res) - } + .await?, + )) }