diff --git a/crates/adapters/activitypub/src/objects.rs b/crates/adapters/activitypub/src/objects.rs index e929868..0b35f04 100644 --- a/crates/adapters/activitypub/src/objects.rs +++ b/crates/adapters/activitypub/src/objects.rs @@ -49,6 +49,8 @@ pub struct ReviewObject { pub(crate) rating: u8, pub(crate) comment: Option, pub(crate) watched_at: DateTime, + #[serde(skip_serializing_if = "Option::is_none", default)] + pub(crate) watch_medium: Option, /// Discriminator so Movies Diary instances detect this as a review Note. #[serde(default)] pub(crate) review: bool, @@ -135,6 +137,7 @@ pub fn review_to_ap_object(review: &Review, input: ReviewApInput) -> ReviewObjec rating: review.rating().value(), comment: comment_text, watched_at: DateTime::from_naive_utc_and_offset(*review.watched_at(), Utc), + watch_medium: review.watch_medium().map(|wm| wm.to_string()), review: true, attachment, tag, diff --git a/crates/adapters/activitypub/src/remote_review_repository.rs b/crates/adapters/activitypub/src/remote_review_repository.rs index abb08e1..391b085 100644 --- a/crates/adapters/activitypub/src/remote_review_repository.rs +++ b/crates/adapters/activitypub/src/remote_review_repository.rs @@ -25,6 +25,7 @@ pub trait RemoteReviewRepository: Send + Sync { comment: Option<&str>, watched_at: NaiveDateTime, poster_url: Option<&str>, + watch_medium: Option<&str>, ) -> Result<()>; async fn delete_by_actor(&self, actor_url: &str) -> Result<()>; diff --git a/crates/adapters/activitypub/src/review_handler.rs b/crates/adapters/activitypub/src/review_handler.rs index 458aa3f..b1199e2 100644 --- a/crates/adapters/activitypub/src/review_handler.rs +++ b/crates/adapters/activitypub/src/review_handler.rs @@ -120,6 +120,12 @@ impl ApObjectHandler for ReviewObjectHandler { )); let rating = Rating::new(obj.rating.min(5))?; let comment = obj.comment.map(Comment::new).transpose()?; + let watch_medium = obj + .watch_medium + .as_deref() + .map(|s| s.parse()) + .transpose() + .unwrap_or(None); let review = domain::models::Review::from_persistence(domain::models::PersistedReview { id: review_id, @@ -132,7 +138,7 @@ impl ApObjectHandler for ReviewObjectHandler { source: ReviewSource::Remote { actor_url: actor_url_str, }, - watch_medium: None, + watch_medium, }); self.review_store @@ -189,6 +195,7 @@ impl ApObjectHandler for ReviewObjectHandler { obj.comment.as_deref(), obj.watched_at.naive_utc(), obj.poster_url.as_deref(), + obj.watch_medium.as_deref(), ) .await?; diff --git a/crates/adapters/postgres-federation/src/review.rs b/crates/adapters/postgres-federation/src/review.rs index 711f1ae..ba5244f 100644 --- a/crates/adapters/postgres-federation/src/review.rs +++ b/crates/adapters/postgres-federation/src/review.rs @@ -79,15 +79,17 @@ impl RemoteReviewRepository for PostgresFederationRepository { comment: Option<&str>, watched_at: chrono::NaiveDateTime, poster_url: Option<&str>, + watch_medium: Option<&str>, ) -> Result<()> { let watched_at_str = datetime_to_str(&watched_at); sqlx::query( - "UPDATE reviews SET rating = $1, comment = $2, watched_at = $3::timestamptz - WHERE ap_id = $4 AND remote_actor_url = $5", + "UPDATE reviews SET rating = $1, comment = $2, watched_at = $3::timestamptz, watch_medium = $4 + WHERE ap_id = $5 AND remote_actor_url = $6", ) .bind(rating as i64) .bind(comment) .bind(&watched_at_str) + .bind(watch_medium) .bind(ap_id) .bind(actor_url) .execute(&self.pool) diff --git a/crates/adapters/sqlite-federation/src/review.rs b/crates/adapters/sqlite-federation/src/review.rs index 623cc5f..5527ff0 100644 --- a/crates/adapters/sqlite-federation/src/review.rs +++ b/crates/adapters/sqlite-federation/src/review.rs @@ -79,15 +79,17 @@ impl RemoteReviewRepository for SqliteFederationRepository { comment: Option<&str>, watched_at: chrono::NaiveDateTime, poster_url: Option<&str>, + watch_medium: Option<&str>, ) -> Result<()> { let watched_at_str = datetime_to_str(&watched_at); sqlx::query( - "UPDATE reviews SET rating = ?, comment = ?, watched_at = ? + "UPDATE reviews SET rating = ?, comment = ?, watched_at = ?, watch_medium = ? WHERE ap_id = ? AND remote_actor_url = ?", ) .bind(rating as i64) .bind(comment) .bind(&watched_at_str) + .bind(watch_medium) .bind(ap_id) .bind(actor_url) .execute(&self.pool)