X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapub%2Fsrc%2Factivities%2Fcommunity%2Freport.rs;h=67b84644e6b473078d7833823cdcb4780828178c;hb=e9e76549a88cfbdab36f00d302cceabcaaa24f4c;hp=1e7cc5fad96a570895f400ea9b08e781da0346e4;hpb=1bec551945a310cd34539da80e2f5e4139be32af;p=lemmy.git diff --git a/crates/apub/src/activities/community/report.rs b/crates/apub/src/activities/community/report.rs index 1e7cc5fa..67b84644 100644 --- a/crates/apub/src/activities/community/report.rs +++ b/crates/apub/src/activities/community/report.rs @@ -1,9 +1,22 @@ -use activitystreams::activity::kind::FlagType; - -use lemmy_api_common::{blocking, comment::CommentReportResponse, post::PostReportResponse}; -use lemmy_apub_lib::{ - data::Data, - traits::{ActivityHandler, ActorType}, +use crate::{ + activities::{generate_activity_id, send_lemmy_activity, verify_person_in_community}, + insert_received_activity, + objects::{community::ApubCommunity, person::ApubPerson}, + protocol::{activities::community::report::Report, InCommunity}, + PostOrComment, + SendActivity, +}; +use activitypub_federation::{ + config::Data, + fetch::object_id::ObjectId, + kinds::activity::FlagType, + traits::{ActivityHandler, Actor}, +}; +use lemmy_api_common::{ + comment::{CommentReportResponse, CreateCommentReport}, + context::LemmyContext, + post::{CreatePostReport, PostReportResponse}, + utils::local_user_view_from_jwt, }; use lemmy_db_schema::{ source::{ @@ -12,30 +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; -use crate::{ - activities::{ - generate_activity_id, - send_lemmy_activity, - verify_activity, - verify_person_in_community, - }, - fetcher::object_id::ObjectId, - objects::{community::ApubCommunity, person::ApubPerson}, - protocol::activities::community::report::Report, - PostOrComment, -}; +#[async_trait::async_trait] +impl SendActivity for CreatePostReport { + type Response = PostReportResponse; + + async fn send_activity( + request: &Self, + response: &Self::Response, + context: &Data, + ) -> 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, + ) -> 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, actor: &ApubPerson, community_id: ObjectId, reason: String, - context: &LemmyContext, + context: &Data, ) -> Result<(), LemmyError> { let community = community_id.dereference_local(context).await?; let kind = FlagType::Flag; @@ -44,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, - request_counter: &mut i32, - ) -> Result<(), LemmyError> { - verify_activity(self, &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) -> 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, - 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) -> 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, @@ -94,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 { @@ -119,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(())