6 verify_person_in_community,
8 objects::{community::ApubCommunity, person::ApubPerson},
9 protocol::activities::community::report::Report,
12 use activitystreams::activity::kind::FlagType;
13 use lemmy_api_common::{blocking, comment::CommentReportResponse, post::PostReportResponse};
17 traits::{ActivityHandler, ActorType},
19 use lemmy_db_schema::{
21 comment_report::{CommentReport, CommentReportForm},
22 post_report::{PostReport, PostReportForm},
26 use lemmy_db_views::{comment_report_view::CommentReportView, post_report_view::PostReportView};
27 use lemmy_utils::LemmyError;
28 use lemmy_websocket::{messages::SendModRoomMessage, LemmyContext, UserOperation};
32 object_id: ObjectId<PostOrComment>,
34 community_id: ObjectId<ApubCommunity>,
36 context: &LemmyContext,
37 ) -> Result<(), LemmyError> {
38 let community = community_id.dereference_local(context).await?;
39 let kind = FlagType::Flag;
40 let id = generate_activity_id(
42 &context.settings().get_protocol_and_hostname(),
45 actor: ObjectId::new(actor.actor_id()),
46 to: [ObjectId::new(community.actor_id())],
51 unparsed: Default::default(),
58 vec![community.shared_inbox_or_inbox_url()],
65 #[async_trait::async_trait(?Send)]
66 impl ActivityHandler for Report {
67 type DataType = LemmyContext;
70 context: &Data<LemmyContext>,
71 request_counter: &mut i32,
72 ) -> Result<(), LemmyError> {
73 verify_activity(&self.id, self.actor.inner(), &context.settings())?;
74 let community = self.to[0].dereference(context, request_counter).await?;
75 verify_person_in_community(&self.actor, &community, context, request_counter).await?;
81 context: &Data<LemmyContext>,
82 request_counter: &mut i32,
83 ) -> Result<(), LemmyError> {
84 let actor = self.actor.dereference(context, request_counter).await?;
85 match self.object.dereference(context, request_counter).await? {
86 PostOrComment::Post(post) => {
87 let report_form = PostReportForm {
90 original_post_name: post.name.clone(),
91 original_post_url: post.url.clone(),
93 original_post_body: post.body.clone(),
96 let report = blocking(context.pool(), move |conn| {
97 PostReport::report(conn, &report_form)
101 let post_report_view = blocking(context.pool(), move |conn| {
102 PostReportView::read(conn, report.id, actor.id)
106 context.chat_server().do_send(SendModRoomMessage {
107 op: UserOperation::CreateCommentReport,
108 response: PostReportResponse { post_report_view },
109 community_id: post.community_id,
113 PostOrComment::Comment(comment) => {
114 let report_form = CommentReportForm {
115 creator_id: actor.id,
116 comment_id: comment.id,
117 original_comment_text: comment.content.clone(),
118 reason: self.summary,
121 let report = blocking(context.pool(), move |conn| {
122 CommentReport::report(conn, &report_form)
126 let comment_report_view = blocking(context.pool(), move |conn| {
127 CommentReportView::read(conn, report.id, actor.id)
130 let community_id = comment_report_view.community.id;
132 context.chat_server().do_send(SendModRoomMessage {
133 op: UserOperation::CreateCommentReport,
134 response: CommentReportResponse {