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