]> Untitled Git - lemmy.git/blob - crates/api/src/private_message_report/create.rs
Sanitize html (#3708)
[lemmy.git] / crates / api / src / private_message_report / create.rs
1 use crate::{check_report_reason, Perform};
2 use actix_web::web::Data;
3 use lemmy_api_common::{
4   context::LemmyContext,
5   private_message::{CreatePrivateMessageReport, PrivateMessageReportResponse},
6   utils::{local_user_view_from_jwt, sanitize_html, send_new_report_email_to_admins},
7 };
8 use lemmy_db_schema::{
9   source::{
10     local_site::LocalSite,
11     private_message::PrivateMessage,
12     private_message_report::{PrivateMessageReport, PrivateMessageReportForm},
13   },
14   traits::{Crud, Reportable},
15 };
16 use lemmy_db_views::structs::PrivateMessageReportView;
17 use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType};
18
19 #[async_trait::async_trait(?Send)]
20 impl Perform for CreatePrivateMessageReport {
21   type Response = PrivateMessageReportResponse;
22
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?;
27
28     let reason = sanitize_html(self.reason.trim());
29     check_report_reason(&reason, &local_site)?;
30
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?;
34
35     let report_form = PrivateMessageReportForm {
36       creator_id: person_id,
37       private_message_id,
38       original_pm_text: private_message.content,
39       reason: reason.clone(),
40     };
41
42     let report = PrivateMessageReport::report(&mut context.pool(), &report_form)
43       .await
44       .with_lemmy_type(LemmyErrorType::CouldntCreateReport)?;
45
46     let private_message_report_view =
47       PrivateMessageReportView::read(&mut context.pool(), report.id).await?;
48
49     // Email the admins
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,
54         &mut context.pool(),
55         context.settings(),
56       )
57       .await?;
58     }
59
60     // TODO: consider federating this
61
62     Ok(PrivateMessageReportResponse {
63       private_message_report_view,
64     })
65   }
66 }