From ff75361eb17ac67edbc87a1b624a8ee58288d5f7 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Thu, 28 May 2026 01:43:06 +0200 Subject: [PATCH] feat: bump k-ap to v0.1.9 and implement migrate_follower_actor --- Cargo.lock | 6 ++-- crates/adapters/activitypub/Cargo.toml | 2 +- .../adapters/postgres-federation/Cargo.toml | 2 +- .../adapters/postgres-federation/src/lib.rs | 35 +++++++++++++++++++ crates/bootstrap/Cargo.toml | 2 +- crates/worker/Cargo.toml | 2 +- 6 files changed, 42 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0a5b1f0..ca73911 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2015,8 +2015,8 @@ dependencies = [ [[package]] name = "k-ap" -version = "0.1.8" -source = "git+https://git.gabrielkaszewski.dev/GKaszewski/k-ap.git?tag=v0.1.8#1949fce620a4d8f6ae9aa88412f5dbf4b7b0f089" +version = "0.1.9" +source = "git+https://git.gabrielkaszewski.dev/GKaszewski/k-ap.git?tag=v0.1.9#432f39cbb4f8d74255a1f614a9bb7c8bbfe11cde" dependencies = [ "activitypub_federation", "anyhow", @@ -4566,7 +4566,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] diff --git a/crates/adapters/activitypub/Cargo.toml b/crates/adapters/activitypub/Cargo.toml index 1bc41df..eb42235 100644 --- a/crates/adapters/activitypub/Cargo.toml +++ b/crates/adapters/activitypub/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -k-ap = { git = "https://git.gabrielkaszewski.dev/GKaszewski/k-ap.git", tag = "v0.1.8" } +k-ap = { git = "https://git.gabrielkaszewski.dev/GKaszewski/k-ap.git", tag = "v0.1.9" } domain = { workspace = true } url = { workspace = true } serde = { workspace = true } diff --git a/crates/adapters/postgres-federation/Cargo.toml b/crates/adapters/postgres-federation/Cargo.toml index ca8b7b5..30cdc17 100644 --- a/crates/adapters/postgres-federation/Cargo.toml +++ b/crates/adapters/postgres-federation/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -k-ap = { git = "https://git.gabrielkaszewski.dev/GKaszewski/k-ap.git", tag = "v0.1.8" } +k-ap = { git = "https://git.gabrielkaszewski.dev/GKaszewski/k-ap.git", tag = "v0.1.9" } sqlx = { workspace = true } uuid = { workspace = true } chrono = { workspace = true } diff --git a/crates/adapters/postgres-federation/src/lib.rs b/crates/adapters/postgres-federation/src/lib.rs index ebd6644..91df294 100644 --- a/crates/adapters/postgres-federation/src/lib.rs +++ b/crates/adapters/postgres-federation/src/lib.rs @@ -490,6 +490,41 @@ impl FederationRepository for PostgresFederationRepository { ).bind(local_user_id).bind(actor_url).fetch_one(&self.pool).await.map_err(|e| anyhow!(e))?; Ok(n > 0) } + + async fn migrate_follower_actor( + &self, + old_actor_url: &str, + new_actor_url: &str, + ) -> Result> { + let mut tx = self.pool.begin().await.map_err(|e| anyhow!(e))?; + + // Copy rows to the new actor URL, carrying over existing data. + // ON CONFLICT DO NOTHING skips users already following the new actor. + // RETURNING gives us user IDs that actually need a re-follow. + let affected: Vec = sqlx::query_scalar( + "INSERT INTO federation_following(local_user_id, remote_actor_url, follow_activity_id, outbox_url) + SELECT local_user_id, $2, follow_activity_id, outbox_url + FROM federation_following + WHERE remote_actor_url = $1 + ON CONFLICT (local_user_id, remote_actor_url) DO NOTHING + RETURNING local_user_id", + ) + .bind(old_actor_url) + .bind(new_actor_url) + .fetch_all(&mut *tx) + .await + .map_err(|e| anyhow!(e))?; + + // Delete the old rows. + sqlx::query("DELETE FROM federation_following WHERE remote_actor_url = $1") + .bind(old_actor_url) + .execute(&mut *tx) + .await + .map_err(|e| anyhow!(e))?; + + tx.commit().await.map_err(|e| anyhow!(e))?; + Ok(affected) + } } // ── PostgresApUserRepository ────────────────────────────────────────────────── diff --git a/crates/bootstrap/Cargo.toml b/crates/bootstrap/Cargo.toml index 1bcd2ab..2fc9931 100644 --- a/crates/bootstrap/Cargo.toml +++ b/crates/bootstrap/Cargo.toml @@ -14,7 +14,7 @@ postgres = { workspace = true } postgres-search = { workspace = true } postgres-federation = { workspace = true } activitypub = { workspace = true } -k-ap = { git = "https://git.gabrielkaszewski.dev/GKaszewski/k-ap.git", tag = "v0.1.8" } +k-ap = { git = "https://git.gabrielkaszewski.dev/GKaszewski/k-ap.git", tag = "v0.1.9" } nats = { workspace = true } event-transport = { workspace = true } auth = { workspace = true } diff --git a/crates/worker/Cargo.toml b/crates/worker/Cargo.toml index 6125db6..758984e 100644 --- a/crates/worker/Cargo.toml +++ b/crates/worker/Cargo.toml @@ -13,7 +13,7 @@ application = { workspace = true } nats = { workspace = true } event-transport = { workspace = true } event-payload = { workspace = true } -k-ap = { git = "https://git.gabrielkaszewski.dev/GKaszewski/k-ap.git", tag = "v0.1.8" } +k-ap = { git = "https://git.gabrielkaszewski.dev/GKaszewski/k-ap.git", tag = "v0.1.9" } activitypub = { workspace = true } postgres = { workspace = true } postgres-federation = { workspace = true }