]> Untitled Git - lemmy.git/blob - crates/api_crud/src/post/delete.rs
Moving settings to Database. (#2492)
[lemmy.git] / crates / api_crud / src / post / delete.rs
1 use crate::PerformCrud;
2 use actix_web::web::Data;
3 use lemmy_api_common::{
4   post::{DeletePost, PostResponse},
5   utils::{
6     blocking,
7     check_community_ban,
8     check_community_deleted_or_removed,
9     get_local_user_view_from_jwt,
10   },
11 };
12 use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects};
13 use lemmy_db_schema::{
14   source::{
15     community::Community,
16     post::{Post, PostUpdateForm},
17   },
18   traits::Crud,
19 };
20 use lemmy_utils::{error::LemmyError, ConnectionId};
21 use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperationCrud};
22
23 #[async_trait::async_trait(?Send)]
24 impl PerformCrud for DeletePost {
25   type Response = PostResponse;
26
27   #[tracing::instrument(skip(context, websocket_id))]
28   async fn perform(
29     &self,
30     context: &Data<LemmyContext>,
31     websocket_id: Option<ConnectionId>,
32   ) -> Result<PostResponse, LemmyError> {
33     let data: &DeletePost = self;
34     let local_user_view =
35       get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
36
37     let post_id = data.post_id;
38     let orig_post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??;
39
40     // Dont delete it if its already been deleted.
41     if orig_post.deleted == data.deleted {
42       return Err(LemmyError::from_message("couldnt_update_post"));
43     }
44
45     check_community_ban(
46       local_user_view.person.id,
47       orig_post.community_id,
48       context.pool(),
49     )
50     .await?;
51     check_community_deleted_or_removed(orig_post.community_id, context.pool()).await?;
52
53     // Verify that only the creator can delete
54     if !Post::is_post_creator(local_user_view.person.id, orig_post.creator_id) {
55       return Err(LemmyError::from_message("no_post_edit_allowed"));
56     }
57
58     // Update the post
59     let post_id = data.post_id;
60     let deleted = data.deleted;
61     let updated_post = blocking(context.pool(), move |conn| {
62       Post::update(
63         conn,
64         post_id,
65         &PostUpdateForm::builder().deleted(Some(deleted)).build(),
66       )
67     })
68     .await??;
69
70     let res = send_post_ws_message(
71       data.post_id,
72       UserOperationCrud::DeletePost,
73       websocket_id,
74       Some(local_user_view.person.id),
75       context,
76     )
77     .await?;
78
79     // apub updates
80     let community = blocking(context.pool(), move |conn| {
81       Community::read(conn, orig_post.community_id)
82     })
83     .await??;
84     let deletable = DeletableObjects::Post(Box::new(updated_post.into()));
85     send_apub_delete_in_community(
86       local_user_view.person,
87       community,
88       deletable,
89       None,
90       deleted,
91       context,
92     )
93     .await?;
94     Ok(res)
95   }
96 }