1 use crate::{check_report_reason, Perform};
2 use actix_web::web::Data;
3 use lemmy_api_common::{
5 private_message::{CreatePrivateMessageReport, PrivateMessageReportResponse},
6 utils::{local_user_view_from_jwt, sanitize_html, send_new_report_email_to_admins},
10 local_site::LocalSite,
11 private_message::PrivateMessage,
12 private_message_report::{PrivateMessageReport, PrivateMessageReportForm},
14 traits::{Crud, Reportable},
16 use lemmy_db_views::structs::PrivateMessageReportView;
17 use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType};
19 #[async_trait::async_trait(?Send)]
20 impl Perform for CreatePrivateMessageReport {
21 type Response = PrivateMessageReportResponse;
23 #[tracing::instrument(skip(context))]
24 async fn perform(&self, context: &Data<LemmyContext>) -> Result<Self::Response, LemmyError> {
25 let local_user_view = local_user_view_from_jwt(&self.auth, context).await?;
26 let local_site = LocalSite::read(&mut context.pool()).await?;
28 let reason = sanitize_html(self.reason.trim());
29 check_report_reason(&reason, &local_site)?;
31 let person_id = local_user_view.person.id;
32 let private_message_id = self.private_message_id;
33 let private_message = PrivateMessage::read(&mut context.pool(), private_message_id).await?;
35 let report_form = PrivateMessageReportForm {
36 creator_id: person_id,
38 original_pm_text: private_message.content,
39 reason: reason.clone(),
42 let report = PrivateMessageReport::report(&mut context.pool(), &report_form)
44 .with_lemmy_type(LemmyErrorType::CouldntCreateReport)?;
46 let private_message_report_view =
47 PrivateMessageReportView::read(&mut context.pool(), report.id).await?;
50 if local_site.reports_email_admins {
51 send_new_report_email_to_admins(
52 &private_message_report_view.creator.name,
53 &private_message_report_view.private_message_creator.name,
60 // TODO: consider federating this
62 Ok(PrivateMessageReportResponse {
63 private_message_report_view,