]> Untitled Git - lemmy.git/blob - crates/api_crud/src/private_message/create.rs
add enable_federated_downvotes site option
[lemmy.git] / crates / api_crud / src / private_message / create.rs
1 use activitypub_federation::config::Data;
2 use actix_web::web::Json;
3 use lemmy_api_common::{
4   context::LemmyContext,
5   private_message::{CreatePrivateMessage, PrivateMessageResponse},
6   send_activity::{ActivityChannel, SendActivityData},
7   utils::{
8     check_person_block,
9     generate_local_apub_endpoint,
10     get_interface_language,
11     local_site_to_slur_regex,
12     local_user_view_from_jwt,
13     sanitize_html,
14     send_email_to_user,
15     EndpointType,
16   },
17 };
18 use lemmy_db_schema::{
19   source::{
20     local_site::LocalSite,
21     private_message::{PrivateMessage, PrivateMessageInsertForm, PrivateMessageUpdateForm},
22   },
23   traits::Crud,
24 };
25 use lemmy_db_views::structs::{LocalUserView, PrivateMessageView};
26 use lemmy_utils::{
27   error::{LemmyError, LemmyErrorExt, LemmyErrorType},
28   utils::{slurs::remove_slurs, validation::is_valid_body_field},
29 };
30
31 #[tracing::instrument(skip(context))]
32 pub async fn create_private_message(
33   data: Json<CreatePrivateMessage>,
34   context: Data<LemmyContext>,
35 ) -> Result<Json<PrivateMessageResponse>, LemmyError> {
36   let local_user_view = local_user_view_from_jwt(&data.auth, &context).await?;
37   let local_site = LocalSite::read(&mut context.pool()).await?;
38
39   let content = sanitize_html(&data.content);
40   let content = remove_slurs(&content, &local_site_to_slur_regex(&local_site));
41   is_valid_body_field(&Some(content.clone()), false)?;
42
43   check_person_block(
44     local_user_view.person.id,
45     data.recipient_id,
46     &mut context.pool(),
47   )
48   .await?;
49
50   let private_message_form = PrivateMessageInsertForm::builder()
51     .content(content.clone())
52     .creator_id(local_user_view.person.id)
53     .recipient_id(data.recipient_id)
54     .build();
55
56   let inserted_private_message = PrivateMessage::create(&mut context.pool(), &private_message_form)
57     .await
58     .with_lemmy_type(LemmyErrorType::CouldntCreatePrivateMessage)?;
59
60   let inserted_private_message_id = inserted_private_message.id;
61   let protocol_and_hostname = context.settings().get_protocol_and_hostname();
62   let apub_id = generate_local_apub_endpoint(
63     EndpointType::PrivateMessage,
64     &inserted_private_message_id.to_string(),
65     &protocol_and_hostname,
66   )?;
67   PrivateMessage::update(
68     &mut context.pool(),
69     inserted_private_message.id,
70     &PrivateMessageUpdateForm {
71       ap_id: Some(apub_id),
72       ..Default::default()
73     },
74   )
75   .await
76   .with_lemmy_type(LemmyErrorType::CouldntCreatePrivateMessage)?;
77
78   let view = PrivateMessageView::read(&mut context.pool(), inserted_private_message.id).await?;
79
80   // Send email to the local recipient, if one exists
81   if view.recipient.local {
82     let recipient_id = data.recipient_id;
83     let local_recipient = LocalUserView::read_person(&mut context.pool(), recipient_id).await?;
84     let lang = get_interface_language(&local_recipient);
85     let inbox_link = format!("{}/inbox", context.settings().get_protocol_and_hostname());
86     let sender_name = &local_user_view.person.name;
87     send_email_to_user(
88       &local_recipient,
89       &lang.notification_private_message_subject(sender_name),
90       &lang.notification_private_message_body(inbox_link, &content, sender_name),
91       context.settings(),
92     )
93     .await;
94   }
95
96   ActivityChannel::submit_activity(
97     SendActivityData::CreatePrivateMessage(view.clone()),
98     &context,
99   )
100   .await?;
101
102   Ok(Json(PrivateMessageResponse {
103     private_message_view: view,
104   }))
105 }