]> Untitled Git - lemmy.git/blobdiff - crates/apub/src/protocol/mod.rs
Cache & Optimize Woodpecker CI (#3450)
[lemmy.git] / crates / apub / src / protocol / mod.rs
index ea56cda1f00e2ca505a78bec089d2e7ba6fdc407..dba21f99d346d016ce11b8a945f0b83826d8ca61 100644 (file)
@@ -1,7 +1,14 @@
-use activitystreams_kinds::object::ImageType;
-use lemmy_apub_lib::values::MediaTypeMarkdown;
+use crate::objects::community::ApubCommunity;
+use activitypub_federation::{
+  config::Data,
+  fetch::fetch_object_http,
+  kinds::object::ImageType,
+  protocol::values::MediaTypeMarkdown,
+};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::newtypes::DbUrl;
-use serde::{Deserialize, Serialize};
+use lemmy_utils::error::LemmyError;
+use serde::{de::DeserializeOwned, Deserialize, Serialize};
 use std::collections::HashMap;
 use url::Url;
 
@@ -42,15 +49,52 @@ impl ImageObject {
   }
 }
 
-#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Debug, Default, Deserialize, Serialize)]
 #[serde(transparent)]
 pub struct Unparsed(HashMap<String, serde_json::Value>);
 
+pub(crate) trait Id {
+  fn object_id(&self) -> &Url;
+}
+
+#[derive(Clone, Debug, Deserialize, Serialize)]
+#[serde(untagged)]
+pub(crate) enum IdOrNestedObject<Kind: Id> {
+  Id(Url),
+  NestedObject(Kind),
+}
+
+impl<Kind: Id + DeserializeOwned + Send> IdOrNestedObject<Kind> {
+  pub(crate) fn id(&self) -> &Url {
+    match self {
+      IdOrNestedObject::Id(i) => i,
+      IdOrNestedObject::NestedObject(n) => n.object_id(),
+    }
+  }
+  pub(crate) async fn object(self, context: &Data<LemmyContext>) -> Result<Kind, LemmyError> {
+    match self {
+      // TODO: move IdOrNestedObject struct to library and make fetch_object_http private
+      IdOrNestedObject::Id(i) => Ok(fetch_object_http(&i, context).await?),
+      IdOrNestedObject::NestedObject(o) => Ok(o),
+    }
+  }
+}
+
+#[async_trait::async_trait]
+pub trait InCommunity {
+  // TODO: after we use audience field and remove backwards compat, it should be possible to change
+  //       this to simply `fn community(&self)  -> Result<ObjectId<ApubCommunity>, LemmyError>`
+  async fn community(&self, context: &Data<LemmyContext>) -> Result<ApubCommunity, LemmyError>;
+}
+
 #[cfg(test)]
 pub(crate) mod tests {
-  use crate::context::WithContext;
+  #![allow(clippy::unwrap_used)]
+  #![allow(clippy::indexing_slicing)]
+
+  use activitypub_federation::protocol::context::WithContext;
   use assert_json_diff::assert_json_include;
-  use lemmy_utils::LemmyError;
+  use lemmy_utils::error::LemmyError;
   use serde::{de::DeserializeOwned, Serialize};
   use std::{collections::HashMap, fs::File, io::BufReader};