2 fetcher::fetch::fetch_remote_object,
3 objects::{comment::Note, post::Page, FromApub},
7 use diesel::result::Error::NotFound;
8 use lemmy_api_common::blocking;
9 use lemmy_db_queries::{ApubObject, Crud};
10 use lemmy_db_schema::source::{comment::Comment, post::Post};
11 use lemmy_utils::LemmyError;
12 use lemmy_websocket::LemmyContext;
16 /// Gets a post by its apub ID. If it exists locally, it is returned directly. Otherwise it is
17 /// pulled from its apub ID, inserted and returned.
19 /// The parent community is also pulled if necessary. Comments are not pulled.
20 pub async fn get_or_fetch_and_insert_post(
22 context: &LemmyContext,
23 recursion_counter: &mut i32,
24 ) -> Result<Post, LemmyError> {
25 let post_ap_id_owned = post_ap_id.to_owned();
26 let post = blocking(context.pool(), move |conn| {
27 Post::read_from_apub_id(conn, &post_ap_id_owned.into())
34 debug!("Fetching and creating remote post: {}", post_ap_id);
36 fetch_remote_object::<Page>(context.client(), post_ap_id, recursion_counter).await?;
37 let post = Post::from_apub(
40 post_ap_id.to_owned(),
48 Err(e) => Err(e.into()),
52 /// Gets a comment by its apub ID. If it exists locally, it is returned directly. Otherwise it is
53 /// pulled from its apub ID, inserted and returned.
55 /// The parent community, post and comment are also pulled if necessary.
56 pub async fn get_or_fetch_and_insert_comment(
58 context: &LemmyContext,
59 recursion_counter: &mut i32,
60 ) -> Result<Comment, LemmyError> {
61 let comment_ap_id_owned = comment_ap_id.to_owned();
62 let comment = blocking(context.pool(), move |conn| {
63 Comment::read_from_apub_id(conn, &comment_ap_id_owned.into())
71 "Fetching and creating remote comment and its parents: {}",
75 fetch_remote_object::<Note>(context.client(), comment_ap_id, recursion_counter).await?;
76 let comment = Comment::from_apub(
79 comment_ap_id.to_owned(),
85 let post_id = comment.post_id;
86 let post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??;
88 return Err(anyhow!("Post is locked").into());
93 Err(e) => Err(e.into()),
97 pub async fn get_or_fetch_and_insert_post_or_comment(
99 context: &LemmyContext,
100 recursion_counter: &mut i32,
101 ) -> Result<PostOrComment, LemmyError> {
103 match get_or_fetch_and_insert_post(ap_id, context, recursion_counter).await {
104 Ok(p) => PostOrComment::Post(Box::new(p)),
106 let c = get_or_fetch_and_insert_comment(ap_id, context, recursion_counter).await?;
107 PostOrComment::Comment(Box::new(c))