1 use activitypub_federation::config::Data;
2 use actix_web::web::Json;
3 use lemmy_api_common::{
5 private_message::{CreatePrivateMessage, PrivateMessageResponse},
6 send_activity::{ActivityChannel, SendActivityData},
9 generate_local_apub_endpoint,
10 get_interface_language,
11 local_site_to_slur_regex,
12 local_user_view_from_jwt,
18 use lemmy_db_schema::{
20 local_site::LocalSite,
21 private_message::{PrivateMessage, PrivateMessageInsertForm, PrivateMessageUpdateForm},
25 use lemmy_db_views::structs::{LocalUserView, PrivateMessageView};
27 error::{LemmyError, LemmyErrorExt, LemmyErrorType},
28 utils::{slurs::remove_slurs, validation::is_valid_body_field},
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?;
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)?;
44 local_user_view.person.id,
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)
56 let inserted_private_message = PrivateMessage::create(&mut context.pool(), &private_message_form)
58 .with_lemmy_type(LemmyErrorType::CouldntCreatePrivateMessage)?;
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,
67 PrivateMessage::update(
69 inserted_private_message.id,
70 &PrivateMessageUpdateForm {
76 .with_lemmy_type(LemmyErrorType::CouldntCreatePrivateMessage)?;
78 let view = PrivateMessageView::read(&mut context.pool(), inserted_private_message.id).await?;
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;
89 &lang.notification_private_message_subject(sender_name),
90 &lang.notification_private_message_body(inbox_link, &content, sender_name),
96 ActivityChannel::submit_activity(
97 SendActivityData::CreatePrivateMessage(view.clone()),
102 Ok(Json(PrivateMessageResponse {
103 private_message_view: view,