2 objects::{comment::ApubComment, post::ApubPost},
3 protocol::objects::{note::Note, page::Page},
5 use chrono::NaiveDateTime;
6 use lemmy_apub_lib::traits::ApubObject;
7 use lemmy_utils::LemmyError;
8 use lemmy_websocket::LemmyContext;
9 use serde::Deserialize;
12 #[derive(Clone, Debug)]
13 pub enum PostOrComment {
15 Comment(Box<ApubComment>),
18 #[derive(Deserialize)]
25 #[async_trait::async_trait(?Send)]
26 impl ApubObject for PostOrComment {
27 type DataType = LemmyContext;
28 type ApubType = PageOrNote;
30 type TombstoneType = ();
32 fn last_refreshed_at(&self) -> Option<NaiveDateTime> {
36 // TODO: this can probably be implemented using a single sql query
37 #[tracing::instrument(skip_all)]
38 async fn read_from_apub_id(
40 data: &Self::DataType,
41 ) -> Result<Option<Self>, LemmyError> {
42 let post = ApubPost::read_from_apub_id(object_id.clone(), data).await?;
44 Some(o) => Some(PostOrComment::Post(Box::new(o))),
45 None => ApubComment::read_from_apub_id(object_id, data)
47 .map(|c| PostOrComment::Comment(Box::new(c))),
51 #[tracing::instrument(skip_all)]
52 async fn delete(self, data: &Self::DataType) -> Result<(), LemmyError> {
54 PostOrComment::Post(p) => p.delete(data).await,
55 PostOrComment::Comment(c) => c.delete(data).await,
59 async fn into_apub(self, _data: &Self::DataType) -> Result<Self::ApubType, LemmyError> {
63 fn to_tombstone(&self) -> Result<Self::TombstoneType, LemmyError> {
67 #[tracing::instrument(skip_all)]
69 apub: &Self::ApubType,
70 expected_domain: &Url,
71 data: &Self::DataType,
72 request_counter: &mut i32,
73 ) -> Result<(), LemmyError> {
75 PageOrNote::Page(a) => ApubPost::verify(a, expected_domain, data, request_counter).await,
76 PageOrNote::Note(a) => ApubComment::verify(a, expected_domain, data, request_counter).await,
80 #[tracing::instrument(skip_all)]
83 context: &LemmyContext,
84 request_counter: &mut i32,
85 ) -> Result<Self, LemmyError> {
87 PageOrNote::Page(p) => PostOrComment::Post(Box::new(
88 ApubPost::from_apub(p, context, request_counter).await?,
90 PageOrNote::Note(n) => PostOrComment::Comment(Box::new(
91 ApubComment::from_apub(n, context, request_counter).await?,
98 pub(crate) fn ap_id(&self) -> Url {
100 PostOrComment::Post(p) => p.ap_id.clone(),
101 PostOrComment::Comment(c) => c.ap_id.clone(),