objects::{community::ApubCommunity, person::ApubPerson},
protocol::objects::{group::Group, person::Person},
};
-use activitystreams::{chrono::NaiveDateTime, url::Url};
-use lemmy_apub_lib::traits::{ActorType, ApubObject};
-use lemmy_utils::LemmyError;
+use activitypub_federation::traits::{Actor, ApubObject};
+use chrono::NaiveDateTime;
+use lemmy_utils::error::LemmyError;
use lemmy_websocket::LemmyContext;
-use serde::Deserialize;
+use serde::{Deserialize, Serialize};
+use url::Url;
#[derive(Clone, Debug)]
pub enum UserOrCommunity {
Community(ApubCommunity),
}
-#[derive(Deserialize)]
+#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(untagged)]
pub enum PersonOrGroup {
Person(Person),
Group(Group),
}
+#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
+pub enum PersonOrGroupType {
+ Person,
+ Group,
+}
+
#[async_trait::async_trait(?Send)]
impl ApubObject for UserOrCommunity {
type DataType = LemmyContext;
type ApubType = PersonOrGroup;
- type TombstoneType = ();
+ type DbType = ();
+ type Error = LemmyError;
fn last_refreshed_at(&self) -> Option<NaiveDateTime> {
Some(match self {
})
}
+ #[tracing::instrument(skip_all)]
async fn read_from_apub_id(
object_id: Url,
data: &Self::DataType,
})
}
+ #[tracing::instrument(skip_all)]
async fn delete(self, data: &Self::DataType) -> Result<(), LemmyError> {
match self {
UserOrCommunity::User(p) => p.delete(data).await,
}
}
- async fn to_apub(&self, _data: &Self::DataType) -> Result<Self::ApubType, LemmyError> {
+ async fn into_apub(self, _data: &Self::DataType) -> Result<Self::ApubType, LemmyError> {
unimplemented!()
}
- fn to_tombstone(&self) -> Result<Self::TombstoneType, LemmyError> {
- unimplemented!()
+ #[tracing::instrument(skip_all)]
+ async fn verify(
+ apub: &Self::ApubType,
+ expected_domain: &Url,
+ data: &Self::DataType,
+ request_counter: &mut i32,
+ ) -> Result<(), LemmyError> {
+ match apub {
+ PersonOrGroup::Person(a) => {
+ ApubPerson::verify(a, expected_domain, data, request_counter).await
+ }
+ PersonOrGroup::Group(a) => {
+ ApubCommunity::verify(a, expected_domain, data, request_counter).await
+ }
+ }
}
+ #[tracing::instrument(skip_all)]
async fn from_apub(
- apub: &Self::ApubType,
+ apub: Self::ApubType,
data: &Self::DataType,
- expected_domain: &Url,
request_counter: &mut i32,
) -> Result<Self, LemmyError> {
Ok(match apub {
- PersonOrGroup::Person(p) => UserOrCommunity::User(
- ApubPerson::from_apub(p, data, expected_domain, request_counter).await?,
- ),
- PersonOrGroup::Group(p) => UserOrCommunity::Community(
- ApubCommunity::from_apub(p, data, expected_domain, request_counter).await?,
- ),
+ PersonOrGroup::Person(p) => {
+ UserOrCommunity::User(ApubPerson::from_apub(p, data, request_counter).await?)
+ }
+ PersonOrGroup::Group(p) => {
+ UserOrCommunity::Community(ApubCommunity::from_apub(p, data, request_counter).await?)
+ }
})
}
}
-impl ActorType for UserOrCommunity {
- fn is_local(&self) -> bool {
- todo!()
- }
-
- fn actor_id(&self) -> Url {
- todo!()
- }
-
- fn name(&self) -> String {
- todo!()
- }
-
- fn public_key(&self) -> Option<String> {
+impl Actor for UserOrCommunity {
+ fn public_key(&self) -> &str {
match self {
UserOrCommunity::User(p) => p.public_key(),
UserOrCommunity::Community(p) => p.public_key(),
}
}
- fn private_key(&self) -> Option<String> {
- todo!()
- }
-
- fn inbox_url(&self) -> Url {
- todo!()
- }
-
- fn shared_inbox_url(&self) -> Option<Url> {
- todo!()
+ fn inbox(&self) -> Url {
+ unimplemented!()
}
}