]> Untitled Git - lemmy.git/blob - crates/api_crud/src/comment/delete.rs
Rewrite some federation actions to remove Perform/SendActivity (ref #3670) (#3758)
[lemmy.git] / crates / api_crud / src / comment / delete.rs
1 use activitypub_federation::config::Data;
2 use actix_web::web::Json;
3 use lemmy_api_common::{
4   build_response::{build_comment_response, send_local_notifs},
5   comment::{CommentResponse, DeleteComment},
6   context::LemmyContext,
7   send_activity::{ActivityChannel, SendActivityData},
8   utils::{check_community_ban, local_user_view_from_jwt},
9 };
10 use lemmy_db_schema::{
11   source::{
12     comment::{Comment, CommentUpdateForm},
13     post::Post,
14   },
15   traits::Crud,
16 };
17 use lemmy_db_views::structs::CommentView;
18 use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType};
19
20 #[tracing::instrument(skip(context))]
21 pub async fn delete_comment(
22   data: Json<DeleteComment>,
23   context: Data<LemmyContext>,
24 ) -> Result<Json<CommentResponse>, LemmyError> {
25   let local_user_view = local_user_view_from_jwt(&data.auth, &context).await?;
26
27   let comment_id = data.comment_id;
28   let orig_comment = CommentView::read(&mut context.pool(), comment_id, None).await?;
29
30   // Dont delete it if its already been deleted.
31   if orig_comment.comment.deleted == data.deleted {
32     return Err(LemmyErrorType::CouldntUpdateComment)?;
33   }
34
35   check_community_ban(
36     local_user_view.person.id,
37     orig_comment.community.id,
38     &mut context.pool(),
39   )
40   .await?;
41
42   // Verify that only the creator can delete
43   if local_user_view.person.id != orig_comment.creator.id {
44     return Err(LemmyErrorType::NoCommentEditAllowed)?;
45   }
46
47   // Do the delete
48   let deleted = data.deleted;
49   let updated_comment = Comment::update(
50     &mut context.pool(),
51     comment_id,
52     &CommentUpdateForm::builder().deleted(Some(deleted)).build(),
53   )
54   .await
55   .with_lemmy_type(LemmyErrorType::CouldntUpdateComment)?;
56
57   let post_id = updated_comment.post_id;
58   let post = Post::read(&mut context.pool(), post_id).await?;
59   let recipient_ids = send_local_notifs(
60     vec![],
61     &updated_comment,
62     &local_user_view.person,
63     &post,
64     false,
65     &context,
66   )
67   .await?;
68   let updated_comment_id = updated_comment.id;
69
70   ActivityChannel::submit_activity(
71     SendActivityData::DeleteComment(
72       updated_comment,
73       local_user_view.person.clone(),
74       orig_comment.community,
75     ),
76     &context,
77   )
78   .await?;
79
80   Ok(Json(
81     build_comment_response(
82       &context,
83       updated_comment_id,
84       Some(local_user_view),
85       None,
86       recipient_ids,
87     )
88     .await?,
89   ))
90 }