feat: per-entity federation privacy toggles for reviews and watchlist #7
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Background
UserSettingsalready has afederate_goals: booltoggle that gates whether goal events are published to the fediverse. However,ReviewLogged,WatchlistEntryAdded, andWatchlistEntryRemovedare federated unconditionally — there is no way for a user to keep their reviews or watchlist private.Proposed changes
Add two new settings flags:
federate_reviews: bool— controls whetherReviewLoggedandReviewUpdatedevents are federatedfederate_watchlist: bool— controls whetherWatchlistEntryAddedandWatchlistEntryRemovedevents are federatedDomain
crates/domain/src/models/user_settings.rs:federate_reviews: boolandfederate_watchlist: boolfieldstrue(preserves current behaviour for existing users)federate_goalspatterncrates/domain/src/ports.rs(UserSettingsRepository):get_user_federate_reviews(&UserId) -> Result<bool, DomainError>get_user_federate_watchlist(&UserId) -> Result<bool, DomainError>Storage
New migration for both sqlite and postgres adapters:
Federation event handler
crates/adapters/activitypub/src/event_handler.rs:ReviewLogged/ReviewUpdatedonget_user_federate_reviews()WatchlistEntryAdded/WatchlistEntryRemovedonget_user_federate_watchlist()Settings API + UI
Default values
Both default to
trueso existing users continue to federate reviews and watchlist entries without any action required. Users who want privacy opt out explicitly.Affected files
crates/domain/src/models/user_settings.rscrates/domain/src/ports.rscrates/adapters/sqlite/src/user_settings.rscrates/adapters/postgres/src/(user_settings)crates/adapters/sqlite/migrations/(new migration)crates/adapters/postgres/migrations/(new migration)crates/adapters/activitypub/src/event_handler.rscrates/application/src/users/update_settings.rscrates/presentation/src/handlers/(settings endpoint)crates/api-types/(settings DTO)Performance note: the current pattern uses per-flag DB methods (
get_user_federate_goals, etc.) — each is a separate query. With three flags, the event handler could issue up to 3 DB round-trips per federated event. Consider loading the fullUserSettingsonce per event dispatch and reading all flags from the struct in memory instead.