]> Untitled Git - lemmy.git/blob - crates/api_crud/src/comment/delete.rs
Automatically resolve report when post/comment is removed (#3850)
[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 {
53       deleted: Some(deleted),
54       ..Default::default()
55     },
56   )
57   .await
58   .with_lemmy_type(LemmyErrorType::CouldntUpdateComment)?;
59
60   let post_id = updated_comment.post_id;
61   let post = Post::read(&mut context.pool(), post_id).await?;
62   let recipient_ids = send_local_notifs(
63     vec![],
64     &updated_comment,
65     &local_user_view.person,
66     &post,
67     false,
68     &context,
69   )
70   .await?;
71   let updated_comment_id = updated_comment.id;
72
73   ActivityChannel::submit_activity(
74     SendActivityData::DeleteComment(
75       updated_comment,
76       local_user_view.person.clone(),
77       orig_comment.community,
78     ),
79     &context,
80   )
81   .await?;
82
83   Ok(Json(
84     build_comment_response(
85       &context,
86       updated_comment_id,
87       Some(local_user_view),
88       recipient_ids,
89     )
90     .await?,
91   ))
92 }