refactor: deduplicate broadcast methods via generic dispatcher #11

Open
opened 2026-05-30 01:32:13 +00:00 by GKaszewski · 0 comments
Owner

Problem

service/broadcast.rs has 11 methods that all follow the same 4-step pattern:

  1. Get local actor via get_local_actor()
  2. Get follower inboxes via accepted_follower_inboxes()
  3. Call prepare_broadcast()
  4. Call dispatch_deliveries()

Inbox deduplication logic is duplicated between broadcast_create_note and broadcast_update_note (lines ~257-271 and ~318-332). Adding a new broadcast method requires copy-pasting 30+ lines.

Proposal

Extract a generic broadcast helper parameterized by activity type:

async fn broadcast_to_followers<A: Activity + Serialize>(
    &self,
    local_user_id: Uuid,
    activity_builder: impl FnOnce(&DbActor) -> A,
) -> Result<()>

Or a builder pattern:

self.broadcast(local_user_id)
    .to_followers()
    .with_extra_inboxes(mentioned_inboxes)
    .send(create_activity)
    .await?

Files

  • src/service/broadcast.rs (primary)
  • src/service/delivery.rs (prepare_broadcast, dispatch_deliveries)
  • src/service/follow.rs (uses same dispatch pattern)

Trade-offs

  • Eliminates ~200 lines of duplication
  • Builder pattern adds indirection but makes intent clearer
  • Must preserve visibility-based addressing (Public/FollowersOnly/Private)
## Problem `service/broadcast.rs` has 11 methods that all follow the same 4-step pattern: 1. Get local actor via `get_local_actor()` 2. Get follower inboxes via `accepted_follower_inboxes()` 3. Call `prepare_broadcast()` 4. Call `dispatch_deliveries()` Inbox deduplication logic is duplicated between `broadcast_create_note` and `broadcast_update_note` (lines ~257-271 and ~318-332). Adding a new broadcast method requires copy-pasting 30+ lines. ## Proposal Extract a generic broadcast helper parameterized by activity type: ```rust async fn broadcast_to_followers<A: Activity + Serialize>( &self, local_user_id: Uuid, activity_builder: impl FnOnce(&DbActor) -> A, ) -> Result<()> ``` Or a builder pattern: ```rust self.broadcast(local_user_id) .to_followers() .with_extra_inboxes(mentioned_inboxes) .send(create_activity) .await? ``` ## Files - `src/service/broadcast.rs` (primary) - `src/service/delivery.rs` (prepare_broadcast, dispatch_deliveries) - `src/service/follow.rs` (uses same dispatch pattern) ## Trade-offs - Eliminates ~200 lines of duplication - Builder pattern adds indirection but makes intent clearer - Must preserve visibility-based addressing (Public/FollowersOnly/Private)
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: GKaszewski/k-ap#11