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;