]> Untitled Git - lemmy.git/blob - crates/api_crud/src/private_message/update.rs
4abf6f3ccf226632cd667818521c5ee0f5bbc959
[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},
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_slurs_removed = remove_slurs(&data.content, &local_site_to_slur_regex(&local_site));
45     is_valid_body_field(&Some(content_slurs_removed.clone()), false)?;
46
47     let private_message_id = data.private_message_id;
48     PrivateMessage::update(
49       &mut context.pool(),
50       private_message_id,
51       &PrivateMessageUpdateForm::builder()
52         .content(Some(content_slurs_removed))
53         .updated(Some(Some(naive_now())))
54         .build(),
55     )
56     .await
57     .with_lemmy_type(LemmyErrorType::CouldntUpdatePrivateMessage)?;
58
59     let view = PrivateMessageView::read(&mut context.pool(), private_message_id).await?;
60
61     Ok(PrivateMessageResponse {
62       private_message_view: view,
63     })
64   }
65 }