]> Untitled Git - lemmy.git/blob - crates/api_crud/src/private_message/update.rs
Dont return error in case optional auth is invalid (#2879)
[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   websocket::UserOperationCrud,
8 };
9 use lemmy_db_schema::{
10   source::{
11     local_site::LocalSite,
12     private_message::{PrivateMessage, PrivateMessageUpdateForm},
13   },
14   traits::Crud,
15   utils::naive_now,
16 };
17 use lemmy_utils::{
18   error::LemmyError,
19   utils::{slurs::remove_slurs, validation::is_valid_body_field},
20   ConnectionId,
21 };
22
23 #[async_trait::async_trait(?Send)]
24 impl PerformCrud for EditPrivateMessage {
25   type Response = PrivateMessageResponse;
26
27   #[tracing::instrument(skip(self, context, websocket_id))]
28   async fn perform(
29     &self,
30     context: &Data<LemmyContext>,
31     websocket_id: Option<ConnectionId>,
32   ) -> Result<PrivateMessageResponse, LemmyError> {
33     let data: &EditPrivateMessage = self;
34     let local_user_view = local_user_view_from_jwt(&data.auth, context).await?;
35     let local_site = LocalSite::read(context.pool()).await?;
36
37     // Checking permissions
38     let private_message_id = data.private_message_id;
39     let orig_private_message = PrivateMessage::read(context.pool(), private_message_id).await?;
40     if local_user_view.person.id != orig_private_message.creator_id {
41       return Err(LemmyError::from_message("no_private_message_edit_allowed"));
42     }
43
44     // Doing the update
45     let content_slurs_removed = remove_slurs(&data.content, &local_site_to_slur_regex(&local_site));
46     is_valid_body_field(&Some(content_slurs_removed.clone()))?;
47
48     let private_message_id = data.private_message_id;
49     PrivateMessage::update(
50       context.pool(),
51       private_message_id,
52       &PrivateMessageUpdateForm::builder()
53         .content(Some(content_slurs_removed))
54         .updated(Some(Some(naive_now())))
55         .build(),
56     )
57     .await
58     .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_private_message"))?;
59
60     context
61       .send_pm_ws_message(
62         &UserOperationCrud::EditPrivateMessage,
63         data.private_message_id,
64         websocket_id,
65       )
66       .await
67   }
68 }