From fce819be7fe75ec9facd8712d24996aaeabb6b68 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Thu, 14 May 2026 19:59:19 +0200 Subject: [PATCH] feat(activitypub-base): impl FederationActionPort for ActivityPubService --- .../adapters/activitypub-base/src/service.rs | 36 +++++++++++++++++++ .../activitypub-base/src/tests/service.rs | 6 ++++ 2 files changed, 42 insertions(+) diff --git a/crates/adapters/activitypub-base/src/service.rs b/crates/adapters/activitypub-base/src/service.rs index 6149bc1..fe517ec 100644 --- a/crates/adapters/activitypub-base/src/service.rs +++ b/crates/adapters/activitypub-base/src/service.rs @@ -1330,6 +1330,42 @@ impl domain::ports::OutboundFederationPort for ActivityPubService { } } +#[async_trait::async_trait] +impl domain::ports::FederationActionPort for ActivityPubService { + async fn lookup_actor( + &self, + handle: &str, + ) -> Result { + let data = self.federation_config.to_request_data(); + let actor: crate::actors::DbActor = + webfinger_resolve_actor(handle, &data) + .await + .map_err(|e: crate::error::Error| { + domain::errors::DomainError::ExternalService(e.to_string()) + })?; + Ok(domain::models::remote_actor::RemoteActor { + url: actor.ap_id.to_string(), + handle: actor.username.clone(), + display_name: actor.bio.clone(), + inbox_url: actor.inbox_url.to_string(), + shared_inbox_url: None, + public_key: actor.public_key_pem.clone(), + avatar_url: actor.avatar_url.as_ref().map(|u| u.to_string()), + last_fetched_at: actor.last_refreshed_at, + }) + } + + async fn follow_remote( + &self, + local_user_id: &domain::value_objects::UserId, + handle: &str, + ) -> Result<(), domain::errors::DomainError> { + self.follow(local_user_id.as_uuid(), handle) + .await + .map_err(|e| domain::errors::DomainError::ExternalService(e.to_string())) + } +} + #[cfg(test)] #[path = "tests/service.rs"] mod tests; diff --git a/crates/adapters/activitypub-base/src/tests/service.rs b/crates/adapters/activitypub-base/src/tests/service.rs index 336f589..b0b4752 100644 --- a/crates/adapters/activitypub-base/src/tests/service.rs +++ b/crates/adapters/activitypub-base/src/tests/service.rs @@ -1,3 +1,9 @@ +fn _assert_impl_federation_action_port() +where + crate::service::ActivityPubService: domain::ports::FederationActionPort, +{ +} + use super::*; use crate::repository::{Follower, FollowerStatus, RemoteActor};