]> Untitled Git - lemmy.git/blobdiff - crates/apub/src/activities/community/report.rs
Split activity table into sent and received parts (fixes #3103) (#3583)
[lemmy.git] / crates / apub / src / activities / community / report.rs
index 5b02490b0071d246d3b8c5046a0d2040054ee428..67b84644e6b473078d7833823cdcb4780828178c 100644 (file)
@@ -1,20 +1,22 @@
 use crate::{
-  activities::{
-    generate_activity_id,
-    send_lemmy_activity,
-    verify_activity,
-    verify_person_in_community,
-  },
-  fetcher::object_id::ObjectId,
+  activities::{generate_activity_id, send_lemmy_activity, verify_person_in_community},
+  insert_received_activity,
   objects::{community::ApubCommunity, person::ApubPerson},
-  protocol::activities::community::report::Report,
+  protocol::{activities::community::report::Report, InCommunity},
   PostOrComment,
+  SendActivity,
+};
+use activitypub_federation::{
+  config::Data,
+  fetch::object_id::ObjectId,
+  kinds::activity::FlagType,
+  traits::{ActivityHandler, Actor},
 };
-use activitystreams::activity::kind::FlagType;
-use lemmy_api_common::{blocking, comment::CommentReportResponse, post::PostReportResponse};
-use lemmy_apub_lib::{
-  data::Data,
-  traits::{ActivityHandler, ActorType},
+use lemmy_api_common::{
+  comment::{CommentReportResponse, CreateCommentReport},
+  context::LemmyContext,
+  post::{CreatePostReport, PostReportResponse},
+  utils::local_user_view_from_jwt,
 };
 use lemmy_db_schema::{
   source::{
@@ -23,17 +25,59 @@ use lemmy_db_schema::{
   },
   traits::Reportable,
 };
-use lemmy_db_views::{comment_report_view::CommentReportView, post_report_view::PostReportView};
-use lemmy_utils::LemmyError;
-use lemmy_websocket::{messages::SendModRoomMessage, LemmyContext, UserOperation};
+use lemmy_utils::error::LemmyError;
+use url::Url;
+
+#[async_trait::async_trait]
+impl SendActivity for CreatePostReport {
+  type Response = PostReportResponse;
+
+  async fn send_activity(
+    request: &Self,
+    response: &Self::Response,
+    context: &Data<LemmyContext>,
+  ) -> Result<(), LemmyError> {
+    let local_user_view = local_user_view_from_jwt(&request.auth, context).await?;
+    Report::send(
+      ObjectId::from(response.post_report_view.post.ap_id.clone()),
+      &local_user_view.person.into(),
+      ObjectId::from(response.post_report_view.community.actor_id.clone()),
+      request.reason.to_string(),
+      context,
+    )
+    .await
+  }
+}
+
+#[async_trait::async_trait]
+impl SendActivity for CreateCommentReport {
+  type Response = CommentReportResponse;
+
+  async fn send_activity(
+    request: &Self,
+    response: &Self::Response,
+    context: &Data<LemmyContext>,
+  ) -> Result<(), LemmyError> {
+    let local_user_view = local_user_view_from_jwt(&request.auth, context).await?;
+    Report::send(
+      ObjectId::from(response.comment_report_view.comment.ap_id.clone()),
+      &local_user_view.person.into(),
+      ObjectId::from(response.comment_report_view.community.actor_id.clone()),
+      request.reason.to_string(),
+      context,
+    )
+    .await
+  }
+}
 
 impl Report {
-  pub async fn send(
+  #[tracing::instrument(skip_all)]
+  async fn send(
     object_id: ObjectId<PostOrComment>,
     actor: &ApubPerson,
     community_id: ObjectId<ApubCommunity>,
     reason: String,
-    context: &LemmyContext,
+    context: &Data<LemmyContext>,
   ) -> Result<(), LemmyError> {
     let community = community_id.dereference_local(context).await?;
     let kind = FlagType::Flag;
@@ -42,47 +86,45 @@ impl Report {
       &context.settings().get_protocol_and_hostname(),
     )?;
     let report = Report {
-      actor: ObjectId::new(actor.actor_id()),
-      to: [ObjectId::new(community.actor_id())],
+      actor: actor.id().into(),
+      to: [community.id().into()],
       object: object_id,
       summary: reason,
       kind,
       id: id.clone(),
-      unparsed: Default::default(),
+      audience: Some(community.id().into()),
     };
-    send_lemmy_activity(
-      context,
-      &report,
-      &id,
-      actor,
-      vec![community.shared_inbox_or_inbox_url()],
-      false,
-    )
-    .await
+
+    let inbox = vec![community.shared_inbox_or_inbox()];
+    send_lemmy_activity(context, report, actor, inbox, false).await
   }
 }
 
-#[async_trait::async_trait(?Send)]
+#[async_trait::async_trait]
 impl ActivityHandler for Report {
   type DataType = LemmyContext;
-  async fn verify(
-    &self,
-    context: &Data<LemmyContext>,
-    request_counter: &mut i32,
-  ) -> Result<(), LemmyError> {
-    verify_activity(&self.id, self.actor.inner(), &context.settings())?;
-    let community = self.to[0].dereference(context, request_counter).await?;
-    verify_person_in_community(&self.actor, &community, context, request_counter).await?;
+  type Error = LemmyError;
+
+  fn id(&self) -> &Url {
+    &self.id
+  }
+
+  fn actor(&self) -> &Url {
+    self.actor.inner()
+  }
+
+  #[tracing::instrument(skip_all)]
+  async fn verify(&self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
+    insert_received_activity(&self.id, context).await?;
+    let community = self.community(context).await?;
+    verify_person_in_community(&self.actor, &community, context).await?;
     Ok(())
   }
 
-  async fn receive(
-    self,
-    context: &Data<LemmyContext>,
-    request_counter: &mut i32,
-  ) -> Result<(), LemmyError> {
-    let actor = self.actor.dereference(context, request_counter).await?;
-    match self.object.dereference(context, request_counter).await? {
+  #[tracing::instrument(skip_all)]
+  async fn receive(self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
+    let actor = self.actor.dereference(context).await?;
+    match self.object.dereference(context).await? {
       PostOrComment::Post(post) => {
         let report_form = PostReportForm {
           creator_id: actor.id,
@@ -92,23 +134,7 @@ impl ActivityHandler for Report {
           reason: self.summary,
           original_post_body: post.body.clone(),
         };
-
-        let report = blocking(context.pool(), move |conn| {
-          PostReport::report(conn, &report_form)
-        })
-        .await??;
-
-        let post_report_view = blocking(context.pool(), move |conn| {
-          PostReportView::read(conn, report.id, actor.id)
-        })
-        .await??;
-
-        context.chat_server().do_send(SendModRoomMessage {
-          op: UserOperation::CreateCommentReport,
-          response: PostReportResponse { post_report_view },
-          community_id: post.community_id,
-          websocket_id: None,
-        });
+        PostReport::report(&mut context.pool(), &report_form).await?;
       }
       PostOrComment::Comment(comment) => {
         let report_form = CommentReportForm {
@@ -117,26 +143,7 @@ impl ActivityHandler for Report {
           original_comment_text: comment.content.clone(),
           reason: self.summary,
         };
-
-        let report = blocking(context.pool(), move |conn| {
-          CommentReport::report(conn, &report_form)
-        })
-        .await??;
-
-        let comment_report_view = blocking(context.pool(), move |conn| {
-          CommentReportView::read(conn, report.id, actor.id)
-        })
-        .await??;
-        let community_id = comment_report_view.community.id;
-
-        context.chat_server().do_send(SendModRoomMessage {
-          op: UserOperation::CreateCommentReport,
-          response: CommentReportResponse {
-            comment_report_view,
-          },
-          community_id,
-          websocket_id: None,
-        });
+        CommentReport::report(&mut context.pool(), &report_form).await?;
       }
     };
     Ok(())