]> Untitled Git - lemmy.git/blob - crates/api_crud/src/comment/delete.rs
Merge pull request #2593 from LemmyNet/refactor-notifications
[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   comment::{CommentResponse, DeleteComment},
5   context::LemmyContext,
6   utils::{check_community_ban, get_local_user_view_from_jwt},
7   websocket::{
8     send::{send_comment_ws_message, send_local_notifs},
9     UserOperationCrud,
10   },
11 };
12 use lemmy_db_schema::{
13   source::{
14     comment::{Comment, CommentUpdateForm},
15     post::Post,
16   },
17   traits::Crud,
18 };
19 use lemmy_db_views::structs::CommentView;
20 use lemmy_utils::{error::LemmyError, ConnectionId};
21
22 #[async_trait::async_trait(?Send)]
23 impl PerformCrud for DeleteComment {
24   type Response = CommentResponse;
25
26   #[tracing::instrument(skip(context, websocket_id))]
27   async fn perform(
28     &self,
29     context: &Data<LemmyContext>,
30     websocket_id: Option<ConnectionId>,
31   ) -> Result<CommentResponse, LemmyError> {
32     let data: &DeleteComment = self;
33     let local_user_view =
34       get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
35
36     let comment_id = data.comment_id;
37     let orig_comment = CommentView::read(context.pool(), comment_id, None).await?;
38
39     // Dont delete it if its already been deleted.
40     if orig_comment.comment.deleted == data.deleted {
41       return Err(LemmyError::from_message("couldnt_update_comment"));
42     }
43
44     check_community_ban(
45       local_user_view.person.id,
46       orig_comment.community.id,
47       context.pool(),
48     )
49     .await?;
50
51     // Verify that only the creator can delete
52     if local_user_view.person.id != orig_comment.creator.id {
53       return Err(LemmyError::from_message("no_comment_edit_allowed"));
54     }
55
56     // Do the delete
57     let deleted = data.deleted;
58     let updated_comment = Comment::update(
59       context.pool(),
60       comment_id,
61       &CommentUpdateForm::builder().deleted(Some(deleted)).build(),
62     )
63     .await
64     .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
65
66     let post_id = updated_comment.post_id;
67     let post = Post::read(context.pool(), post_id).await?;
68     let recipient_ids = send_local_notifs(
69       vec![],
70       &updated_comment,
71       &local_user_view.person,
72       &post,
73       false,
74       context,
75     )
76     .await?;
77
78     let res = send_comment_ws_message(
79       data.comment_id,
80       UserOperationCrud::DeleteComment,
81       websocket_id,
82       None, // TODO a comment delete might clear forms?
83       Some(local_user_view.person.id),
84       recipient_ids,
85       context,
86     )
87     .await?;
88
89     Ok(res)
90   }
91 }