feat: add outbox_url to RemoteActor, get_following_outbox_url to FederationRepository

This commit is contained in:
2026-05-13 01:20:48 +02:00
parent 80983f1ff2
commit faeac18126
7 changed files with 39 additions and 3 deletions

View File

@@ -219,6 +219,7 @@ impl Object for DbActor {
shared_inbox_url: None, shared_inbox_url: None,
display_name: json.name.clone(), display_name: json.name.clone(),
avatar_url: json.icon.as_ref().map(|i| i.url.to_string()), avatar_url: json.icon.as_ref().map(|i| i.url.to_string()),
outbox_url: Some(json.outbox.to_string()),
}; };
data.federation_repo.upsert_remote_actor(actor).await?; data.federation_repo.upsert_remote_actor(actor).await?;

View File

@@ -22,6 +22,7 @@ pub struct RemoteActor {
pub shared_inbox_url: Option<String>, pub shared_inbox_url: Option<String>,
pub display_name: Option<String>, pub display_name: Option<String>,
pub avatar_url: Option<String>, pub avatar_url: Option<String>,
pub outbox_url: Option<String>,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@@ -96,6 +97,11 @@ pub trait FederationRepository: Send + Sync {
remote_actor_url: &str, remote_actor_url: &str,
status: FollowingStatus, status: FollowingStatus,
) -> Result<()>; ) -> Result<()>;
async fn get_following_outbox_url(
&self,
local_user_id: uuid::Uuid,
remote_actor_url: &str,
) -> Result<Option<String>>;
async fn add_announce( async fn add_announce(
&self, &self,
activity_id: &str, activity_id: &str,

View File

@@ -173,6 +173,7 @@ impl ActivityPubService {
shared_inbox_url: None, shared_inbox_url: None,
display_name: Some(remote_actor.username.clone()), display_name: Some(remote_actor.username.clone()),
avatar_url: None, avatar_url: None,
outbox_url: Some(remote_actor.outbox_url.to_string()),
}; };
data.federation_repo data.federation_repo
.add_following(local_user_id, remote, &follow_id_str) .add_following(local_user_id, remote, &follow_id_str)
@@ -867,6 +868,7 @@ impl ActivityPubService {
shared_inbox_url: None, shared_inbox_url: None,
display_name: None, display_name: None,
avatar_url: None, avatar_url: None,
outbox_url: None,
}, },
}; };
actors.push(actor); actors.push(actor);
@@ -928,6 +930,7 @@ impl ActivityPubService {
shared_inbox_url: None, shared_inbox_url: None,
display_name: Some(target.username), display_name: Some(target.username),
avatar_url: None, avatar_url: None,
outbox_url: None,
}; };
data.federation_repo data.federation_repo
.add_following(local_user_id, target_as_remote, &follow_id) .add_following(local_user_id, target_as_remote, &follow_id)

View File

@@ -10,6 +10,7 @@ fn make_follower(inbox: &str, shared: Option<&str>) -> Follower {
shared_inbox_url: shared.map(|s| s.to_string()), shared_inbox_url: shared.map(|s| s.to_string()),
display_name: None, display_name: None,
avatar_url: None, avatar_url: None,
outbox_url: None,
}, },
status: FollowerStatus::Accepted, status: FollowerStatus::Accepted,
} }

View File

@@ -119,9 +119,11 @@ impl From<&DomainEvent> for EventPayload {
} }
} }
DomainEvent::ImageStored { key } => EventPayload::ImageStored { key: key.clone() }, DomainEvent::ImageStored { key } => EventPayload::ImageStored { key: key.clone() },
DomainEvent::WatchlistEntryAdded { .. } | DomainEvent::WatchlistEntryRemoved { .. } => { DomainEvent::WatchlistEntryAdded { .. }
| DomainEvent::WatchlistEntryRemoved { .. }
| DomainEvent::FollowAccepted { .. } => {
// federation-only events; not serialized via EventPayload // federation-only events; not serialized via EventPayload
unreachable!("watchlist events are handled by the AP event handler directly") unreachable!("federation events are handled by the AP event handler directly")
} }
} }
} }

View File

@@ -121,7 +121,7 @@ impl FederationRepository for PostgresFederationRepository {
let display_name: Option<String> = row.try_get("display_name").ok().flatten(); let display_name: Option<String> = row.try_get("display_name").ok().flatten();
let avatar_url: Option<String> = row.try_get("avatar_url").ok().flatten(); let avatar_url: Option<String> = row.try_get("avatar_url").ok().flatten();
Follower { Follower {
actor: RemoteActor { url, handle, inbox_url, shared_inbox_url, display_name, avatar_url }, actor: RemoteActor { url, handle, inbox_url, shared_inbox_url, display_name, avatar_url, outbox_url: row.try_get("outbox_url").ok().flatten() },
status: str_to_status(&status_str), status: str_to_status(&status_str),
} }
}).collect()) }).collect())
@@ -217,6 +217,7 @@ impl FederationRepository for PostgresFederationRepository {
shared_inbox_url: row.try_get("shared_inbox_url").ok().flatten(), shared_inbox_url: row.try_get("shared_inbox_url").ok().flatten(),
display_name: row.try_get("display_name").ok().flatten(), display_name: row.try_get("display_name").ok().flatten(),
avatar_url: row.try_get("avatar_url").ok().flatten(), avatar_url: row.try_get("avatar_url").ok().flatten(),
outbox_url: row.try_get("outbox_url").ok().flatten(),
}).collect()) }).collect())
} }
@@ -272,6 +273,7 @@ impl FederationRepository for PostgresFederationRepository {
shared_inbox_url: row.try_get("shared_inbox_url").ok().flatten(), shared_inbox_url: row.try_get("shared_inbox_url").ok().flatten(),
display_name: row.try_get("display_name").ok().flatten(), display_name: row.try_get("display_name").ok().flatten(),
avatar_url: row.try_get("avatar_url").ok().flatten(), avatar_url: row.try_get("avatar_url").ok().flatten(),
outbox_url: row.try_get("outbox_url").ok().flatten(),
})) }))
} }
@@ -327,6 +329,7 @@ impl FederationRepository for PostgresFederationRepository {
shared_inbox_url: row.try_get("shared_inbox_url").ok().flatten(), shared_inbox_url: row.try_get("shared_inbox_url").ok().flatten(),
display_name: row.try_get("display_name").ok().flatten(), display_name: row.try_get("display_name").ok().flatten(),
avatar_url: row.try_get("avatar_url").ok().flatten(), avatar_url: row.try_get("avatar_url").ok().flatten(),
outbox_url: row.try_get("outbox_url").ok().flatten(),
}).collect()) }).collect())
} }
@@ -355,6 +358,14 @@ impl FederationRepository for PostgresFederationRepository {
Ok(()) Ok(())
} }
async fn get_following_outbox_url(
&self,
_local_user_id: uuid::Uuid,
_remote_actor_url: &str,
) -> Result<Option<String>> {
Ok(None)
}
async fn add_announce( async fn add_announce(
&self, &self,
activity_id: &str, activity_id: &str,

View File

@@ -136,6 +136,7 @@ impl FederationRepository for SqliteFederationRepository {
shared_inbox_url, shared_inbox_url,
display_name, display_name,
avatar_url, avatar_url,
outbox_url: row.try_get("outbox_url").ok().flatten(),
}, },
status: str_to_status(&status_str), status: str_to_status(&status_str),
} }
@@ -244,6 +245,7 @@ impl FederationRepository for SqliteFederationRepository {
shared_inbox_url: row.try_get("shared_inbox_url").ok().flatten(), shared_inbox_url: row.try_get("shared_inbox_url").ok().flatten(),
display_name: row.try_get("display_name").ok().flatten(), display_name: row.try_get("display_name").ok().flatten(),
avatar_url: row.try_get("avatar_url").ok().flatten(), avatar_url: row.try_get("avatar_url").ok().flatten(),
outbox_url: row.try_get("outbox_url").ok().flatten(),
}) })
.collect()) .collect())
} }
@@ -303,6 +305,7 @@ impl FederationRepository for SqliteFederationRepository {
shared_inbox_url: row.try_get("shared_inbox_url").ok().flatten(), shared_inbox_url: row.try_get("shared_inbox_url").ok().flatten(),
display_name: row.try_get("display_name").ok().flatten(), display_name: row.try_get("display_name").ok().flatten(),
avatar_url: row.try_get("avatar_url").ok().flatten(), avatar_url: row.try_get("avatar_url").ok().flatten(),
outbox_url: row.try_get("outbox_url").ok().flatten(),
})) }))
} }
@@ -369,6 +372,7 @@ impl FederationRepository for SqliteFederationRepository {
shared_inbox_url: row.try_get("shared_inbox_url").ok().flatten(), shared_inbox_url: row.try_get("shared_inbox_url").ok().flatten(),
display_name: row.try_get("display_name").ok().flatten(), display_name: row.try_get("display_name").ok().flatten(),
avatar_url: row.try_get("avatar_url").ok().flatten(), avatar_url: row.try_get("avatar_url").ok().flatten(),
outbox_url: row.try_get("outbox_url").ok().flatten(),
}) })
.collect()) .collect())
} }
@@ -401,6 +405,14 @@ impl FederationRepository for SqliteFederationRepository {
Ok(()) Ok(())
} }
async fn get_following_outbox_url(
&self,
_local_user_id: uuid::Uuid,
_remote_actor_url: &str,
) -> Result<Option<String>> {
Ok(None)
}
async fn add_announce( async fn add_announce(
&self, &self,
activity_id: &str, activity_id: &str,