From 8c6e259133c00261245fde14cca5301bdf596fa7 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Fri, 15 May 2026 04:08:40 +0200 Subject: [PATCH] feat(application): federation management use cases --- .../src/use_cases/federation_management.rs | 106 ++++++++++++++++++ crates/application/src/use_cases/mod.rs | 1 + 2 files changed, 107 insertions(+) create mode 100644 crates/application/src/use_cases/federation_management.rs diff --git a/crates/application/src/use_cases/federation_management.rs b/crates/application/src/use_cases/federation_management.rs new file mode 100644 index 0000000..300c742 --- /dev/null +++ b/crates/application/src/use_cases/federation_management.rs @@ -0,0 +1,106 @@ +use domain::{ + errors::DomainError, models::remote_actor::RemoteActor, ports::FederationActionPort, + value_objects::UserId, +}; + +pub async fn list_pending_requests( + federation: &dyn FederationActionPort, + user_id: &UserId, +) -> Result, DomainError> { + federation.get_pending_followers(user_id).await +} + +pub async fn accept_follow_request( + federation: &dyn FederationActionPort, + user_id: &UserId, + actor_url: &str, +) -> Result<(), DomainError> { + federation.accept_follow_request(user_id, actor_url).await +} + +pub async fn reject_follow_request( + federation: &dyn FederationActionPort, + user_id: &UserId, + actor_url: &str, +) -> Result<(), DomainError> { + federation.reject_follow_request(user_id, actor_url).await +} + +pub async fn list_remote_followers( + federation: &dyn FederationActionPort, + user_id: &UserId, +) -> Result, DomainError> { + federation.get_remote_followers(user_id).await +} + +pub async fn remove_remote_follower( + federation: &dyn FederationActionPort, + user_id: &UserId, + actor_url: &str, +) -> Result<(), DomainError> { + federation.remove_remote_follower(user_id, actor_url).await +} + +pub async fn list_remote_following( + federation: &dyn FederationActionPort, + user_id: &UserId, +) -> Result, DomainError> { + federation.get_remote_following(user_id).await +} + +#[cfg(test)] +mod tests { + use super::*; + use domain::testing::TestStore; + + #[tokio::test] + async fn list_pending_returns_empty_by_default() { + let store = TestStore::default(); + let uid = UserId::new(); + let result = list_pending_requests(&store, &uid).await.unwrap(); + assert!(result.is_empty()); + } + + #[tokio::test] + async fn accept_follow_request_returns_ok() { + let store = TestStore::default(); + let uid = UserId::new(); + accept_follow_request(&store, &uid, "https://mastodon.social/users/alice") + .await + .unwrap(); + } + + #[tokio::test] + async fn reject_follow_request_returns_ok() { + let store = TestStore::default(); + let uid = UserId::new(); + reject_follow_request(&store, &uid, "https://mastodon.social/users/alice") + .await + .unwrap(); + } + + #[tokio::test] + async fn list_remote_followers_returns_empty_by_default() { + let store = TestStore::default(); + let uid = UserId::new(); + let result = list_remote_followers(&store, &uid).await.unwrap(); + assert!(result.is_empty()); + } + + #[tokio::test] + async fn remove_remote_follower_returns_ok() { + let store = TestStore::default(); + let uid = UserId::new(); + remove_remote_follower(&store, &uid, "https://mastodon.social/users/alice") + .await + .unwrap(); + } + + #[tokio::test] + async fn list_remote_following_returns_empty_by_default() { + let store = TestStore::default(); + let uid = UserId::new(); + let result = list_remote_following(&store, &uid).await.unwrap(); + assert!(result.is_empty()); + } +} diff --git a/crates/application/src/use_cases/mod.rs b/crates/application/src/use_cases/mod.rs index ad33883..c8c4862 100644 --- a/crates/application/src/use_cases/mod.rs +++ b/crates/application/src/use_cases/mod.rs @@ -1,5 +1,6 @@ pub mod api_keys; pub mod auth; +pub mod federation_management; pub mod feed; pub mod notifications; pub mod profile;