From 90d13c883bc48b6feb8d26bc80655299132f1bc6 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sat, 30 May 2026 03:16:01 +0200 Subject: [PATCH] feat: replace instance actor decorator with real DB row MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migration inserts a service actor with a well-known UUID. Removes the InstanceActorUserRepo wrapper — the real ApUserRepository finds it. --- .../activitypub/src/instance_actor.rs | 57 ------------------- crates/adapters/activitypub/src/lib.rs | 12 ++-- .../migrations/022_instance_actor.sql | 10 ++++ 3 files changed, 15 insertions(+), 64 deletions(-) delete mode 100644 crates/adapters/activitypub/src/instance_actor.rs create mode 100644 crates/adapters/postgres/migrations/022_instance_actor.sql diff --git a/crates/adapters/activitypub/src/instance_actor.rs b/crates/adapters/activitypub/src/instance_actor.rs deleted file mode 100644 index 77192f0..0000000 --- a/crates/adapters/activitypub/src/instance_actor.rs +++ /dev/null @@ -1,57 +0,0 @@ -use std::sync::Arc; - -use async_trait::async_trait; -use k_ap::{ApActorType, ApUser, ApUserRepository}; - -pub const INSTANCE_ACTOR_ID: uuid::Uuid = - uuid::Uuid::from_bytes([0, 0, 0, 0, 0, 0, 0x40, 0, 0x80, 0, 0, 0, 0, 0, 0, 0]); - -pub struct InstanceActorUserRepo { - inner: Arc, - base_url: String, -} - -impl InstanceActorUserRepo { - pub fn new(inner: Arc, base_url: String) -> Self { - Self { inner, base_url } - } -} - -fn instance_ap_user(base_url: &str) -> ApUser { - ApUser { - id: INSTANCE_ACTOR_ID, - username: "instance".to_string(), - display_name: None, - bio: None, - avatar_url: None, - banner_url: None, - also_known_as: vec![], - profile_url: url::Url::parse(base_url).ok(), - attachment: vec![], - manually_approves_followers: false, - discoverable: false, - actor_type: ApActorType::Service, - featured_url: None, - } -} - -#[async_trait] -impl ApUserRepository for InstanceActorUserRepo { - async fn find_by_id(&self, id: uuid::Uuid) -> anyhow::Result> { - if id == INSTANCE_ACTOR_ID { - return Ok(Some(instance_ap_user(&self.base_url))); - } - self.inner.find_by_id(id).await - } - - async fn find_by_username(&self, username: &str) -> anyhow::Result> { - if username == "instance" { - return Ok(Some(instance_ap_user(&self.base_url))); - } - self.inner.find_by_username(username).await - } - - async fn count_users(&self) -> anyhow::Result { - self.inner.count_users().await - } -} diff --git a/crates/adapters/activitypub/src/lib.rs b/crates/adapters/activitypub/src/lib.rs index fe32db1..f288c3c 100644 --- a/crates/adapters/activitypub/src/lib.rs +++ b/crates/adapters/activitypub/src/lib.rs @@ -1,10 +1,12 @@ pub mod handler; -pub mod instance_actor; pub mod note; pub mod port; pub mod service; pub mod urls; +pub const INSTANCE_ACTOR_ID: uuid::Uuid = + uuid::Uuid::from_bytes([0, 0, 0, 0, 0, 0, 0x40, 0, 0x80, 0, 0, 0, 0, 0, 0, 0]); + pub use handler::ThoughtsObjectHandler; pub use note::ThoughtNote; pub use port::{ @@ -34,22 +36,18 @@ pub struct ApServiceConfig { pub async fn build_ap_service( cfg: ApServiceConfig, ) -> (Arc, Arc) { - let user_repo = Arc::new(instance_actor::InstanceActorUserRepo::new( - cfg.user_repo, - cfg.base_url.clone(), - )); let mut builder = ActivityPubService::builder(cfg.base_url) .activity_repo(cfg.activity_repo) .follow_repo(cfg.follow_repo) .actor_repo(cfg.actor_repo) .blocklist_repo(cfg.blocklist_repo) - .user_repo(user_repo) + .user_repo(cfg.user_repo) .content_reader(cfg.ap_handler.clone()) .object_handler(cfg.ap_handler) .allow_registration(cfg.allow_registration) .software_name("thoughts") .debug(cfg.debug) - .signed_fetch_actor_id(instance_actor::INSTANCE_ACTOR_ID); + .signed_fetch_actor_id(INSTANCE_ACTOR_ID); if let Some(publisher) = cfg.event_publisher { builder = builder.event_publisher(publisher); } diff --git a/crates/adapters/postgres/migrations/022_instance_actor.sql b/crates/adapters/postgres/migrations/022_instance_actor.sql new file mode 100644 index 0000000..a8774e3 --- /dev/null +++ b/crates/adapters/postgres/migrations/022_instance_actor.sql @@ -0,0 +1,10 @@ +INSERT INTO users (id, username, email, password_hash, display_name, bio) +VALUES ( + '00000000-0000-4000-8000-000000000000', + 'instance', + 'noreply@instance.invalid', + '!service-actor-no-login', + NULL, + NULL +) +ON CONFLICT (id) DO NOTHING;