2 activities::{generate_activity_id, send_lemmy_activity, verify_person_in_community},
4 objects::{community::ApubCommunity, person::ApubPerson},
5 protocol::{activities::community::report::Report, InCommunity},
10 use activitypub_federation::{
11 core::object_id::ObjectId,
13 traits::{ActivityHandler, Actor},
15 use activitystreams_kinds::activity::FlagType;
16 use lemmy_api_common::{
17 comment::{CommentReportResponse, CreateCommentReport},
18 context::LemmyContext,
19 post::{CreatePostReport, PostReportResponse},
20 utils::get_local_user_view_from_jwt,
21 websocket::{messages::SendModRoomMessage, UserOperation},
23 use lemmy_db_schema::{
25 comment_report::{CommentReport, CommentReportForm},
26 post_report::{PostReport, PostReportForm},
30 use lemmy_db_views::structs::{CommentReportView, PostReportView};
31 use lemmy_utils::error::LemmyError;
34 #[async_trait::async_trait(?Send)]
35 impl SendActivity for CreatePostReport {
36 type Response = PostReportResponse;
38 async fn send_activity(
40 response: &Self::Response,
41 context: &LemmyContext,
42 ) -> Result<(), LemmyError> {
44 get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
46 ObjectId::new(response.post_report_view.post.ap_id.clone()),
47 &local_user_view.person.into(),
48 ObjectId::new(response.post_report_view.community.actor_id.clone()),
49 request.reason.to_string(),
56 #[async_trait::async_trait(?Send)]
57 impl SendActivity for CreateCommentReport {
58 type Response = CommentReportResponse;
60 async fn send_activity(
62 response: &Self::Response,
63 context: &LemmyContext,
64 ) -> Result<(), LemmyError> {
66 get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
68 ObjectId::new(response.comment_report_view.comment.ap_id.clone()),
69 &local_user_view.person.into(),
70 ObjectId::new(response.comment_report_view.community.actor_id.clone()),
71 request.reason.to_string(),
79 #[tracing::instrument(skip_all)]
81 object_id: ObjectId<PostOrComment>,
83 community_id: ObjectId<ApubCommunity>,
85 context: &LemmyContext,
86 ) -> Result<(), LemmyError> {
87 let community = community_id.dereference_local(context).await?;
88 let kind = FlagType::Flag;
89 let id = generate_activity_id(
91 &context.settings().get_protocol_and_hostname(),
94 actor: ObjectId::new(actor.actor_id()),
95 to: [ObjectId::new(community.actor_id())],
100 audience: Some(ObjectId::new(community.actor_id())),
103 let inbox = vec![community.shared_inbox_or_inbox()];
104 send_lemmy_activity(context, report, actor, inbox, false).await
108 #[async_trait::async_trait(?Send)]
109 impl ActivityHandler for Report {
110 type DataType = LemmyContext;
111 type Error = LemmyError;
113 fn id(&self) -> &Url {
117 fn actor(&self) -> &Url {
121 #[tracing::instrument(skip_all)]
124 context: &Data<LemmyContext>,
125 request_counter: &mut i32,
126 ) -> Result<(), LemmyError> {
127 let community = self.community(context, request_counter).await?;
128 verify_person_in_community(&self.actor, &community, context, request_counter).await?;
132 #[tracing::instrument(skip_all)]
135 context: &Data<LemmyContext>,
136 request_counter: &mut i32,
137 ) -> Result<(), LemmyError> {
140 .dereference(context, local_instance(context).await, request_counter)
144 .dereference(context, local_instance(context).await, request_counter)
147 PostOrComment::Post(post) => {
148 let report_form = PostReportForm {
149 creator_id: actor.id,
151 original_post_name: post.name.clone(),
152 original_post_url: post.url.clone(),
153 reason: self.summary,
154 original_post_body: post.body.clone(),
157 let report = PostReport::report(context.pool(), &report_form).await?;
159 let post_report_view = PostReportView::read(context.pool(), report.id, actor.id).await?;
161 context.chat_server().do_send(SendModRoomMessage {
162 op: UserOperation::CreateCommentReport,
163 response: PostReportResponse { post_report_view },
164 community_id: post.community_id,
168 PostOrComment::Comment(comment) => {
169 let report_form = CommentReportForm {
170 creator_id: actor.id,
171 comment_id: comment.id,
172 original_comment_text: comment.content.clone(),
173 reason: self.summary,
176 let report = CommentReport::report(context.pool(), &report_form).await?;
178 let comment_report_view =
179 CommentReportView::read(context.pool(), report.id, actor.id).await?;
180 let community_id = comment_report_view.community.id;
182 context.chat_server().do_send(SendModRoomMessage {
183 op: UserOperation::CreateCommentReport,
184 response: CommentReportResponse {