]> Untitled Git - lemmy.git/blob - crates/api_crud/src/private_message/update.rs
Sanitize html (#3708)
[lemmy.git] / crates / api_crud / src / private_message / update.rs
1 use crate::PerformCrud;
2 use actix_web::web::Data;
3 use lemmy_api_common::{
4   context::LemmyContext,
5   private_message::{EditPrivateMessage, PrivateMessageResponse},
6   utils::{local_site_to_slur_regex, local_user_view_from_jwt, sanitize_html},
7 };
8 use lemmy_db_schema::{
9   source::{
10     local_site::LocalSite,
11     private_message::{PrivateMessage, PrivateMessageUpdateForm},
12   },
13   traits::Crud,
14   utils::naive_now,
15 };
16 use lemmy_db_views::structs::PrivateMessageView;
17 use lemmy_utils::{
18   error::{LemmyError, LemmyErrorExt, LemmyErrorType},
19   utils::{slurs::remove_slurs, validation::is_valid_body_field},
20 };
21
22 #[async_trait::async_trait(?Send)]
23 impl PerformCrud for EditPrivateMessage {
24   type Response = PrivateMessageResponse;
25
26   #[tracing::instrument(skip(self, context))]
27   async fn perform(
28     &self,
29     context: &Data<LemmyContext>,
30   ) -> Result<PrivateMessageResponse, LemmyError> {
31     let data: &EditPrivateMessage = self;
32     let local_user_view = local_user_view_from_jwt(&data.auth, context).await?;
33     let local_site = LocalSite::read(&mut context.pool()).await?;
34
35     // Checking permissions
36     let private_message_id = data.private_message_id;
37     let orig_private_message =
38       PrivateMessage::read(&mut context.pool(), private_message_id).await?;
39     if local_user_view.person.id != orig_private_message.creator_id {
40       return Err(LemmyErrorType::EditPrivateMessageNotAllowed)?;
41     }
42
43     // Doing the update
44     let content = sanitize_html(&data.content);
45     let content = remove_slurs(&content, &local_site_to_slur_regex(&local_site));
46     is_valid_body_field(&Some(content.clone()), false)?;
47
48     let private_message_id = data.private_message_id;
49     PrivateMessage::update(
50       &mut context.pool(),
51       private_message_id,
52       &PrivateMessageUpdateForm::builder()
53         .content(Some(content))
54         .updated(Some(Some(naive_now())))
55         .build(),
56     )
57     .await
58     .with_lemmy_type(LemmyErrorType::CouldntUpdatePrivateMessage)?;
59
60     let view = PrivateMessageView::read(&mut context.pool(), private_message_id).await?;
61
62     Ok(PrivateMessageResponse {
63       private_message_view: view,
64     })
65   }
66 }