diff --git a/crates/adapters/activitypub/src/lib.rs b/crates/adapters/activitypub/src/lib.rs index 64ae304..1a2bf53 100644 --- a/crates/adapters/activitypub/src/lib.rs +++ b/crates/adapters/activitypub/src/lib.rs @@ -33,7 +33,7 @@ pub type FederationRepos = ( std::sync::Arc, std::sync::Arc, std::sync::Arc, - std::sync::Arc, + std::sync::Arc, std::sync::Arc, std::sync::Arc, ); diff --git a/crates/adapters/activitypub/src/social_adapter.rs b/crates/adapters/activitypub/src/social_adapter.rs index f48b1ef..64c1b4e 100644 --- a/crates/adapters/activitypub/src/social_adapter.rs +++ b/crates/adapters/activitypub/src/social_adapter.rs @@ -275,10 +275,4 @@ impl SocialQuery for CompositeSocialAdapter { .map_err(ap_err)?; Ok(actors.into_iter().map(|a| a.url).collect()) } - - async fn list_all_followed_remote_actors( - &self, - ) -> Result, DomainError> { - Ok(vec![]) - } } diff --git a/crates/adapters/postgres-federation/src/social.rs b/crates/adapters/postgres-federation/src/social.rs index 28c60f5..47b8a34 100644 --- a/crates/adapters/postgres-federation/src/social.rs +++ b/crates/adapters/postgres-federation/src/social.rs @@ -1,26 +1,14 @@ use async_trait::async_trait; use domain::{ errors::DomainError, - models::{PendingFollowerInfo, RemoteActorInfo}, - ports::SocialQueryPort, - value_objects::UserId, + models::RemoteActorInfo, + ports::FederationAdminQuery, }; use super::PostgresFederationRepository; #[async_trait] -impl SocialQueryPort for PostgresFederationRepository { - async fn get_accepted_following_urls( - &self, - user_id: &UserId, - ) -> Result, DomainError> { - let user_id_str = user_id.value().to_string(); - sqlx::query_scalar::<_, String>( - "SELECT remote_actor_url FROM ap_following WHERE local_user_id = $1 AND status = 'accepted'", - ).bind(&user_id_str).fetch_all(&self.pool).await - .map_err(|e| DomainError::InfrastructureError(e.to_string())) - } - +impl FederationAdminQuery for PostgresFederationRepository { async fn list_all_followed_remote_actors(&self) -> Result, DomainError> { let rows = sqlx::query_as::<_, (String, String, Option)>( "SELECT DISTINCT ar.url, ar.handle, ar.display_name FROM ap_remote_actors ar JOIN ap_following f ON f.remote_actor_url = ar.url WHERE f.status = 'accepted'", @@ -34,49 +22,4 @@ impl SocialQueryPort for PostgresFederationRepository { }) .collect()) } - - async fn count_following(&self, user_id: &UserId) -> Result { - let uid = user_id.value().to_string(); - let count: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM ap_following WHERE local_user_id = $1 AND status = 'accepted'", - ) - .bind(&uid) - .fetch_one(&self.pool) - .await - .map_err(|e| DomainError::InfrastructureError(e.to_string()))?; - Ok(count as usize) - } - - async fn count_accepted_followers(&self, user_id: &UserId) -> Result { - let uid = user_id.value().to_string(); - let count: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM ap_followers WHERE local_user_id = $1 AND status = 'accepted'", - ) - .bind(&uid) - .fetch_one(&self.pool) - .await - .map_err(|e| DomainError::InfrastructureError(e.to_string()))?; - Ok(count as usize) - } - - async fn get_pending_followers( - &self, - user_id: &UserId, - ) -> Result, DomainError> { - let uid = user_id.value().to_string(); - let rows = sqlx::query_as::<_, (String, String, Option, Option)>( - "SELECT ar.url, ar.handle, ar.display_name, ar.avatar_url FROM ap_followers f JOIN ap_remote_actors ar ON ar.url = f.remote_actor_url WHERE f.local_user_id = $1 AND f.status = 'pending'", - ).bind(&uid).fetch_all(&self.pool).await.map_err(|e| DomainError::InfrastructureError(e.to_string()))?; - Ok(rows - .into_iter() - .map( - |(url, handle, display_name, avatar_url)| PendingFollowerInfo { - url, - handle, - display_name, - avatar_url, - }, - ) - .collect()) - } } diff --git a/crates/adapters/sqlite-federation/src/social.rs b/crates/adapters/sqlite-federation/src/social.rs index a21c0de..630a90e 100644 --- a/crates/adapters/sqlite-federation/src/social.rs +++ b/crates/adapters/sqlite-federation/src/social.rs @@ -1,26 +1,14 @@ use async_trait::async_trait; use domain::{ errors::DomainError, - models::{PendingFollowerInfo, RemoteActorInfo}, - ports::SocialQueryPort, - value_objects::UserId, + models::RemoteActorInfo, + ports::FederationAdminQuery, }; use super::SqliteFederationRepository; #[async_trait] -impl SocialQueryPort for SqliteFederationRepository { - async fn get_accepted_following_urls( - &self, - user_id: &UserId, - ) -> Result, DomainError> { - let user_id_str = user_id.value().to_string(); - sqlx::query_scalar::<_, String>( - "SELECT remote_actor_url FROM ap_following WHERE local_user_id = ? AND status = 'accepted'", - ).bind(&user_id_str).fetch_all(&self.pool).await - .map_err(|e| DomainError::InfrastructureError(e.to_string())) - } - +impl FederationAdminQuery for SqliteFederationRepository { async fn list_all_followed_remote_actors(&self) -> Result, DomainError> { let rows = sqlx::query_as::<_, (String, String, Option)>( "SELECT DISTINCT ar.url, ar.handle, ar.display_name @@ -40,56 +28,4 @@ impl SocialQueryPort for SqliteFederationRepository { }) .collect()) } - - async fn count_following(&self, user_id: &UserId) -> Result { - let uid = user_id.value().to_string(); - let count: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM ap_following WHERE local_user_id = ? AND status = 'accepted'", - ) - .bind(&uid) - .fetch_one(&self.pool) - .await - .map_err(|e| DomainError::InfrastructureError(e.to_string()))?; - Ok(count as usize) - } - - async fn count_accepted_followers(&self, user_id: &UserId) -> Result { - let uid = user_id.value().to_string(); - let count: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM ap_followers WHERE local_user_id = ? AND status = 'accepted'", - ) - .bind(&uid) - .fetch_one(&self.pool) - .await - .map_err(|e| DomainError::InfrastructureError(e.to_string()))?; - Ok(count as usize) - } - - async fn get_pending_followers( - &self, - user_id: &UserId, - ) -> Result, DomainError> { - let uid = user_id.value().to_string(); - let rows = sqlx::query_as::<_, (String, String, Option, Option)>( - "SELECT ar.url, ar.handle, ar.display_name, ar.avatar_url - FROM ap_followers f - JOIN ap_remote_actors ar ON ar.url = f.remote_actor_url - WHERE f.local_user_id = ? AND f.status = 'pending'", - ) - .bind(&uid) - .fetch_all(&self.pool) - .await - .map_err(|e| DomainError::InfrastructureError(e.to_string()))?; - Ok(rows - .into_iter() - .map( - |(url, handle, display_name, avatar_url)| PendingFollowerInfo { - url, - handle, - display_name, - avatar_url, - }, - ) - .collect()) - } } diff --git a/crates/adapters/sqlite-federation/src/tests/lib.rs b/crates/adapters/sqlite-federation/src/tests/lib.rs index cc2ab89..bc0206b 100644 --- a/crates/adapters/sqlite-federation/src/tests/lib.rs +++ b/crates/adapters/sqlite-federation/src/tests/lib.rs @@ -1,6 +1,6 @@ use super::*; use chrono::Utc; -use domain::ports::SocialQueryPort; +use domain::ports::FederationAdminQuery; use k_ap::ActorRepository; use sqlx::SqlitePool; @@ -79,30 +79,6 @@ async fn setup_db(pool: &SqlitePool) { .unwrap(); } -#[tokio::test] -async fn test_get_accepted_following_urls_returns_only_accepted() { - let pool = SqlitePool::connect(":memory:").await.unwrap(); - setup_db(&pool).await; - let repo = SqliteFederationRepository::new(pool.clone()); - let user_id = uuid::Uuid::new_v4(); - - sqlx::query( - "INSERT INTO ap_following (local_user_id, remote_actor_url, follow_activity_id, status) - VALUES (?, 'https://other.social/users/alice', 'act1', 'accepted'), - (?, 'https://other.social/users/bob', 'act2', 'pending')", - ) - .bind(user_id.to_string()) - .bind(user_id.to_string()) - .execute(&pool) - .await - .unwrap(); - - let uid = domain::value_objects::UserId::from_uuid(user_id); - let urls = repo.get_accepted_following_urls(&uid).await.unwrap(); - assert_eq!(urls.len(), 1); - assert_eq!(urls[0], "https://other.social/users/alice"); -} - #[tokio::test] async fn test_list_all_followed_remote_actors_deduplicates() { let pool = SqlitePool::connect(":memory:").await.unwrap(); diff --git a/crates/application/src/diary/tests/get_activity_feed.rs b/crates/application/src/diary/tests/get_activity_feed.rs index e99c48d..ab60583 100644 --- a/crates/application/src/diary/tests/get_activity_feed.rs +++ b/crates/application/src/diary/tests/get_activity_feed.rs @@ -116,11 +116,6 @@ impl domain::ports::SocialQuery for FakeSocialWithFollowing { ) -> Result, DomainError> { Ok(self.0.clone()) } - async fn list_all_followed_remote_actors( - &self, - ) -> Result, DomainError> { - Ok(vec![]) - } } #[tokio::test] diff --git a/crates/application/src/test_helpers.rs b/crates/application/src/test_helpers.rs index 863d1fd..324f30a 100644 --- a/crates/application/src/test_helpers.rs +++ b/crates/application/src/test_helpers.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use domain::testing::{ InMemoryGoalRepository, InMemorySocialRepository, InMemoryWrapUpRepository, - InMemoryWrapUpStatsQuery, NoopSocialQueryPort, + InMemoryWrapUpStatsQuery, NoopFederationAdminQuery, }; use domain::{ ports::{ @@ -75,7 +75,7 @@ pub struct TestContextBuilder { pub review_logger: Arc, pub social_command: Arc, pub social_query_unified: Arc, - pub social_query: Arc, + pub federation_admin: Arc, pub refresh_session_repo: Arc, pub config: AppConfig, } @@ -127,7 +127,7 @@ impl TestContextBuilder { review_logger: Arc::new(NoopReviewLogger), social_command: Arc::clone(&social) as _, social_query_unified: Arc::clone(&social) as _, - social_query: Arc::new(NoopSocialQueryPort), + federation_admin: Arc::new(NoopFederationAdminQuery), refresh_session_repo: InMemoryRefreshSessionRepository::new(), config: AppConfig { allow_registration: true, @@ -273,11 +273,6 @@ impl TestContextBuilder { self } - pub fn with_social_query(mut self, r: Arc) -> Self { - self.social_query = r; - self - } - pub fn with_wrapup_repo(mut self, r: Arc) -> Self { self.wrapup_repo = r; self diff --git a/crates/application/src/users/deps.rs b/crates/application/src/users/deps.rs index fb85f52..9a38090 100644 --- a/crates/application/src/users/deps.rs +++ b/crates/application/src/users/deps.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use domain::ports::{ - DiaryQuery, EventPublisher, ObjectStorage, SocialQuery, SocialQueryPort, StatsRepository, + DiaryQuery, EventPublisher, FederationAdminQuery, ObjectStorage, SocialQuery, StatsRepository, UserRepository, }; @@ -13,7 +13,7 @@ pub struct GetProfileDeps { pub struct GetUsersListDeps { pub user: Arc, - pub social_query_legacy: Arc, + pub federation_admin: Arc, } pub struct UpdateProfileDeps { diff --git a/crates/application/src/users/get_users.rs b/crates/application/src/users/get_users.rs index ed0b430..69b8f9c 100644 --- a/crates/application/src/users/get_users.rs +++ b/crates/application/src/users/get_users.rs @@ -15,7 +15,7 @@ pub async fn execute( ) -> Result { let (users_result, actors_result) = tokio::join!( deps.user.list_with_stats(), - deps.social_query_legacy.list_all_followed_remote_actors() + deps.federation_admin.list_all_followed_remote_actors() ); Ok(UsersListData { diff --git a/crates/domain/src/ports/noop.rs b/crates/domain/src/ports/noop.rs index e09b754..a18a51e 100644 --- a/crates/domain/src/ports/noop.rs +++ b/crates/domain/src/ports/noop.rs @@ -94,38 +94,18 @@ impl super::SocialQuery for NoopSocialQuery { async fn get_accepted_following_urls(&self, _: &UserId) -> Result, DomainError> { Ok(vec![]) } - async fn list_all_followed_remote_actors( - &self, - ) -> Result, DomainError> { - Ok(vec![]) - } } -// ── NoopSocialQueryPort ─────────────────────────────────────────────────────── +// ── NoopFederationAdminQuery ───────────────────────────────────────────────── /// Stub used when federation is disabled — returns empty results. -pub struct NoopSocialQueryPort; +pub struct NoopFederationAdminQuery; #[async_trait] -impl super::SocialQueryPort for NoopSocialQueryPort { - async fn get_accepted_following_urls(&self, _: &UserId) -> Result, DomainError> { - Ok(vec![]) - } +impl super::FederationAdminQuery for NoopFederationAdminQuery { async fn list_all_followed_remote_actors( &self, ) -> Result, DomainError> { Ok(vec![]) } - async fn count_following(&self, _: &UserId) -> Result { - Ok(0) - } - async fn count_accepted_followers(&self, _: &UserId) -> Result { - Ok(0) - } - async fn get_pending_followers( - &self, - _: &UserId, - ) -> Result, DomainError> { - Ok(vec![]) - } } diff --git a/crates/domain/src/ports/social.rs b/crates/domain/src/ports/social.rs index 5d2fe1d..12e5824 100644 --- a/crates/domain/src/ports/social.rs +++ b/crates/domain/src/ports/social.rs @@ -4,7 +4,7 @@ use chrono::NaiveDateTime; use crate::{ errors::DomainError, models::{ - DiaryEntry, FederationFlags, PendingFollowerInfo, RemoteActorInfo, RemoteGoalEntry, + DiaryEntry, FederationFlags, RemoteActorInfo, RemoteGoalEntry, RemoteWatchlistEntry, WatchlistWithMovie, }, value_objects::{MovieId, SocialActor, SocialIdentity, UserId}, @@ -94,26 +94,11 @@ pub trait SocialQuery: Send + Sync { user_id: &UserId, ) -> Result, DomainError>; - async fn list_all_followed_remote_actors( - &self, - ) -> Result, DomainError>; } -// ── Legacy ports (pre-unification, still used by AP adapter + handlers) ───── - #[async_trait] -pub trait SocialQueryPort: Send + Sync { - async fn get_accepted_following_urls( - &self, - user_id: &UserId, - ) -> Result, DomainError>; +pub trait FederationAdminQuery: Send + Sync { async fn list_all_followed_remote_actors(&self) -> Result, DomainError>; - async fn count_following(&self, user_id: &UserId) -> Result; - async fn count_accepted_followers(&self, user_id: &UserId) -> Result; - async fn get_pending_followers( - &self, - user_id: &UserId, - ) -> Result, DomainError>; } #[async_trait] diff --git a/crates/domain/src/testing/in_memory.rs b/crates/domain/src/testing/in_memory.rs index 8c86f2c..9d53c26 100644 --- a/crates/domain/src/testing/in_memory.rs +++ b/crates/domain/src/testing/in_memory.rs @@ -1124,10 +1124,4 @@ impl SocialQuery for InMemorySocialRepository { ) -> Result, DomainError> { Ok(vec![]) } - - async fn list_all_followed_remote_actors( - &self, - ) -> Result, DomainError> { - Ok(vec![]) - } } diff --git a/crates/domain/src/testing/noops.rs b/crates/domain/src/testing/noops.rs index 3c443a8..2ab615a 100644 --- a/crates/domain/src/testing/noops.rs +++ b/crates/domain/src/testing/noops.rs @@ -65,7 +65,7 @@ impl ObjectStorage for NoopObjectStorage { // Re-export production noop types so test code that imports from // `domain::testing` keeps compiling without changes. pub use crate::ports::noop::NoopRemoteWatchlistRepository; -pub use crate::ports::noop::NoopSocialQueryPort; +pub use crate::ports::noop::NoopFederationAdminQuery; // ── NoopGoalCommand ─────────────────────────────────────────────────────────── diff --git a/crates/domain/src/testing/panics.rs b/crates/domain/src/testing/panics.rs index 17f96b8..d94b5fa 100644 --- a/crates/domain/src/testing/panics.rs +++ b/crates/domain/src/testing/panics.rs @@ -6,7 +6,7 @@ use crate::{ AnnotatedRow, DiaryEntry, DiaryFilter, EntityType, ExportFormat, ExternalPersonId, FeedEntry, FeedSortBy, FieldMapping, FileFormat, FollowingFilter, ImportError, ImportProfile, ImportSession, IndexableDocument, MovieProfile, MovieStats, ParsedFile, - PendingFollowerInfo, Person, PersonCredits, PersonEnrichmentData, PersonId, RefreshSession, + Person, PersonCredits, PersonEnrichmentData, PersonId, RefreshSession, RemoteActorInfo, ReviewHistory, SearchQuery, SearchResults, UserStats, UserTrends, collections::{PageParams, Paginated}, }, @@ -326,36 +326,12 @@ impl UserProfileFieldsRepository for PanicProfileFieldsRepo { } } -pub struct PanicSocialQueryPort; +pub struct PanicFederationAdminQuery; #[async_trait] -impl crate::ports::SocialQueryPort for PanicSocialQueryPort { - async fn get_accepted_following_urls( - &self, - _: &crate::value_objects::UserId, - ) -> Result, DomainError> { - panic!("PanicSocialQueryPort called") - } +impl crate::ports::FederationAdminQuery for PanicFederationAdminQuery { async fn list_all_followed_remote_actors(&self) -> Result, DomainError> { - panic!("PanicSocialQueryPort called") - } - async fn count_following( - &self, - _: &crate::value_objects::UserId, - ) -> Result { - panic!("PanicSocialQueryPort called") - } - async fn count_accepted_followers( - &self, - _: &crate::value_objects::UserId, - ) -> Result { - panic!("PanicSocialQueryPort called") - } - async fn get_pending_followers( - &self, - _: &crate::value_objects::UserId, - ) -> Result, DomainError> { - panic!("PanicSocialQueryPort called") + panic!("PanicFederationAdminQuery called") } } diff --git a/crates/presentation/src/context.rs b/crates/presentation/src/context.rs index 759ff00..70059ca 100644 --- a/crates/presentation/src/context.rs +++ b/crates/presentation/src/context.rs @@ -6,7 +6,7 @@ use domain::ports::{ MovieCommand, MovieProfileRepository, MovieQuery, ObjectStorage, PasswordHasher, PersonCommand, PersonEnrichmentClient, PersonQuery, PosterFetcherClient, RefreshSessionRepository, RemoteGoalRepository, RemoteWatchlistRepository, ReviewRepository, SearchCommand, SearchPort, - SocialCommand, SocialQuery, SocialQueryPort, StatsRepository, UserProfileFieldsRepository, + FederationAdminQuery, SocialCommand, SocialQuery, StatsRepository, UserProfileFieldsRepository, UserRepository, UserSettingsRepository, WatchEventCommand, WatchEventQuery, WatchlistRepository, WebhookTokenRepository, WrapUpRepository, WrapUpStatsQuery, }; @@ -37,7 +37,7 @@ pub struct Repositories { pub remote_watchlist: Arc, pub social_command: Arc, pub social_query_unified: Arc, - pub social_query: Arc, + pub federation_admin: Arc, pub wrapup_stats: Arc, pub wrapup_repo: Arc, pub goal_command: Arc, diff --git a/crates/presentation/src/handlers/users.rs b/crates/presentation/src/handlers/users.rs index 9724933..0e5d5fe 100644 --- a/crates/presentation/src/handlers/users.rs +++ b/crates/presentation/src/handlers/users.rs @@ -178,7 +178,7 @@ pub async fn update_profile_fields_handler( pub async fn list_users(State(state): State) -> Result, ApiError> { let deps = application::users::deps::GetUsersListDeps { user: state.app_ctx.repos.user.clone(), - social_query_legacy: state.app_ctx.repos.social_query.clone(), + federation_admin: state.app_ctx.repos.federation_admin.clone(), }; let result = get_users::execute(&deps, GetUsersQuery).await?; Ok(Json(UsersResponse { @@ -486,7 +486,7 @@ pub async fn get_users_list( let users_deps = application::users::deps::GetUsersListDeps { user: state.app_ctx.repos.user.clone(), - social_query_legacy: state.app_ctx.repos.social_query.clone(), + federation_admin: state.app_ctx.repos.federation_admin.clone(), }; match application::users::get_users::execute( &users_deps, diff --git a/crates/presentation/src/main.rs b/crates/presentation/src/main.rs index d326894..5a12109 100644 --- a/crates/presentation/src/main.rs +++ b/crates/presentation/src/main.rs @@ -176,9 +176,9 @@ async fn wire_dependencies() -> anyhow::Result<(AppState, axum::Router)> { social_command: social_command_arc, social_query_unified: social_query_unified_arc, #[cfg(feature = "federation")] - social_query: social_query.clone(), + federation_admin: social_query.clone(), #[cfg(not(feature = "federation"))] - social_query: Arc::new(domain::ports::noop::NoopSocialQueryPort), + federation_admin: Arc::new(domain::ports::noop::NoopFederationAdminQuery), wrapup_stats: db.wrapup_stats, wrapup_repo: db.wrapup_repo, goal_command: db.goal_command, diff --git a/crates/presentation/src/tests/extractors.rs b/crates/presentation/src/tests/extractors.rs index 6501245..0f1cd20 100644 --- a/crates/presentation/src/tests/extractors.rs +++ b/crates/presentation/src/tests/extractors.rs @@ -154,30 +154,6 @@ impl DiaryQuery for Panic { panic!() } } -#[cfg(feature = "federation")] -#[async_trait::async_trait] -impl domain::ports::SocialQueryPort for Panic { - async fn get_accepted_following_urls(&self, _: &UserId) -> Result, DomainError> { - panic!() - } - async fn list_all_followed_remote_actors( - &self, - ) -> Result, DomainError> { - panic!() - } - async fn count_following(&self, _: &UserId) -> Result { - panic!() - } - async fn count_accepted_followers(&self, _: &UserId) -> Result { - panic!() - } - async fn get_pending_followers( - &self, - _: &UserId, - ) -> Result, DomainError> { - panic!() - } -} #[async_trait::async_trait] impl StatsRepository for Panic { async fn get_user_stats(&self, _: &UserId) -> Result { @@ -813,7 +789,7 @@ pub fn make_test_state(auth_service: Arc) -> crate::state::AppS remote_watchlist: Arc::clone(&repo) as _, social_command: Arc::new(domain::ports::noop::NoopSocialCommand) as _, social_query_unified: Arc::new(domain::ports::noop::NoopSocialQuery) as _, - social_query: Arc::clone(&repo) as _, + federation_admin: Arc::new(domain::ports::noop::NoopFederationAdminQuery) as _, wrapup_stats: Arc::clone(&repo) as _, wrapup_repo: Arc::clone(&repo) as _, goal_command: Arc::clone(&repo) as _, diff --git a/crates/presentation/tests/api_test.rs b/crates/presentation/tests/api_test.rs index 696deea..b70a333 100644 --- a/crates/presentation/tests/api_test.rs +++ b/crates/presentation/tests/api_test.rs @@ -372,9 +372,6 @@ impl SearchCommand for PanicSearchCommand { } } -#[cfg(feature = "federation")] -struct PanicSocialQuery; - #[cfg(feature = "federation")] struct PanicRemoteWatchlist; #[cfg(feature = "federation")] @@ -402,40 +399,6 @@ impl domain::ports::RemoteWatchlistRepository for PanicRemoteWatchlist { Ok(vec![]) } } -#[cfg(feature = "federation")] -#[async_trait::async_trait] -impl domain::ports::SocialQueryPort for PanicSocialQuery { - async fn get_accepted_following_urls( - &self, - _: &domain::value_objects::UserId, - ) -> Result, DomainError> { - panic!() - } - async fn list_all_followed_remote_actors( - &self, - ) -> Result, DomainError> { - panic!() - } - async fn count_following( - &self, - _: &domain::value_objects::UserId, - ) -> Result { - panic!() - } - async fn count_accepted_followers( - &self, - _: &domain::value_objects::UserId, - ) -> Result { - panic!() - } - async fn get_pending_followers( - &self, - _: &domain::value_objects::UserId, - ) -> Result, DomainError> { - panic!() - } -} - async fn test_app() -> Router { let pool = SqlitePool::connect("sqlite::memory:") .await @@ -466,7 +429,7 @@ async fn test_app() -> Router { remote_watchlist: Arc::new(PanicRemoteWatchlist), social_command: Arc::new(domain::ports::noop::NoopSocialCommand), social_query_unified: Arc::new(domain::ports::noop::NoopSocialQuery), - social_query: Arc::new(PanicSocialQuery), + federation_admin: Arc::new(domain::ports::noop::NoopFederationAdminQuery) as _, wrapup_stats: Arc::new(domain::testing::PanicWrapUpStatsQuery) as _, wrapup_repo: Arc::new(domain::testing::PanicWrapUpRepository) as _, goal_command: Arc::new(domain::testing::NoopGoalCommand),