Phase 2c: remove audience + PostPush + PostNotification + AudienceRequest/Response
v0.6.2 wire fork: every persona-identifying direct push is gone. Public posts propagate only through the CDN (pull + header-diff neighbor propagation). Encrypted posts propagate only through pull with merged author-or-recipient match. There is no remaining sender→recipient traffic correlation signal on the wire for content. Protocol (network-breaking): - Retire MessageType 0x42 (PostNotification), 0x43 (PostPush), 0x44 (AudienceRequest), 0x45 (AudienceResponse). Their payload structs are deleted along with the handlers and senders. - SocialDisconnectNotice (0x71) / SocialAddressUpdate (0x70) sender functions targeting audience are deleted; the existing handlers stay (both already dead code on the send side). Core removals: - `push_to_audience`, `notify_post`, `push_delete`, `push_disconnect_to_audience`, `push_address_update_to_audience`, `send_audience_request`, `send_audience_response`, `send_to_audience` — all gone from network.rs. - `handle_post_notification` removed from connection.rs. - `request_audience`, `approve_audience`, `deny_audience`, `remove_audience`, `list_audience_members`, `list_audience` removed from Node. - `audience_pushed` step removed from post creation. - `AudienceDirection`, `AudienceStatus`, `AudienceRecord`, `AudienceApprovalMode` removed from types. - Storage: `store_audience`, `list_audience`, `list_audience_members`, `remove_audience`, `row_to_audience_record`, `audience_crud` test, the `audience` CREATE TABLE, and the audience-dependent social route rebuild branch all removed. Upgraded DBs retain the orphan `audience` table; nothing touches it. Follow-on cleanups: - `SocialRelation::Audience` + `::Mutual` collapsed into just `Follow`. The Display/FromStr impl accepts legacy "audience"/"mutual" strings from pre-v0.6.2 DBs and maps them to Follow. - Blob-eviction priority function drops the audience factor; relationship is now own-author vs followed vs other. Tests updated accordingly. - `CommentPermission::AudienceOnly` → `FollowersOnly`. Check uses the author's public follows (`list_public_follows`) rather than a separate audience table. `ModerationMode::AudienceOnly` similarly renamed. - Follow/unfollow routines simplified: no audience downgrade logic; unfollow removes the social route entirely. UI: - CLI: `audience*` commands removed. - Tauri: `AudienceDto`, `list_audience`, `list_audience_outbound`, `request_audience`, `approve_audience`, `remove_audience` commands removed from invoke_handler. Frontend: audience panel and audience/mutual badges removed; compose permission dropdown shows "Followers" instead of "Audience"; `loadAudience` is a no-op stub that hides any leftover DOM. Tests: 111 / 111 core tests pass. Breaking change: v0.6.2 nodes won't interoperate with v0.6.1 for delete propagation, visibility updates, direct post push, post notifications, or audience requests. Upgrade both ends.
This commit is contained in:
parent
36b6a466d2
commit
eabdb7ba4f
10 changed files with 98 additions and 1140 deletions
|
|
@ -1356,111 +1356,6 @@ async fn list_known_anchors(state: State<'_, AppNode>) -> Result<Vec<KnownAnchor
|
|||
Ok(dtos)
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
struct AudienceDto {
|
||||
node_id: String,
|
||||
display_name: Option<String>,
|
||||
direction: String,
|
||||
status: String,
|
||||
requested_at: u64,
|
||||
approved_at: Option<u64>,
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
async fn list_audience(state: State<'_, AppNode>) -> Result<Vec<AudienceDto>, String> {
|
||||
let node = get_node(&state).await;
|
||||
let records = node
|
||||
.list_audience(
|
||||
itsgoin_core::types::AudienceDirection::Inbound,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.map_err(|e| e.to_string())?;
|
||||
let mut dtos = Vec::with_capacity(records.len());
|
||||
for r in &records {
|
||||
let display_name = node.get_display_name(&r.node_id).await.unwrap_or(None);
|
||||
let direction = match r.direction {
|
||||
itsgoin_core::types::AudienceDirection::Inbound => "inbound",
|
||||
itsgoin_core::types::AudienceDirection::Outbound => "outbound",
|
||||
};
|
||||
let status = match r.status {
|
||||
itsgoin_core::types::AudienceStatus::Pending => "pending",
|
||||
itsgoin_core::types::AudienceStatus::Approved => "approved",
|
||||
itsgoin_core::types::AudienceStatus::Denied => "denied",
|
||||
};
|
||||
dtos.push(AudienceDto {
|
||||
node_id: hex::encode(r.node_id),
|
||||
display_name,
|
||||
direction: direction.to_string(),
|
||||
status: status.to_string(),
|
||||
requested_at: r.requested_at,
|
||||
approved_at: r.approved_at,
|
||||
});
|
||||
}
|
||||
Ok(dtos)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
async fn list_audience_outbound(state: State<'_, AppNode>) -> Result<Vec<AudienceDto>, String> {
|
||||
let node = get_node(&state).await;
|
||||
let records = node
|
||||
.list_audience(
|
||||
itsgoin_core::types::AudienceDirection::Outbound,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.map_err(|e| e.to_string())?;
|
||||
let mut dtos = Vec::with_capacity(records.len());
|
||||
for r in &records {
|
||||
let display_name = node.get_display_name(&r.node_id).await.unwrap_or(None);
|
||||
let status = match r.status {
|
||||
itsgoin_core::types::AudienceStatus::Pending => "pending",
|
||||
itsgoin_core::types::AudienceStatus::Approved => "approved",
|
||||
itsgoin_core::types::AudienceStatus::Denied => "denied",
|
||||
};
|
||||
dtos.push(AudienceDto {
|
||||
node_id: hex::encode(r.node_id),
|
||||
display_name,
|
||||
direction: "outbound".to_string(),
|
||||
status: status.to_string(),
|
||||
requested_at: r.requested_at,
|
||||
approved_at: r.approved_at,
|
||||
});
|
||||
}
|
||||
Ok(dtos)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
async fn request_audience(
|
||||
state: State<'_, AppNode>,
|
||||
node_id_hex: String,
|
||||
) -> Result<(), String> {
|
||||
let node = get_node(&state).await;
|
||||
let nid = parse_node_id(&node_id_hex)?;
|
||||
node.request_audience(&nid).await.map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
async fn approve_audience(
|
||||
state: State<'_, AppNode>,
|
||||
node_id_hex: String,
|
||||
) -> Result<(), String> {
|
||||
let node = get_node(&state).await;
|
||||
let nid = parse_node_id(&node_id_hex)?;
|
||||
node.approve_audience(&nid).await.map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
async fn remove_audience(
|
||||
state: State<'_, AppNode>,
|
||||
node_id_hex: String,
|
||||
) -> Result<(), String> {
|
||||
let node = get_node(&state).await;
|
||||
let nid = parse_node_id(&node_id_hex)?;
|
||||
node.remove_audience(&nid).await.map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
struct WormResultDto {
|
||||
|
|
@ -2401,7 +2296,7 @@ async fn set_comment_policy(
|
|||
let node = get_node(&state).await;
|
||||
let pid = hex_to_postid(&post_id)?;
|
||||
let comment_perm = match allow_comments.as_str() {
|
||||
"audience_only" => itsgoin_core::types::CommentPermission::AudienceOnly,
|
||||
"followers_only" | "audience_only" => itsgoin_core::types::CommentPermission::FollowersOnly,
|
||||
"none" => itsgoin_core::types::CommentPermission::None,
|
||||
_ => itsgoin_core::types::CommentPermission::Public,
|
||||
};
|
||||
|
|
@ -3011,11 +2906,6 @@ pub fn run() {
|
|||
set_anchors,
|
||||
list_anchor_peers,
|
||||
list_known_anchors,
|
||||
list_audience,
|
||||
list_audience_outbound,
|
||||
request_audience,
|
||||
approve_audience,
|
||||
remove_audience,
|
||||
list_connections,
|
||||
worm_lookup,
|
||||
list_social_routes,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue