]> Untitled Git - lemmy.git/blobdiff - crates/apub/src/activities/community/announce.rs
Adding unique constraint for activity ap_id. Fixes #1878 (#1935)
[lemmy.git] / crates / apub / src / activities / community / announce.rs
index 4eebcce38d7bf6331d5882f06c28581371f22690..cc30a89f393185ba29b62346bb3c70c2b955eafd 100644 (file)
@@ -1,12 +1,12 @@
 use crate::{
   activities::{generate_activity_id, send_lemmy_activity, verify_activity, verify_is_public},
   activity_lists::AnnouncableActivities,
-  http::{is_activity_already_known, ActivityCommonFields},
+  http::ActivityCommonFields,
   insert_activity,
   objects::community::ApubCommunity,
-  protocol::activities::community::announce::AnnounceActivity,
+  protocol::activities::{community::announce::AnnounceActivity, CreateOrUpdateType},
 };
-use activitystreams::{activity::kind::AnnounceType, public};
+use activitystreams_kinds::{activity::AnnounceType, public};
 use lemmy_apub_lib::{
   data::Data,
   object_id::ObjectId,
@@ -25,7 +25,7 @@ pub(crate) trait GetCommunity {
 }
 
 impl AnnounceActivity {
-  fn new(
+  pub(crate) fn new(
     object: AnnouncableActivities,
     community: &ApubCommunity,
     context: &LemmyContext,
@@ -61,13 +61,11 @@ impl AnnounceActivity {
     )
     .await?;
 
-    // Pleroma (and likely Mastodon) can't handle activities like Announce/Create/Page. So for
-    // compatibility to allow them to follow Lemmy communities, we also send Announce/Page and
-    // Announce/Note (for new and updated posts/comments).
+    // Pleroma and Mastodon can't handle activities like Announce/Create/Page. So for
+    // compatibility, we also send Announce/Page so that they can follow Lemmy communities.
     use AnnouncableActivities::*;
     let object = match object {
-      CreateOrUpdatePost(c) => Page(c.object),
-      CreateOrUpdateComment(c) => Note(c.object),
+      CreateOrUpdatePost(c) if c.kind == CreateOrUpdateType::Create => Page(c.object),
       _ => return Ok(()),
     };
     let announce_compat = AnnounceActivity::new(object, community, context)?;
@@ -103,13 +101,17 @@ impl ActivityHandler for AnnounceActivity {
     context: &Data<LemmyContext>,
     request_counter: &mut i32,
   ) -> Result<(), LemmyError> {
-    let object_value = serde_json::to_value(&self.object)?;
-    let object_data: ActivityCommonFields = serde_json::from_value(object_value.to_owned())?;
+    // TODO: this can probably be implemented in a cleaner way
+    match self.object {
+      // Dont insert these into activities table, as they are not activities.
+      AnnouncableActivities::Page(_) => {}
+      _ => {
+        let object_value = serde_json::to_value(&self.object)?;
+        let object_data: ActivityCommonFields = serde_json::from_value(object_value.to_owned())?;
 
-    if is_activity_already_known(context.pool(), &object_data.id).await? {
-      return Ok(());
+        insert_activity(&object_data.id, object_value, false, true, context.pool()).await?;
+      }
     }
-    insert_activity(&object_data.id, object_value, false, true, context.pool()).await?;
     self.object.receive(context, request_counter).await
   }
 }