bump k-ap 0.4.4, handle OutboundFollowAccepted w/ outbox backfill
All checks were successful
lint / lint (push) Successful in 17m36s
test / unit (push) Successful in 21m21s

This commit is contained in:
2026-07-11 10:48:23 +02:00
parent 09f5caefe7
commit 1e7886fb85
8 changed files with 45 additions and 8 deletions

View File

@@ -4,7 +4,7 @@ version = "0.1.0"
edition = "2021"
[dependencies]
k-ap = { version = "0.4.0", registry = "gitea" }
k-ap = { version = "0.4.4", registry = "gitea" }
domain = { workspace = true }
url = { workspace = true }
serde = { workspace = true }

View File

@@ -97,6 +97,11 @@ pub enum EventPayload {
owner_user_id: String,
follower_inbox_url: String,
},
FederationOutboundFollowAccepted {
local_user_id: String,
remote_actor_url: String,
outbox_url: Option<String>,
},
}
impl EventPayload {
@@ -124,6 +129,7 @@ impl EventPayload {
Self::MentionReceived { .. } => "mentions.received",
Self::FederationDeliveryRequested { .. } => "federation.delivery.requested",
Self::FederationBackfillRequested { .. } => "federation.backfill.requested",
Self::FederationOutboundFollowAccepted { .. } => "federation.outbound_follow.accepted",
}
}
}
@@ -421,7 +427,8 @@ impl TryFrom<EventPayload> for DomainEvent {
author_user_id: UserId::from_uuid(parse_uuid(&author_user_id, "author_user_id")?),
},
EventPayload::FederationDeliveryRequested { .. }
| EventPayload::FederationBackfillRequested { .. } => {
| EventPayload::FederationBackfillRequested { .. }
| EventPayload::FederationOutboundFollowAccepted { .. } => {
return Err(DomainError::Internal(
"federation infrastructure event — not a domain event".into(),
));

View File

@@ -4,7 +4,7 @@ version = "0.1.0"
edition = "2021"
[dependencies]
k-ap = { version = "0.4.0", registry = "gitea" }
k-ap = { version = "0.4.4", registry = "gitea" }
sqlx = { workspace = true }
uuid = { workspace = true }
chrono = { workspace = true }

View File

@@ -14,7 +14,7 @@ postgres = { workspace = true }
postgres-search = { workspace = true }
postgres-federation = { workspace = true }
activitypub = { workspace = true }
k-ap = { version = "0.4.0", registry = "gitea" }
k-ap = { version = "0.4.4", registry = "gitea" }
serde_json = { workspace = true }
anyhow = { workspace = true }
nats = { workspace = true }

View File

@@ -70,6 +70,20 @@ impl k_ap::data::EventPublisher for KapPublisher {
follower_inbox_url,
})?,
),
FederationEvent::OutboundFollowAccepted {
local_user_id,
remote_actor_url,
outbox_url,
} => (
"federation.outbound_follow.accepted",
serde_json::to_vec(
&event_payload::EventPayload::FederationOutboundFollowAccepted {
local_user_id: local_user_id.to_string(),
remote_actor_url,
outbox_url,
},
)?,
),
FederationEvent::DeliveryFailed { inbox, error, .. } => {
tracing::warn!(%inbox, %error, "AP delivery failed permanently");
return Ok(());

View File

@@ -13,7 +13,7 @@ application = { workspace = true }
nats = { workspace = true }
event-transport = { workspace = true }
event-payload = { workspace = true }
k-ap = { version = "0.4.0", registry = "gitea" }
k-ap = { version = "0.4.4", registry = "gitea" }
activitypub = { workspace = true }
postgres = { workspace = true }
postgres-federation = { workspace = true }

View File

@@ -104,6 +104,22 @@ async fn main() {
.await;
result
}
EventPayload::FederationOutboundFollowAccepted {
remote_actor_url,
outbox_url,
..
} => {
if let Some(outbox) = outbox_url {
infra
.raw_ap_service
.import_remote_outbox(&outbox, &remote_actor_url)
.await
.map_err(|e| DomainError::Internal(e.to_string()))
} else {
tracing::info!(%remote_actor_url, "outbound follow accepted but no outbox URL — skipping backfill");
Ok(())
}
}
// ── domain events ──────────────────────────────────────
p => match DomainEvent::try_from(p) {