2 activities::{generate_activity_id, send_lemmy_activity, verify_person_in_community},
4 objects::{community::ApubCommunity, person::ApubPerson},
5 protocol::activities::community::report::Report,
9 use activitypub_federation::{core::object_id::ObjectId, data::Data, traits::ActivityHandler};
10 use activitystreams_kinds::activity::FlagType;
11 use lemmy_api_common::{comment::CommentReportResponse, post::PostReportResponse, utils::blocking};
12 use lemmy_db_schema::{
14 comment_report::{CommentReport, CommentReportForm},
15 post_report::{PostReport, PostReportForm},
19 use lemmy_db_views::structs::{CommentReportView, PostReportView};
20 use lemmy_utils::error::LemmyError;
21 use lemmy_websocket::{messages::SendModRoomMessage, LemmyContext, UserOperation};
25 #[tracing::instrument(skip_all)]
27 object_id: ObjectId<PostOrComment>,
29 community_id: ObjectId<ApubCommunity>,
31 context: &LemmyContext,
32 ) -> Result<(), LemmyError> {
33 let community = community_id
34 .dereference_local::<LemmyError>(context)
36 let kind = FlagType::Flag;
37 let id = generate_activity_id(
39 &context.settings().get_protocol_and_hostname(),
42 actor: ObjectId::new(actor.actor_id()),
43 to: ObjectId::new(community.actor_id()),
48 unparsed: Default::default(),
55 vec![community.shared_inbox_or_inbox_url()],
62 #[async_trait::async_trait(?Send)]
63 impl ActivityHandler for Report {
64 type DataType = LemmyContext;
65 type Error = LemmyError;
67 fn id(&self) -> &Url {
71 fn actor(&self) -> &Url {
75 #[tracing::instrument(skip_all)]
78 context: &Data<LemmyContext>,
79 request_counter: &mut i32,
80 ) -> Result<(), LemmyError> {
83 .dereference::<LemmyError>(context, local_instance(context), request_counter)
85 verify_person_in_community(&self.actor, &community, context, request_counter).await?;
89 #[tracing::instrument(skip_all)]
92 context: &Data<LemmyContext>,
93 request_counter: &mut i32,
94 ) -> Result<(), LemmyError> {
97 .dereference::<LemmyError>(context, local_instance(context), request_counter)
101 .dereference::<LemmyError>(context, local_instance(context), request_counter)
104 PostOrComment::Post(post) => {
105 let report_form = PostReportForm {
106 creator_id: actor.id,
108 original_post_name: post.name.clone(),
109 original_post_url: post.url.clone(),
110 reason: self.summary,
111 original_post_body: post.body.clone(),
114 let report = blocking(context.pool(), move |conn| {
115 PostReport::report(conn, &report_form)
119 let post_report_view = blocking(context.pool(), move |conn| {
120 PostReportView::read(conn, report.id, actor.id)
124 context.chat_server().do_send(SendModRoomMessage {
125 op: UserOperation::CreateCommentReport,
126 response: PostReportResponse { post_report_view },
127 community_id: post.community_id,
131 PostOrComment::Comment(comment) => {
132 let report_form = CommentReportForm {
133 creator_id: actor.id,
134 comment_id: comment.id,
135 original_comment_text: comment.content.clone(),
136 reason: self.summary,
139 let report = blocking(context.pool(), move |conn| {
140 CommentReport::report(conn, &report_form)
144 let comment_report_view = blocking(context.pool(), move |conn| {
145 CommentReportView::read(conn, report.id, actor.id)
148 let community_id = comment_report_view.community.id;
150 context.chat_server().do_send(SendModRoomMessage {
151 op: UserOperation::CreateCommentReport,
152 response: CommentReportResponse {