diff --git a/crates/adapters/activitypub/src/composite_handler.rs b/crates/adapters/activitypub/src/composite_handler.rs index 85203f0..23b6d44 100644 --- a/crates/adapters/activitypub/src/composite_handler.rs +++ b/crates/adapters/activitypub/src/composite_handler.rs @@ -36,9 +36,11 @@ impl ApObjectHandler for CompositeObjectHandler { actor_url: &Url, object: serde_json::Value, ) -> anyhow::Result<()> { + let is_watchlist = object.get("watchlistEntry").and_then(|v| v.as_bool()) == Some(true) + || (object.get("movieTitle").is_some() && object.get("rating").is_none()); if object.get("rating").is_some() { self.review.on_create(ap_id, actor_url, object).await - } else if object.get("movieTitle").is_some() { + } else if is_watchlist { self.watchlist.on_create(ap_id, actor_url, object).await } else { tracing::debug!(ap_id = %ap_id, "ignoring Create for unknown object type"); diff --git a/crates/adapters/activitypub/src/event_handler.rs b/crates/adapters/activitypub/src/event_handler.rs index 0a83a64..9862495 100644 --- a/crates/adapters/activitypub/src/event_handler.rs +++ b/crates/adapters/activitypub/src/event_handler.rs @@ -214,7 +214,7 @@ impl ActivityPubEventHandler { let json = serde_json::to_value(obj)?; self.ap_service - .broadcast_add_to_followers(user_id.value(), ap_id, json) + .broadcast_to_followers(user_id.value(), ap_id, json) .await?; Ok(()) } @@ -227,7 +227,7 @@ impl ActivityPubEventHandler { use crate::urls::watchlist_entry_url; let ap_id = watchlist_entry_url(&self.base_url, user_id.value(), movie_id.value()); self.ap_service - .broadcast_undo_add_to_followers(user_id.value(), ap_id) + .broadcast_delete_to_followers(user_id.value(), ap_id) .await?; Ok(()) } diff --git a/crates/adapters/activitypub/src/objects.rs b/crates/adapters/activitypub/src/objects.rs index 3ebb6c7..1a18b23 100644 --- a/crates/adapters/activitypub/src/objects.rs +++ b/crates/adapters/activitypub/src/objects.rs @@ -115,6 +115,10 @@ pub struct WatchlistObject { pub(crate) poster_url: Option, #[serde(default)] pub(crate) tag: Vec, + /// Discriminator so Movies Diary instances distinguish this from a review Note. + /// Non-Movies-Diary apps ignore unknown fields. + #[serde(default)] + pub(crate) watchlist_entry: bool, } pub fn watchlist_to_ap_object( @@ -160,6 +164,7 @@ pub fn watchlist_to_ap_object( external_metadata_id, poster_url, tag, + watchlist_entry: true, } }