]> Untitled Git - lemmy.git/commitdiff
Remove DeletableApubObject trait
authorFelix Ableitner <me@nutomic.com>
Sat, 16 Oct 2021 11:14:02 +0000 (13:14 +0200)
committerFelix Ableitner <me@nutomic.com>
Wed, 20 Oct 2021 10:20:54 +0000 (12:20 +0200)
crates/apub/src/fetcher/deletable_apub_object.rs [deleted file]
crates/apub/src/fetcher/mod.rs
crates/apub/src/fetcher/object_id.rs
crates/apub/src/fetcher/post_or_comment.rs
crates/apub/src/fetcher/search.rs
crates/apub_lib/src/traits.rs
crates/db_schema/src/source/comment.rs
crates/db_schema/src/source/community.rs
crates/db_schema/src/source/person.rs
crates/db_schema/src/source/post.rs
crates/db_schema/src/source/private_message.rs

diff --git a/crates/apub/src/fetcher/deletable_apub_object.rs b/crates/apub/src/fetcher/deletable_apub_object.rs
deleted file mode 100644 (file)
index 503949e..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-use crate::fetcher::post_or_comment::PostOrComment;
-use lemmy_api_common::blocking;
-use lemmy_db_queries::source::{
-  comment::Comment_,
-  community::Community_,
-  person::Person_,
-  post::Post_,
-};
-use lemmy_db_schema::source::{
-  comment::Comment,
-  community::Community,
-  person::Person,
-  post::Post,
-  private_message::PrivateMessage,
-};
-use lemmy_utils::LemmyError;
-use lemmy_websocket::LemmyContext;
-
-// TODO: merge this trait with ApubObject (means that db_schema needs to depend on apub_lib)
-#[async_trait::async_trait(?Send)]
-pub trait DeletableApubObject {
-  // TODO: pass in tombstone with summary field, to decide between remove/delete
-  async fn delete(self, context: &LemmyContext) -> Result<(), LemmyError>;
-}
-
-#[async_trait::async_trait(?Send)]
-impl DeletableApubObject for Community {
-  async fn delete(self, context: &LemmyContext) -> Result<(), LemmyError> {
-    let id = self.id;
-    blocking(context.pool(), move |conn| {
-      Community::update_deleted(conn, id, true)
-    })
-    .await??;
-    Ok(())
-  }
-}
-
-#[async_trait::async_trait(?Send)]
-impl DeletableApubObject for Person {
-  async fn delete(self, context: &LemmyContext) -> Result<(), LemmyError> {
-    let id = self.id;
-    blocking(context.pool(), move |conn| Person::delete_account(conn, id)).await??;
-    Ok(())
-  }
-}
-
-#[async_trait::async_trait(?Send)]
-impl DeletableApubObject for Post {
-  async fn delete(self, context: &LemmyContext) -> Result<(), LemmyError> {
-    let id = self.id;
-    blocking(context.pool(), move |conn| {
-      Post::update_deleted(conn, id, true)
-    })
-    .await??;
-    Ok(())
-  }
-}
-
-#[async_trait::async_trait(?Send)]
-impl DeletableApubObject for Comment {
-  async fn delete(self, context: &LemmyContext) -> Result<(), LemmyError> {
-    let id = self.id;
-    blocking(context.pool(), move |conn| {
-      Comment::update_deleted(conn, id, true)
-    })
-    .await??;
-    Ok(())
-  }
-}
-
-#[async_trait::async_trait(?Send)]
-impl DeletableApubObject for PostOrComment {
-  async fn delete(self, context: &LemmyContext) -> Result<(), LemmyError> {
-    match self {
-      PostOrComment::Comment(c) => {
-        blocking(context.pool(), move |conn| {
-          Comment::update_deleted(conn, c.id, true)
-        })
-        .await??;
-      }
-      PostOrComment::Post(p) => {
-        blocking(context.pool(), move |conn| {
-          Post::update_deleted(conn, p.id, true)
-        })
-        .await??;
-      }
-    }
-
-    Ok(())
-  }
-}
-
-#[async_trait::async_trait(?Send)]
-impl DeletableApubObject for PrivateMessage {
-  async fn delete(self, _context: &LemmyContext) -> Result<(), LemmyError> {
-    // do nothing, because pm can't be fetched over http
-    unimplemented!()
-  }
-}
index b1b9e9ad44beb58bac52636827949dd47f269c79..641d59f02359edbba2c2e8af06374988371ad190 100644 (file)
@@ -1,5 +1,4 @@
 pub mod community;
-pub mod deletable_apub_object;
 mod fetch;
 pub mod object_id;
 pub mod post_or_comment;
index 69d7c02898e3062ac0df90d1b796b7a1be562a85..14e983bb381613a45a540dd8f2ca99f5246b6cf5 100644 (file)
@@ -1,7 +1,4 @@
-use crate::{
-  fetcher::{deletable_apub_object::DeletableApubObject, should_refetch_actor},
-  objects::FromApub,
-};
+use crate::{fetcher::should_refetch_actor, objects::FromApub};
 use anyhow::anyhow;
 use diesel::{NotFound, PgConnection};
 use lemmy_api_common::blocking;
@@ -26,12 +23,12 @@ static REQUEST_LIMIT: i32 = 25;
 #[derive(Clone, PartialEq, Serialize, Deserialize, Debug)]
 pub struct ObjectId<Kind>(Url, #[serde(skip)] PhantomData<Kind>)
 where
-  Kind: FromApub + ApubObject<DataType = PgConnection> + DeletableApubObject + Send + 'static,
+  Kind: FromApub + ApubObject<DataType = PgConnection> + Send + 'static,
   for<'de2> <Kind as FromApub>::ApubType: serde::Deserialize<'de2>;
 
 impl<Kind> ObjectId<Kind>
 where
-  Kind: FromApub + ApubObject<DataType = PgConnection> + DeletableApubObject + Send + 'static,
+  Kind: FromApub + ApubObject<DataType = PgConnection> + Send + 'static,
   for<'de> <Kind as FromApub>::ApubType: serde::Deserialize<'de>,
 {
   pub fn new<T>(url: T) -> Self
@@ -117,7 +114,7 @@ where
 
     if res.status() == StatusCode::GONE {
       if let Some(db_object) = db_object {
-        db_object.delete(context).await?;
+        blocking(context.pool(), move |conn| db_object.delete(conn)).await??;
       }
       return Err(anyhow!("Fetched remote object {} which was deleted", self).into());
     }
@@ -130,7 +127,7 @@ where
 
 impl<Kind> Display for ObjectId<Kind>
 where
-  Kind: FromApub + ApubObject<DataType = PgConnection> + DeletableApubObject + Send + 'static,
+  Kind: FromApub + ApubObject<DataType = PgConnection> + Send + 'static,
   for<'de> <Kind as FromApub>::ApubType: serde::Deserialize<'de>,
 {
   fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
@@ -140,7 +137,7 @@ where
 
 impl<Kind> From<ObjectId<Kind>> for Url
 where
-  Kind: FromApub + ApubObject<DataType = PgConnection> + DeletableApubObject + Send + 'static,
+  Kind: FromApub + ApubObject<DataType = PgConnection> + Send + 'static,
   for<'de> <Kind as FromApub>::ApubType: serde::Deserialize<'de>,
 {
   fn from(id: ObjectId<Kind>) -> Self {
@@ -150,7 +147,7 @@ where
 
 impl<Kind> From<ObjectId<Kind>> for DbUrl
 where
-  Kind: FromApub + ApubObject<DataType = PgConnection> + DeletableApubObject + Send + 'static,
+  Kind: FromApub + ApubObject<DataType = PgConnection> + Send + 'static,
   for<'de> <Kind as FromApub>::ApubType: serde::Deserialize<'de>,
 {
   fn from(id: ObjectId<Kind>) -> Self {
index 23fc709d616bc255fda263b14c730e20c69ce0f5..9d700c96043f40e83271718a8e962999113e8be1 100644 (file)
@@ -48,6 +48,13 @@ impl ApubObject for PostOrComment {
       None => Comment::read_from_apub_id(conn, object_id)?.map(PostOrComment::Comment),
     })
   }
+
+  fn delete(self, data: &Self::DataType) -> Result<(), LemmyError> {
+    match self {
+      PostOrComment::Post(p) => p.delete(data),
+      PostOrComment::Comment(c) => c.delete(data),
+    }
+  }
 }
 
 #[async_trait::async_trait(?Send)]
index c8ac0d92539c13614c7b2998062474734d69ab51..9fcf5a79ce33e816debd3bc94e3577a0522ea097 100644 (file)
@@ -1,5 +1,5 @@
 use crate::{
-  fetcher::{deletable_apub_object::DeletableApubObject, object_id::ObjectId},
+  fetcher::object_id::ObjectId,
   objects::{comment::Note, community::Group, person::Person as ApubPerson, post::Page, FromApub},
 };
 use activitystreams::chrono::NaiveDateTime;
@@ -136,6 +136,15 @@ impl ApubObject for SearchableObjects {
     }
     Ok(None)
   }
+
+  fn delete(self, conn: &Self::DataType) -> Result<(), LemmyError> {
+    match self {
+      SearchableObjects::Person(p) => p.delete(conn),
+      SearchableObjects::Community(c) => c.delete(conn),
+      SearchableObjects::Post(p) => p.delete(conn),
+      SearchableObjects::Comment(c) => c.delete(conn),
+    }
+  }
 }
 
 #[async_trait::async_trait(?Send)]
@@ -158,15 +167,3 @@ impl FromApub for SearchableObjects {
     })
   }
 }
-
-#[async_trait::async_trait(?Send)]
-impl DeletableApubObject for SearchableObjects {
-  async fn delete(self, context: &LemmyContext) -> Result<(), LemmyError> {
-    match self {
-      SearchableObjects::Person(p) => p.delete(context).await,
-      SearchableObjects::Community(c) => c.delete(context).await,
-      SearchableObjects::Post(p) => p.delete(context).await,
-      SearchableObjects::Comment(c) => c.delete(context).await,
-    }
-  }
-}
index f8cdba0a08a47b4fb48ac1446eee1c12bd0cc4b8..16fb3f8e3c9c890bac7117a33422d0be0dde576a 100644 (file)
@@ -36,6 +36,8 @@ pub trait ApubObject {
   fn read_from_apub_id(data: &Self::DataType, object_id: Url) -> Result<Option<Self>, LemmyError>
   where
     Self: Sized;
+  /// Marks the object as deleted in local db. Called when a tombstone is received.
+  fn delete(self, data: &Self::DataType) -> Result<(), LemmyError>;
 }
 
 /// Common methods provided by ActivityPub actors (community and person). Not all methods are
index 63062d1dda08c661dd090d3e55866f9b9421b7ce..54e8221f99307023872fc885a0e17c09b57fac59 100644 (file)
@@ -1,4 +1,5 @@
 use crate::{
+  naive_now,
   schema::{comment, comment_alias_1, comment_like, comment_saved},
   source::post::Post,
   CommentId,
@@ -126,4 +127,14 @@ impl ApubObject for Comment {
     let object_id: DbUrl = object_id.into();
     Ok(comment.filter(ap_id.eq(object_id)).first::<Self>(conn).ok())
   }
+
+  // TODO: duplicate code from Comment::update_deleted(), we should really move all impls to
+  //       this crate so we can call that function from here
+  fn delete(self, conn: &PgConnection) -> Result<(), LemmyError> {
+    use crate::schema::comment::dsl::*;
+    diesel::update(comment.find(self.id))
+      .set((deleted.eq(true), updated.eq(naive_now())))
+      .get_result::<Self>(conn)?;
+    Ok(())
+  }
 }
index f90bab13d67902b18b902b83bec3a3cc50b5b848..365ddba7f6ca1745f66e2f01d002abeb249bab01 100644 (file)
@@ -1,4 +1,5 @@
 use crate::{
+  naive_now,
   schema::{community, community_follower, community_moderator, community_person_ban},
   CommunityId,
   DbUrl,
@@ -147,6 +148,14 @@ impl ApubObject for Community {
         .ok(),
     )
   }
+
+  fn delete(self, conn: &PgConnection) -> Result<(), LemmyError> {
+    use crate::schema::community::dsl::*;
+    diesel::update(community.find(self.id))
+      .set((deleted.eq(true), updated.eq(naive_now())))
+      .get_result::<Self>(conn)?;
+    Ok(())
+  }
 }
 
 impl ActorType for Community {
index 03fb821faba27dfdeb6fa940ee17ce70f40163f2..f71f39dc91450116659ddbb194ad77126cee54bb 100644 (file)
@@ -1,4 +1,5 @@
 use crate::{
+  naive_now,
   schema::{person, person_alias_1, person_alias_2},
   DbUrl,
   PersonId,
@@ -194,6 +195,14 @@ impl ApubObject for Person {
         .ok(),
     )
   }
+
+  fn delete(self, conn: &PgConnection) -> Result<(), LemmyError> {
+    use crate::schema::person::dsl::*;
+    diesel::update(person.find(self.id))
+      .set((deleted.eq(true), updated.eq(naive_now())))
+      .get_result::<Self>(conn)?;
+    Ok(())
+  }
 }
 
 impl ActorType for Person {
index a09e88395a05a27229e117d4a60db8ce28c1e700..d28599c596cf9d7efbd8d0a607e5a8afdf94dbc6 100644 (file)
@@ -1,4 +1,5 @@
 use crate::{
+  naive_now,
   schema::{post, post_like, post_read, post_saved},
   CommunityId,
   DbUrl,
@@ -124,4 +125,12 @@ impl ApubObject for Post {
     let object_id: DbUrl = object_id.into();
     Ok(post.filter(ap_id.eq(object_id)).first::<Self>(conn).ok())
   }
+
+  fn delete(self, conn: &PgConnection) -> Result<(), LemmyError> {
+    use crate::schema::post::dsl::*;
+    diesel::update(post.find(self.id))
+      .set((deleted.eq(true), updated.eq(naive_now())))
+      .get_result::<Self>(conn)?;
+    Ok(())
+  }
 }
index a867ce93e18b69b5e896cd17802b9d5d6d2a9ed4..6247cb955be66eb3d44c3f69c60dabcfe16c674d 100644 (file)
@@ -54,4 +54,9 @@ impl ApubObject for PrivateMessage {
         .ok(),
     )
   }
+
+  fn delete(self, _conn: &PgConnection) -> Result<(), LemmyError> {
+    // do nothing, because pm can't be fetched over http
+    unimplemented!()
+  }
 }