]> Untitled Git - lemmy.git/blob - crates/apub/src/fetcher/deletable_apub_object.rs
Rewrite fetcher (#1792)
[lemmy.git] / crates / apub / src / fetcher / deletable_apub_object.rs
1 use crate::fetcher::post_or_comment::PostOrComment;
2 use lemmy_api_common::blocking;
3 use lemmy_db_queries::source::{
4   comment::Comment_,
5   community::Community_,
6   person::Person_,
7   post::Post_,
8 };
9 use lemmy_db_schema::source::{comment::Comment, community::Community, person::Person, post::Post};
10 use lemmy_utils::LemmyError;
11 use lemmy_websocket::LemmyContext;
12
13 // TODO: merge this trait with ApubObject (means that db_schema needs to depend on apub_lib)
14 #[async_trait::async_trait(?Send)]
15 pub trait DeletableApubObject {
16   // TODO: pass in tombstone with summary field, to decide between remove/delete
17   async fn delete(self, context: &LemmyContext) -> Result<(), LemmyError>;
18 }
19
20 #[async_trait::async_trait(?Send)]
21 impl DeletableApubObject for Community {
22   async fn delete(self, context: &LemmyContext) -> Result<(), LemmyError> {
23     let id = self.id;
24     blocking(context.pool(), move |conn| {
25       Community::update_deleted(conn, id, true)
26     })
27     .await??;
28     Ok(())
29   }
30 }
31
32 #[async_trait::async_trait(?Send)]
33 impl DeletableApubObject for Person {
34   async fn delete(self, context: &LemmyContext) -> Result<(), LemmyError> {
35     let id = self.id;
36     blocking(context.pool(), move |conn| Person::delete_account(conn, id)).await??;
37     Ok(())
38   }
39 }
40
41 #[async_trait::async_trait(?Send)]
42 impl DeletableApubObject for Post {
43   async fn delete(self, context: &LemmyContext) -> Result<(), LemmyError> {
44     let id = self.id;
45     blocking(context.pool(), move |conn| {
46       Post::update_deleted(conn, id, true)
47     })
48     .await??;
49     Ok(())
50   }
51 }
52
53 #[async_trait::async_trait(?Send)]
54 impl DeletableApubObject for Comment {
55   async fn delete(self, context: &LemmyContext) -> Result<(), LemmyError> {
56     let id = self.id;
57     blocking(context.pool(), move |conn| {
58       Comment::update_deleted(conn, id, true)
59     })
60     .await??;
61     Ok(())
62   }
63 }
64
65 #[async_trait::async_trait(?Send)]
66 impl DeletableApubObject for PostOrComment {
67   async fn delete(self, context: &LemmyContext) -> Result<(), LemmyError> {
68     match self {
69       PostOrComment::Comment(c) => {
70         blocking(context.pool(), move |conn| {
71           Comment::update_deleted(conn, c.id, true)
72         })
73         .await??;
74       }
75       PostOrComment::Post(p) => {
76         blocking(context.pool(), move |conn| {
77           Post::update_deleted(conn, p.id, true)
78         })
79         .await??;
80       }
81     }
82
83     Ok(())
84   }
85 }