diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bdb06b..72ccb52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,24 @@ # Changelog -## [0.3.0] — unreleased +## [0.3.1] — 2026-05-29 + +### Breaking changes + +**`RemoteActor` has five new required fields** — struct literals must include them: + +| Field | Type | Description | +|-------|------|-------------| +| `bio` | `Option` | Actor biography/summary | +| `banner_url` | `Option` | Banner/header image URL | +| `followers_url` | `Option` | AP followers collection URL | +| `following_url` | `Option` | AP following collection URL | +| `also_known_as` | `Vec` | Account aliases (for Move verification) | + +These are populated automatically when k-ap fetches a remote actor (via `from_json`) and when the local `follow()` method constructs a `RemoteActor` from the fetched `DbActor`. Consuming applications only need to add the new fields to their `upsert_remote_actor` / `get_remote_actor` SQL and any custom `RemoteActor` construction sites. + +--- + +## [0.3.0] — 2026-05-28 ### Breaking changes diff --git a/Cargo.lock b/Cargo.lock index 72b3d9c..060d309 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1368,7 +1368,7 @@ dependencies = [ [[package]] name = "k-ap" -version = "0.3.0" +version = "0.3.1" dependencies = [ "activitypub_federation", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 6b4d497..e3c85ae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "k-ap" -version = "0.3.0" +version = "0.3.1" edition = "2024" description = "Generic ActivityPub protocol layer" license = "MIT" diff --git a/src/actors.rs b/src/actors.rs index 9b2138e..5e5f3c4 100644 --- a/src/actors.rs +++ b/src/actors.rs @@ -355,6 +355,11 @@ impl Object for DbActor { display_name: json.name.clone(), avatar_url: json.icon.as_ref().map(|i| i.url.to_string()), outbox_url: json.outbox.as_ref().map(|u| u.to_string()), + bio: json.summary.clone(), + banner_url: json.image.as_ref().map(|i| i.url.to_string()), + followers_url: json.followers.as_ref().map(|u| u.to_string()), + following_url: json.following.as_ref().map(|u| u.to_string()), + also_known_as: json.also_known_as.clone(), }; data.actor_repo.upsert_remote_actor(actor).await?; diff --git a/src/repository/mod.rs b/src/repository/mod.rs index cb16689..9a020cf 100644 --- a/src/repository/mod.rs +++ b/src/repository/mod.rs @@ -30,6 +30,11 @@ pub struct RemoteActor { pub display_name: Option, pub avatar_url: Option, pub outbox_url: Option, + pub bio: Option, + pub banner_url: Option, + pub followers_url: Option, + pub following_url: Option, + pub also_known_as: Vec, } #[derive(Debug, Clone)] diff --git a/src/service/follow.rs b/src/service/follow.rs index 3584a40..40c657c 100644 --- a/src/service/follow.rs +++ b/src/service/follow.rs @@ -37,9 +37,14 @@ impl ActivityPubService { .shared_inbox_url .as_ref() .map(|u| u.to_string()), - display_name: Some(remote_actor.username.clone()), + display_name: remote_actor.display_name.clone().or_else(|| Some(remote_actor.username.clone())), avatar_url: remote_actor.avatar_url.as_ref().map(|u| u.to_string()), outbox_url: Some(remote_actor.outbox_url.to_string()), + bio: remote_actor.bio.clone(), + banner_url: remote_actor.banner_url.as_ref().map(|u| u.to_string()), + followers_url: Some(remote_actor.followers_url.to_string()), + following_url: Some(remote_actor.following_url.to_string()), + also_known_as: remote_actor.also_known_as.clone(), }; // Save BEFORE delivering — prevents lost state on process restart. data.follow_repo @@ -382,9 +387,14 @@ impl ActivityPubService { handle: format!("{}@{}", target.username, data.domain), inbox_url: format!("{}/inbox", target_actor_url), shared_inbox_url: None, - display_name: Some(target.username), - avatar_url: None, - outbox_url: None, + display_name: target.display_name.or(Some(target.username)), + avatar_url: target.avatar_url.as_ref().map(|u| u.to_string()), + outbox_url: Some(format!("{}/outbox", target_actor_url)), + bio: target.bio, + banner_url: target.banner_url.as_ref().map(|u| u.to_string()), + followers_url: Some(format!("{}/followers", target_actor_url)), + following_url: Some(format!("{}/following", target_actor_url)), + also_known_as: target.also_known_as, }; data.follow_repo .add_following(local_user_id, target_as_remote, &follow_id)